diff options
41 files changed, 923 insertions, 1909 deletions
diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml index 0f66928f..61ea11bf 100755 --- a/org.fox.ttrss/src/main/AndroidManifest.xml +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -10,24 +10,17 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:name=".Application" android:allowBackup="true" - android:backupAgent=".util.PrefsBackupAgent" - android:fullBackupOnly="true" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" > - <!-- <meta-data android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule" - tools:node="remove" /> --> <meta-data android:name="org.fox.ttrss.glide.OkHttpProgressGlideModule" android:value="GlideModule" /> @@ -196,10 +189,6 @@ </intent-filter> </activity> - <meta-data - android:name="com.google.android.backup.api_key" - android:value="AEdPqrEAAAAIwG6zsGB4qo6ZhjfwIJpm9WI7AqmWaoRXm6ZJnA" /> - <receiver android:name=".util.DeviceBootReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java index 9fd0623a..75963c96 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java @@ -6,10 +6,10 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.preference.PreferenceManager; import android.util.Log; import androidx.annotation.NonNull; +import androidx.preference.PreferenceManager; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -126,7 +126,7 @@ public class ApiCommon { String httpLogin = m_prefs.getString("http_login", "").trim(); String httpPassword = m_prefs.getString("http_password", "").trim(); - if (httpLogin.length() > 0) { + if (!httpLogin.isEmpty()) { if (m_transportDebugging) Log.d(TAG, "Using HTTP Basic authentication."); requestBuilder.addHeader("Authorization", Credentials.basic(httpLogin, httpPassword)); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java index 18eedee1..259d7a28 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java @@ -13,14 +13,14 @@ import java.util.HashMap; public class ApiLoader extends AsyncTaskLoader<JsonElement> implements ApiCommon.ApiCaller { private final String TAG = this.getClass().getSimpleName(); - private int m_responseCode = 0; + private final int m_responseCode = 0; protected String m_responseMessage; private int m_apiStatusCode = 0; - private Context m_context; + private final Context m_context; private String m_lastErrorMessage; private ApiError m_lastError; - private HashMap<String,String> m_params; + private final HashMap<String,String> m_params; private JsonElement m_data; ApiLoader(Context context, HashMap<String, String> params) { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java index e6c323e9..409047f0 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java @@ -11,13 +11,10 @@ import com.google.gson.JsonElement; import java.util.HashMap; public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonElement> implements ApiCommon.ApiCaller { - private final String TAG = this.getClass().getSimpleName(); - private boolean m_transportDebugging = false; - private int m_responseCode = 0; private int m_apiStatusCode = 0; - private Context m_context; + private final Context m_context; protected String m_lastErrorMessage; protected ApiError m_lastError; diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java index 5d82618a..b872d034 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java @@ -10,19 +10,27 @@ import java.util.LinkedHashMap; public class Application extends android.app.Application { private static Application m_singleton; - - public ArticleList tmpArticleList; - public Article tmpArticle; + + // this is the only instance of a (large) object which contains all currently loaded articles and is + // used by all fragments and activities concurrently + private final ArticleList m_articles = new ArticleList(); + + // we use this to pass a large temporary object between activities + public Article tmpActiveArticle; public int m_selectedArticleId; public String m_sessionId; public int m_apiLevel; - public LinkedHashMap<String, String> m_customSortModes = new LinkedHashMap<String, String>(); + public LinkedHashMap<String, String> m_customSortModes = new LinkedHashMap<>(); public static Application getInstance(){ return m_singleton; } - + + public static ArticleList getArticles() { + return getInstance().m_articles; + } + @Override public final void onCreate() { super.onCreate(); @@ -39,7 +47,8 @@ public class Application extends android.app.Application { out.putSerializable("gs:customSortTypes", m_customSortModes); } - public void load(Bundle in) { + /** @noinspection unchecked*/ + public void load(Bundle in) { if (in != null) { m_sessionId = in.getString("gs:sessionId"); m_apiLevel = in.getInt("gs:apiLevel"); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java index 2b2bf090..3ee42976 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java @@ -6,14 +6,12 @@ import android.content.SharedPreferences; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.WebBackForwardList; import android.webkit.WebSettings; @@ -23,11 +21,11 @@ import android.webkit.WebViewClient; import android.widget.TextView; import androidx.core.text.HtmlCompat; - -import com.google.android.material.button.MaterialButton; +import androidx.preference.PreferenceManager; import org.fox.ttrss.types.Article; import org.fox.ttrss.types.Attachment; +import org.jsoup.helper.StringUtil; import java.net.MalformedURLException; import java.net.URL; @@ -58,7 +56,7 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { if (v.getId() == R.id.article_content) { HitTestResult result = ((WebView)v).getHitTestResult(); - if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) { + if (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { menu.setHeaderTitle(result.getExtra()); getActivity().getMenuInflater().inflate(R.menu.content_gallery_entry, menu); @@ -100,17 +98,6 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { m_activity.finish(); } - /* if (m_article.id == HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED) { - TextView statusMessage = (TextView) view.findViewById(R.id.article_status_message); - statusMessage.setText(R.string.headlines_row_top_changed); - statusMessage.setVisibility(View.VISIBLE); - - view.findViewById(R.id.article_scrollview).setVisibility(View.GONE); - view.findViewById(R.id.article_fab).setVisibility(View.GONE); - - return view; - } */ - m_articleFontSize = m_prefs.getInt("article_font_size_sp_int", 16); m_articleSmallFontSize = Math.max(10, Math.min(18, m_articleFontSize - 2)); @@ -129,15 +116,12 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { title.setText(HtmlCompat.fromHtml(titleStr, HtmlCompat.FROM_HTML_MODE_LEGACY)); //title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); - title.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - try { - m_activity.openUri(Uri.parse(m_article.link)); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } + title.setOnClickListener(v -> { + try { + m_activity.openUri(Uri.parse(m_article.link)); + } catch (Exception e) { + e.printStackTrace(); + m_activity.toast(R.string.error_other_error); } }); @@ -152,18 +136,15 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { String commentsTitle = getResources().getQuantityString(R.plurals.article_comments, m_article.comments_count, m_article.comments_count); comments.setText(commentsTitle); //comments.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); - comments.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - try { - String url = (m_article.comments_link != null && m_article.comments_link.length() > 0) ? - m_article.comments_link : m_article.link; - - m_activity.openUri(Uri.parse(url)); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } + comments.setOnClickListener(v -> { + try { + String url = (m_article.comments_link != null && !m_article.comments_link.isEmpty()) ? + m_article.comments_link : m_article.link; + + m_activity.openUri(Uri.parse(url)); + } catch (Exception e) { + e.printStackTrace(); + m_activity.toast(R.string.error_other_error); } }); @@ -176,7 +157,7 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { View noteContainer = view.findViewById(R.id.note_container); if (note != null && noteContainer != null) { - if (m_article.note != null && m_article.note.length() > 0) { + if (m_article.note != null && !m_article.note.isEmpty()) { note.setTextSize(TypedValue.COMPLEX_UNIT_SP, m_articleSmallFontSize); note.setText(m_article.note); noteContainer.setVisibility(View.VISIBLE); @@ -184,12 +165,7 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { noteContainer.setVisibility(View.GONE); } - note.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - m_activity.editArticleNote(m_article); - } - }); + note.setOnClickListener(view1 -> m_activity.editArticleNote(m_article)); } TextView dv = view.findViewById(R.id.date); @@ -215,20 +191,13 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { if (m_article.feed_title != null) { String fTitle = m_article.feed_title; - if (m_article.author != null && m_article.author.length() > 0) { + if (m_article.author != null && !m_article.author.isEmpty()) { fTitle += " (" + getString(R.string.author_formatted, m_article.author) + ")"; } tagv.setText(fTitle); } else if (m_article.tags != null) { - String tagsStr = ""; - - for (String tag : m_article.tags) - tagsStr += tag + ", "; - - tagsStr = tagsStr.replaceAll(", $", ""); - - tagv.setText(tagsStr); + tagv.setText(StringUtil.join(m_article.tags, ", ")); } else { tagv.setVisibility(View.GONE); } @@ -251,19 +220,16 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { return false; } }); - m_web.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - HitTestResult result = ((WebView)v).getHitTestResult(); - - if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) { - registerForContextMenu(m_web); - m_activity.openContextMenu(m_web); - unregisterForContextMenu(m_web); - return true; - } else { - return false; - } + m_web.setOnLongClickListener(v -> { + HitTestResult result = ((WebView)v).getHitTestResult(); + + if (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { + registerForContextMenu(m_web); + m_activity.openContextMenu(m_web); + unregisterForContextMenu(m_web); + return true; + } else { + return false; } }); @@ -272,23 +238,6 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { return view; } - private void setScoreImage(MaterialButton scoreView, int score) { - TypedValue tv = new TypedValue(); - int scoreAttr = R.attr.ic_action_trending_flat; - - if (m_article.score > 0) - scoreAttr = R.attr.ic_action_trending_up; - else if (m_article.score < 0) - scoreAttr = R.attr.ic_action_trending_down; - - m_activity.getTheme().resolveAttribute(scoreAttr, tv, true); - - scoreView.setIconResource(tv.resourceId); - - TypedValue tvPrimary = new TypedValue(); - m_activity.getTheme().resolveAttribute(R.attr.colorPrimary, tvPrimary, true); - } - protected void renderContent(Bundle savedInstanceState) { if (!isAdded() || m_web == null) return; @@ -345,14 +294,14 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { content.append(articleContent); - if (m_article.attachments != null && m_article.attachments.size() != 0) { + if (m_article.attachments != null && !m_article.attachments.isEmpty()) { String flatContent = articleContent.replaceAll("[\r\n]", ""); boolean hasImages = flatContent.matches(".*?<img[^>+].*?"); for (Attachment a : m_article.attachments) { if (a.content_type != null && a.content_url != null) { try { - if (a.content_type.indexOf("image") != -1 && + if (a.content_type.contains("image") && (!hasImages || m_article.always_display_attachments)) { URL url = new URL(a.content_url.trim()); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java index 445f94bb..5bef0dd2 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java @@ -6,14 +6,15 @@ import android.content.SharedPreferences; import android.os.BadParcelableException; import android.os.Bundle; import android.os.Handler; -import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; @@ -22,7 +23,6 @@ import com.google.android.material.snackbar.Snackbar; import com.google.gson.JsonElement; import org.fox.ttrss.types.Article; -import org.fox.ttrss.types.ArticleList; import org.fox.ttrss.types.Feed; import org.fox.ttrss.util.HeadlinesRequest; @@ -31,10 +31,9 @@ import java.util.HashMap; public class ArticlePager extends androidx.fragment.app.Fragment { private final String TAG = "ArticlePager"; - private RecyclerView.Adapter m_adapter; + private PagerAdapter m_adapter; private HeadlinesEventListener m_listener; protected Article m_article; - protected ArticleList m_articles = new ArticleList(); //m_articles = Application.getInstance().m_loadedArticles; private OnlineActivity m_activity; private String m_searchQuery = ""; protected Feed m_feed; @@ -44,18 +43,17 @@ public class ArticlePager extends androidx.fragment.app.Fragment { private boolean m_lazyLoadDisabled; private ViewPager2 m_pager; - private class PagerAdapter extends FragmentStateAdapter { + private static class PagerAdapter extends FragmentStateAdapter { public PagerAdapter(FragmentActivity fa) { super(fa); } - private ArticleFragment m_currentFragment; - @Override + @NonNull public Fragment createFragment(int position) { try { - Article article = m_articles.get(position); + Article article = Application.getArticles().get(position); if (article != null) { ArticleFragment af = new ArticleFragment(); @@ -72,19 +70,14 @@ public class ArticlePager extends androidx.fragment.app.Fragment { @Override public int getItemCount() { - return m_articles.size(); + return Application.getArticles().size(); } - public ArticleFragment getCurrentFragment() { - return m_currentFragment; - } - } - public void initialize(Article article, Feed feed, ArticleList articles) { + public void initialize(Article article, Feed feed) { m_article = article; m_feed = feed; - m_articles = articles; } public void setSearchQuery(String searchQuery) { @@ -96,7 +89,6 @@ public class ArticlePager extends androidx.fragment.app.Fragment { super.onSaveInstanceState(out); out.putParcelable("m_article", m_article); - //out.putParcelable("m_articles", m_articles); out.putParcelable("m_feed", m_feed); out.putInt("m_firstId", m_firstId); } @@ -118,17 +110,11 @@ public class ArticlePager extends androidx.fragment.app.Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_article_pager, container, false); - if (savedInstanceState != null) { - if (m_activity instanceof DetailActivity) { - m_articles = ((DetailActivity)m_activity).m_articles; - } - } - m_adapter = new PagerAdapter(getActivity()); m_pager = view.findViewById(R.id.article_pager); - int position = m_articles.indexOf(m_article); + int position = Application.getArticles().indexOf(m_article); m_listener.onArticleSelected(m_article, false); @@ -141,29 +127,19 @@ public class ArticlePager extends androidx.fragment.app.Fragment { public void onPageSelected(int position) { Log.d(TAG, "onPageSelected: " + position); - final Article article = m_articles.get(position); + final Article article = Application.getArticles().get(position); if (article != null) { m_article = article; - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - m_listener.onArticleSelected(article, false); - } - }, 250); + new Handler().postDelayed(() -> m_listener.onArticleSelected(article, false), 250); //Log.d(TAG, "Page #" + position + "/" + m_adapter.getCount()); if (!m_refreshInProgress && !m_lazyLoadDisabled && (m_activity.isSmallScreen() || m_activity.isPortrait()) && position >= m_adapter.getItemCount() - 5) { Log.d(TAG, "loading more articles..."); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refresh(true); - } - }, 100); + new Handler().postDelayed(() -> refresh(true), 100); } } } @@ -172,7 +148,6 @@ public class ArticlePager extends androidx.fragment.app.Fragment { return view; } - @SuppressWarnings({ "serial" }) protected void refresh(final boolean append) { if (!append) { @@ -181,19 +156,14 @@ public class ArticlePager extends androidx.fragment.app.Fragment { m_refreshInProgress = true; - @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, m_articles) { - @Override - protected void onProgressUpdate(Integer... progress) { - m_activity.setProgress(progress[0] / progress[1] * 10000); - } - + @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, Application.getArticles()) { @Override protected void onPostExecute(JsonElement result) { if (isDetached() || !isAdded()) return; if (!append) { m_pager.setCurrentItem(0, false); - m_articles.clear(); + Application.getArticles().clear(); } super.onPostExecute(result); @@ -210,15 +180,10 @@ public class ArticlePager extends androidx.fragment.app.Fragment { //m_activity.toast(R.string.headlines_row_top_changed); Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) - .setAction(R.string.reload, new View.OnClickListener() { - @Override - public void onClick(View v) { - refresh(false); - } - }).show(); + .setAction(R.string.reload, v -> refresh(false)).show(); } - if (m_amountLoaded < Integer.valueOf(m_prefs.getString("headlines_request_size", "15"))) { + if (m_amountLoaded < Integer.parseInt(m_prefs.getString("headlines_request_size", "15"))) { m_lazyLoadDisabled = true; } @@ -234,9 +199,9 @@ public class ArticlePager extends androidx.fragment.app.Fragment { } if (m_article != null) { - if (m_article.id == 0 || !m_articles.containsId(m_article.id)) { - if (m_articles.size() > 0) { - m_article = m_articles.get(0); + if (m_article.id == 0 || !Application.getArticles().containsId(m_article.id)) { + if (!Application.getArticles().isEmpty()) { + m_article = Application.getArticles().get(0); m_listener.onArticleSelected(m_article, false); } } @@ -264,9 +229,9 @@ public class ArticlePager extends androidx.fragment.app.Fragment { // adaptive, all_articles, marked, published, unread String viewMode = m_activity.getViewMode(); int numUnread = 0; - int numAll = m_articles.size(); + int numAll = Application.getArticles().size(); - for (Article a : m_articles) { + for (Article a : Application.getArticles()) { if (a.unread) ++numUnread; } @@ -276,7 +241,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { skip = numAll; } else if ("unread".equals(viewMode)) { skip = numUnread; - } else if (m_searchQuery != null && m_searchQuery.length() > 0) { + } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { skip = numAll; } else if ("adaptive".equals(viewMode)) { skip = numUnread > 0 ? numUnread : numAll; @@ -289,7 +254,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { req.setOffset(skip); - HashMap<String,String> map = new HashMap<String, String>(); + HashMap<String,String> map = new HashMap<>(); map.put("op", "getHeadlines"); map.put("sid", sessionId); map.put("feed_id", String.valueOf(feed.id)); @@ -307,7 +272,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { if (feed.is_cat) map.put("is_cat", "true"); - if (m_searchQuery != null && m_searchQuery.length() != 0) { + if (m_searchQuery != null && !m_searchQuery.isEmpty()) { map.put("search", m_searchQuery); map.put("search_mode", ""); map.put("match_on", "both"); @@ -325,13 +290,13 @@ public class ArticlePager extends androidx.fragment.app.Fragment { } } - Log.d(TAG, "[AP] request more headlines, firstId=" + m_firstId); + Log.d(TAG, "[AP] request more headlines, firstId=" + m_firstId); req.execute(map); } @Override - public void onAttach(Activity activity) { + public void onAttach(@NonNull Activity activity) { super.onAttach(activity); m_listener = (HeadlinesEventListener)activity; @@ -358,15 +323,15 @@ public class ArticlePager extends androidx.fragment.app.Fragment { if (m_article != article) { m_article = article; - int position = m_articles.indexOf(m_article); + int position = Application.getArticles().indexOf(m_article); - m_pager.setCurrentItem(position); + m_pager.setCurrentItem(position, false); } } public void selectArticle(boolean next) { if (m_article != null) { - int position = m_articles.indexOf(m_article); + int position = Application.getArticles().indexOf(m_article); if (next) position++; @@ -374,7 +339,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { position--; try { - Article tmp = m_articles.get(position); + Article tmp = Application.getArticles().get(position); if (tmp != null) { setActiveArticle(tmp); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java index 06f18667..86a31465 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java @@ -5,7 +5,6 @@ import android.content.SharedPreferences; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; -import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; @@ -35,18 +34,15 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen View settings = view.findViewById(R.id.drawer_settings_btn); - settings.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - try { - Intent intent = new Intent(getActivity(), - PreferencesActivity.class); + settings.setOnClickListener(v -> { + try { + Intent intent = new Intent(getActivity(), + PreferencesActivity.class); - startActivityForResult(intent, 0); + startActivityForResult(intent, 0); - } catch (Exception e) { - e.printStackTrace(); - } + } catch (Exception e) { + e.printStackTrace(); } }); @@ -54,11 +50,8 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen // divider final View footer = inflater.inflate(R.layout.drawer_divider, list, false); - footer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // - } + footer.setOnClickListener(v -> { + // }); list.addFooterView(footer); @@ -76,20 +69,12 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen final SwitchCompat rowSwitch = rowToggle.findViewById(R.id.row_switch); rowSwitch.setChecked(activity.getUnreadOnly()); - rowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton button, boolean isChecked) { - activity.setUnreadOnly(isChecked); - refresh(); - } + rowSwitch.setOnCheckedChangeListener((button, isChecked) -> { + activity.setUnreadOnly(isChecked); + refresh(); }); - footer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - rowSwitch.setChecked(!rowSwitch.isChecked()); - } - }); + footer.setOnClickListener(v -> rowSwitch.setChecked(!rowSwitch.isChecked())); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java index d93a52d3..cdc261b7 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java @@ -9,13 +9,10 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.content.res.Configuration; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; @@ -24,7 +21,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.SystemClock; -import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; @@ -42,6 +38,7 @@ import androidx.browser.customtabs.CustomTabsServiceConnection; import androidx.browser.customtabs.CustomTabsSession; import androidx.core.app.JobIntentService; import androidx.core.content.FileProvider; +import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; @@ -50,7 +47,6 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.snackbar.Snackbar; -import org.fox.ttrss.util.DatabaseHelper; import org.fox.ttrss.widget.SmallWidgetProvider; import org.fox.ttrss.widget.WidgetUpdateService; import org.jsoup.Jsoup; @@ -83,11 +79,6 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc public static final int PENDING_INTENT_CHROME_SHARE = 1; - private DatabaseHelper m_databaseHelper; - - //private SQLiteDatabase m_readableDb; - //private SQLiteDatabase m_writableDb; - private boolean m_smallScreenMode = true; protected String m_theme; private boolean m_needRestart; @@ -169,14 +160,6 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc m_smallScreenMode = smallScreen; } - public DatabaseHelper getDatabaseHelper() { - return m_databaseHelper; - } - - public SQLiteDatabase getDatabase() { - return m_databaseHelper.getWritableDatabase(); - } - public boolean getUnreadOnly() { return m_prefs.getBoolean("show_unread_only", true); } @@ -198,12 +181,9 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc public void toast(String msg) { Snackbar.make(findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG) - .setAction(R.string.dialog_close, new View.OnClickListener() { - @Override - public void onClick(View v) { + .setAction(R.string.dialog_close, v -> { - } - }) + }) .show(); } @@ -253,8 +233,6 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc nmgr.createNotificationChannel(channel); } - m_databaseHelper = DatabaseHelper.getInstance(this); - m_prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); @@ -302,34 +280,16 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc @SuppressLint({ "NewApi", "ServiceCast" }) @SuppressWarnings("deprecation") public void copyToClipboard(String str) { - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - clipboard.setText(str); - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - clipboard.setText(str); - } + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + clipboard.setText(str); - Snackbar.make(findViewById(android.R.id.content), R.string.text_copied_to_clipboard, Snackbar.LENGTH_SHORT) - .setAction(R.string.dialog_close, new View.OnClickListener() { - @Override - public void onClick(View v) { + Snackbar.make(findViewById(android.R.id.content), R.string.text_copied_to_clipboard, Snackbar.LENGTH_SHORT) + .setAction(R.string.dialog_close, v -> { - } - }) + }) .show(); } - public boolean isUiNightMode() { - try { - int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; - - return Configuration.UI_MODE_NIGHT_YES == nightModeFlags; - } catch (Exception e) { - return false; - } - } - protected void setAppTheme(SharedPreferences prefs) { String theme = prefs.getString("theme", CommonActivity.THEME_DEFAULT); @@ -358,7 +318,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc "headlines_swipe_to_dismiss", "headlines_mark_read_scroll", "headlines_request_size", "force_phone_layout", "open_on_startup"}; - m_needRestart = Arrays.asList(filter).indexOf(key) != -1; + m_needRestart = Arrays.asList(filter).contains(key); } private CustomTabsSession getCustomTabSession() { @@ -487,7 +447,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc if (uri.getScheme() == null) { try { - uri = Uri.parse("https:" + uri.toString()); + uri = Uri.parse("https:" + uri); } catch (Exception e) { e.printStackTrace(); } @@ -508,43 +468,37 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc .setView(dialogView) .setMessage(uri.toString()) .setPositiveButton(R.string.quick_preview, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - if (!askEveryTimeCB.isChecked()) { - SharedPreferences.Editor editor = m_prefs.edit(); - editor.putBoolean("custom_tabs_ask_always", false); - editor.apply(); - } + if (!askEveryTimeCB.isChecked()) { + SharedPreferences.Editor editor = m_prefs.edit(); + editor.putBoolean("custom_tabs_ask_always", false); + editor.apply(); + } - openUriWithCustomTab(finalUri); + openUriWithCustomTab(finalUri); - } - }) + }) .setNegativeButton(R.string.open_with, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - if (!askEveryTimeCB.isChecked()) { - SharedPreferences.Editor editor = m_prefs.edit(); - editor.putBoolean("custom_tabs_ask_always", false); - editor.putBoolean("enable_custom_tabs", false); - editor.apply(); - } - - Intent intent = new Intent(Intent.ACTION_VIEW, finalUri); - - try { - startActivity(intent); - } catch (Exception e) { - e.printStackTrace(); - toast(e.getMessage()); - } + (dialog, which) -> { - } - }); + if (!askEveryTimeCB.isChecked()) { + SharedPreferences.Editor editor = m_prefs.edit(); + editor.putBoolean("custom_tabs_ask_always", false); + editor.putBoolean("enable_custom_tabs", false); + editor.apply(); + } + + Intent intent = new Intent(Intent.ACTION_VIEW, finalUri); + + try { + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + toast(e.getMessage()); + } + + }); /*.setNegativeButton(R.string.cancel, new Dialog.OnClickListener() { public void onClick(DialogInterface dialog, @@ -608,19 +562,14 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc // the wrong text if an image is used multiple times. Document doc = Jsoup.parse(htmlContent); Elements es = doc.getElementsByAttributeValue("src", url); - if (es.size() > 0) { + if (!es.isEmpty()) { if (es.get(0).hasAttr("title")) { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setCancelable(true) .setMessage(es.get(0).attr("title")) - .setPositiveButton(R.string.dialog_close, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - } - ); + .setPositiveButton(R.string.dialog_close, (dialog, which) -> dialog.cancel() + ); Dialog dialog = builder.create(); dialog.show(); @@ -653,8 +602,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc static public int dpToPx(Context context, int dp) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); - int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); - return px; + return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java index ecde9d51..78dad5e3 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java @@ -8,7 +8,6 @@ import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -16,6 +15,7 @@ import android.view.View; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentTransaction; +import androidx.preference.PreferenceManager; import com.google.android.material.bottomappbar.BottomAppBar; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -26,7 +26,6 @@ import org.fox.ttrss.types.Feed; public class DetailActivity extends OnlineActivity implements HeadlinesEventListener { private final String TAG = this.getClass().getSimpleName(); - protected ArticleList m_articles = new ArticleList(); protected BottomAppBar m_bottomAppBar; protected SharedPreferences m_prefs; @@ -40,11 +39,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList setAppTheme(m_prefs); - super.onCreate(savedInstanceState); - - if (savedInstanceState != null) { - m_articles = savedInstanceState.getParcelable("m_articles"); - } + super.onCreate(savedInstanceState); if (m_prefs.getBoolean("force_phone_layout", false)) { setContentView(R.layout.activity_detail_phone); @@ -74,47 +69,44 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList m_bottomAppBar = findViewById(R.id.detail_bottom_appbar); if (m_bottomAppBar != null) { - m_bottomAppBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { + m_bottomAppBar.setOnMenuItemClickListener(item -> { - final ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); - final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + final ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - Article article = ap.getSelectedArticle(); + Article article = ap.getSelectedArticle(); - if (article == null) return false; + if (article == null) return false; - int itemId = item.getItemId(); + int itemId = item.getItemId(); - if (itemId == R.id.article_set_labels) { - editArticleLabels(article); + if (itemId == R.id.article_set_labels) { + editArticleLabels(article); - return true; - } else if (itemId == R.id.toggle_attachments) { - displayAttachments(article); + return true; + } else if (itemId == R.id.toggle_attachments) { + displayAttachments(article); - return true; - } else if (itemId == R.id.article_edit_note) { - editArticleNote(article); + return true; + } else if (itemId == R.id.article_edit_note) { + editArticleNote(article); - return true; - } else if (itemId == R.id.article_set_score) { - setArticleScore(article); + return true; + } else if (itemId == R.id.article_set_score) { + setArticleScore(article); - return true; - } else if (itemId == R.id.toggle_unread) { - article.unread = !article.unread; - saveArticleUnread(article); + return true; + } else if (itemId == R.id.toggle_unread) { + article.unread = !article.unread; + saveArticleUnread(article); - if (hf != null) { - hf.notifyUpdated(); - } - } + if (hf != null) { + hf.notifyUpdated(); + } + } - return false; - } - }); + return false; + }); } FloatingActionButton fab = findViewById(R.id.detail_fab); @@ -123,14 +115,11 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (m_prefs.getBoolean("enable_article_fab", true)) { fab.show(); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (m_activeArticle != null) { - openUri(Uri.parse(m_activeArticle.link)); - } - } - }); + fab.setOnClickListener(view -> { + if (m_activeArticle != null) { + openUri(Uri.parse(m_activeArticle.link)); + } + }); } else { fab.hide(); } @@ -152,35 +141,25 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList String feedTitle = i.getStringExtra("feed_title"); tmpFeed = new Feed(feedId, feedTitle, isCat); - - //Application.getInstance().m_loadedArticles.clear(); } else { tmpFeed = i.getParcelableExtra("feed"); } final Feed feed = tmpFeed; - //final Article article = i.getParcelableExtra("article"); - final Article article = Application.getInstance().tmpArticle; + final Article article = Application.getInstance().tmpActiveArticle; final String searchQuery = i.getStringExtra("searchQuery"); - ArticleList tmp = Application.getInstance().tmpArticleList; - - if (tmp != null) { - m_articles.clear(); - m_articles.addAll(tmp); - } - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); final HeadlinesFragment hf = new HeadlinesFragment(); - hf.initialize(feed, article, true, m_articles); + hf.initialize(feed, article, true); hf.setSearchQuery(searchQuery); ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); ArticlePager af = new ArticlePager(); - af.initialize(article != null ? hf.getArticleById(article.id) : new Article(), feed, m_articles); + af.initialize(article != null ? hf.getArticleById(article.id) : new Article(), feed); af.setSearchQuery(searchQuery); ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); @@ -226,7 +205,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList menu.findItem(R.id.toggle_unread).setIcon(article.unread ? R.drawable.baseline_mark_email_unread_24 : R.drawable.baseline_email_24); - menu.findItem(R.id.toggle_attachments).setVisible(article.attachments != null && article.attachments.size() > 0); + menu.findItem(R.id.toggle_attachments).setVisible(article.attachments != null && !article.attachments.isEmpty()); } } } @@ -262,8 +241,6 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); - out.putParcelable("m_articles", m_articles); - Application.getInstance().save(out); } @@ -330,16 +307,13 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (open) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - ArticlePager af = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); - - if (af != null) { - af.setActiveArticle(article); - } - } - }, 250); + new Handler().postDelayed(() -> { +ArticlePager af = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + + if (af != null) { + af.setActiveArticle(article); + } + }, 250); } else { HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); @@ -355,13 +329,6 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList invalidateOptionsMenu(); } - public void showSidebar(boolean show) { - if (!isSmallScreen() && !isPortrait()) { - findViewById(R.id.headlines_fragment).setVisibility(show ? View.VISIBLE : View.GONE); - invalidateOptionsMenu(); - } - } - @Override public void onHeadlinesLoaded(boolean appended) { HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); @@ -374,7 +341,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (hf != null) { Article article = hf.getActiveArticle(); - if (article == null && hf.getAllArticles().size() > 0) { + if (article == null && !hf.getAllArticles().isEmpty()) { article = hf.getAllArticles().get(0); @@ -384,7 +351,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList .beginTransaction(); ArticlePager af = new ArticlePager(); - af.initialize(article, hf.getFeed(), m_articles); + af.initialize(article, hf.getFeed()); ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); ft.commitAllowingStateLoss(); @@ -396,8 +363,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList public void onBackPressed() { Intent resultIntent = new Intent(); - Application.getInstance().tmpArticleList = m_articles; - resultIntent.putExtra("activeArticle", m_activeArticle); + Application.getInstance().tmpActiveArticle = m_activeArticle; setResult(Activity.RESULT_OK, resultIntent); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java index b805ee6a..df398624 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java @@ -5,9 +5,7 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; @@ -26,6 +24,7 @@ import android.widget.TextView; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; +import androidx.preference.PreferenceManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.gson.Gson; @@ -39,7 +38,6 @@ import org.fox.ttrss.types.FeedCategoryList; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -48,7 +46,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt LoaderManager.LoaderCallbacks<JsonElement> { private final String TAG = this.getClass().getSimpleName(); private FeedCategoryListAdapter m_adapter; - private FeedCategoryList m_cats = new FeedCategoryList(); + private final FeedCategoryList m_cats = new FeedCategoryList(); FeedCategory m_selectedCat; private MasterActivity m_activity; private SwipeRefreshLayout m_swipeLayout; @@ -60,8 +58,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt final String sessionId = m_activity.getSessionId(); final boolean unreadOnly = m_activity.getUnreadOnly(); - @SuppressWarnings("serial") - HashMap<String, String> params = new HashMap<String, String>(); + HashMap<String, String> params = new HashMap<>(); params.put("op", "getCategories"); params.put("sid", sessionId); params.put("enable_nested", "true"); @@ -101,9 +98,10 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt } for (FeedCategory c : cats) { - if (c.id == -1) { - specialCatFound = true; - } + if (c.id == -1) { + specialCatFound = true; + break; + } } m_cats.addAll(cats); @@ -151,7 +149,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt } try { - Collections.sort(m_cats, cmp); + m_cats.sort(cmp); } catch (IllegalArgumentException e) { e.printStackTrace(); } @@ -218,40 +216,25 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt int itemId = item.getItemId(); if (itemId == R.id.browse_headlines) { - if (true) { - FeedCategory cat = getCategoryAtPosition(info.position); - if (cat != null) { - m_activity.onCatSelected(cat, true); - //setSelectedCategory(cat); - } - } + FeedCategory cat = getCategoryAtPosition(info.position); + if (cat != null) { + m_activity.onCatSelected(cat, true); + //setSelectedCategory(cat); + } return true; } else if (itemId == R.id.browse_feeds) { - if (true) { - FeedCategory cat = getCategoryAtPosition(info.position); - if (cat != null) { - m_activity.onCatSelected(cat, false); - //cf.setSelectedCategory(cat); - } - } - return true; - } else if (itemId == R.id.create_shortcut) { - if (true) { - FeedCategory cat = getCategoryAtPosition(info.position); - if (cat != null) { - m_activity.createCategoryShortcut(cat); - //cf.setSelectedCategory(cat); - } - } + FeedCategory cat = getCategoryAtPosition(info.position); + if (cat != null) { + m_activity.onCatSelected(cat, false); + //cf.setSelectedCategory(cat); + } return true; } else if (itemId == R.id.catchup_category) { - if (true) { - final FeedCategory cat = getCategoryAtPosition(info.position); + final FeedCategory cat = getCategoryAtPosition(info.position); - if (cat != null) { - m_activity.catchupDialog(new Feed(cat.id, cat.title, true)); - } - } + if (cat != null) { + m_activity.catchupDialog(new Feed(cat.id, cat.title, true)); + } return true; } Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); @@ -270,10 +253,6 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt if (cat != null) menu.setHeaderTitle(cat.title); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - menu.findItem(R.id.create_shortcut).setVisible(false); - } - super.onCreateContextMenu(menu, v, menuInfo); } @@ -304,12 +283,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt m_swipeLayout = view.findViewById(R.id.feeds_swipe_container); - m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(); - } - }); + m_swipeLayout.setOnRefreshListener(this::refresh); m_list = view.findViewById(R.id.feeds); m_adapter = new FeedCategoryListAdapter(getActivity(), R.layout.feeds_row, m_cats); @@ -338,7 +312,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt public void onResume() { super.onResume(); - getLoaderManager().initLoader(0, null, this).forceLoad(); + LoaderManager.getInstance(this).initLoader(0, null, this).forceLoad(); m_activity.invalidateOptionsMenu(); } @@ -350,11 +324,11 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt m_swipeLayout.setRefreshing(true); } - getLoaderManager().restartLoader(0, null, this).forceLoad(); + LoaderManager.getInstance(this).restartLoader(0, null, this).forceLoad(); } private class FeedCategoryListAdapter extends ArrayAdapter<FeedCategory> { - private ArrayList<FeedCategory> items; + private final ArrayList<FeedCategory> items; public static final int VIEW_NORMAL = 0; public static final int VIEW_SELECTED = 1; @@ -389,12 +363,10 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt if (v == null) { int layoutId = R.layout.feeds_row; - - switch (getItemViewType(position)) { - case VIEW_SELECTED: - layoutId = R.layout.feeds_row_selected; - break; - } + + if (getItemViewType(position) == VIEW_SELECTED) { + layoutId = R.layout.feeds_row_selected; + } LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(layoutId, null); @@ -423,19 +395,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt tu.setText(String.valueOf(cat.unread)); tu.setVisibility((cat.unread > 0) ? View.VISIBLE : View.INVISIBLE); } - - /*ImageButton ib = (ImageButton) v.findViewById(R.id.feed_menu_button); - - if (ib != null) { - ib.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - getActivity().openContextMenu(v); - } - }); - } */ - return v; } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java index 1a038456..c936385b 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java @@ -4,13 +4,10 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.Typeface; -import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; @@ -18,7 +15,6 @@ import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; @@ -30,6 +26,7 @@ import android.widget.TextView; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; +import androidx.preference.PreferenceManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -44,7 +41,6 @@ import org.fox.ttrss.types.FeedList; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -54,7 +50,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi private final String TAG = this.getClass().getSimpleName(); private SharedPreferences m_prefs; private FeedListAdapter m_adapter; - private FeedList m_feeds = new FeedList(); + private final FeedList m_feeds = new FeedList(); private MasterActivity m_activity; Feed m_selectedFeed; FeedCategory m_activeCategory; @@ -76,14 +72,14 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi final String sessionId = m_activity.getSessionId(); final boolean unreadOnly = m_activity.getUnreadOnly() && (m_activeCategory == null || m_activeCategory.id != -1); - HashMap<String,String> params = new HashMap<String,String>(); + HashMap<String,String> params = new HashMap<>(); params.put("op", "getFeeds"); params.put("sid", sessionId); params.put("include_nested", "true"); params.put("cat_id", String.valueOf(catId)); - if (unreadOnly) { - params.put("unread_only", String.valueOf(unreadOnly)); - } + + if (unreadOnly) + params.put("unread_only", "true"); return new FeedsLoader(getActivity().getApplicationContext(), params, catId); } @@ -127,7 +123,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } - if (m_enableParentBtn && m_activeCategory != null && m_activeCategory.id >= 0 && m_feeds.size() > 0) { + if (m_enableParentBtn && m_activeCategory != null && m_activeCategory.id >= 0 && !m_feeds.isEmpty()) { Feed feed = new Feed(m_activeCategory.id, m_activeCategory.title, true); feed.unread = catUnread; feed.always_display_as_feed = true; @@ -157,16 +153,11 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } else { m_activity.toast(al.getErrorMessage()); } - - //m_activity.setLoadingStatus(getErrorMessage(), false); } } @Override - public void onLoaderReset(Loader<JsonElement> loader) { - /*m_feeds.clear(); - m_adapter.notifyDataSetChanged();*/ - } + public void onLoaderReset(Loader<JsonElement> loader) { } @SuppressLint("DefaultLocale") static class FeedUnreadComparator implements Comparator<Feed> { @@ -206,9 +197,6 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi @Override public int compare(Feed a, Feed b) { - //Log.d(TAG, "A:" + a.title + " " + a.is_cat + " " + a.order_id); - //Log.d(TAG, "B:" + b.title + " " + b.is_cat + " " + b.order_id); - if (a.id >= 0 && b.id >= 0) if (a.is_cat && b.is_cat) if (a.order_id != 0 && b.order_id != 0) @@ -236,72 +224,46 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); - int itemId = item.getItemId(); - if (itemId == R.id.browse_headlines) { - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.onFeedSelected(feed); - } - } - return true; - } else if (itemId == R.id.browse_feeds) { - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread), false); - } - } - return true; - } else if (itemId == R.id.unsubscribe_feed) { - if (true) { - final Feed feed = getFeedAtPosition(info.position); - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) - .setMessage(getString(R.string.unsubscribe_from_prompt, feed.title)) - .setPositiveButton(R.string.unsubscribe, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - m_activity.unsubscribeFeed(feed); - - } - }) - .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - } - }); - - Dialog dlg = builder.create(); - dlg.show(); - } - - return true; - } else if (itemId == R.id.create_shortcut) { - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.createFeedShortcut(feed); - } - } - return true; - } else if (itemId == R.id.catchup_feed) { - if (true) { - Feed feed = getFeedAtPosition(info.position); - - if (feed != null) { - m_activity.catchupDialog(feed); - } - } - return true; - } - Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); - return super.onContextItemSelected(item); - } + int itemId = item.getItemId(); + if (itemId == R.id.browse_headlines) { + Feed feed = getFeedAtPosition(info.position); + if (feed != null) { + m_activity.onFeedSelected(feed); + } + return true; + } else if (itemId == R.id.browse_feeds) { + Feed feed = getFeedAtPosition(info.position); + if (feed != null) { + m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread), false); + } + return true; + } else if (itemId == R.id.unsubscribe_feed) { + final Feed feed = getFeedAtPosition(info.position); + + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) + .setMessage(getString(R.string.unsubscribe_from_prompt, feed.title)) + .setPositiveButton(R.string.unsubscribe, + (dialog, which) -> m_activity.unsubscribeFeed(feed)) + .setNegativeButton(R.string.dialog_cancel, + (dialog, which) -> { + + }); + + Dialog dlg = builder.create(); + dlg.show(); + + return true; + } else if (itemId == R.id.catchup_feed) { + Feed feed = getFeedAtPosition(info.position); + + if (feed != null) { + m_activity.catchupDialog(feed); + } + return true; + } + Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); + return super.onContextItemSelected(item); + } @Override public void onCreateContextMenu(ContextMenu menu, View v, @@ -323,11 +285,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi menu.findItem(R.id.unsubscribe_feed).setVisible(false); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - menu.findItem(R.id.create_shortcut).setVisible(false); - } - - super.onCreateContextMenu(menu, v, menuInfo); + super.onCreateContextMenu(menu, v, menuInfo); } @@ -364,12 +322,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_swipeLayout = view.findViewById(R.id.feeds_swipe_container); - m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(); - } - }); + m_swipeLayout.setOnRefreshListener(this::refresh); m_list = view.findViewById(R.id.feeds); @@ -378,12 +331,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi if (m_enableParentBtn) { View layout = inflater.inflate(R.layout.feeds_goback, m_list, false); - layout.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - m_activity.getSupportFragmentManager().popBackStack(); - } - }); + layout.setOnClickListener(view1 -> m_activity.getSupportFragmentManager().popBackStack()); m_list.addHeaderView(layout, null, false); } @@ -417,7 +365,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi public void onResume() { super.onResume(); - getLoaderManager().initLoader(0, null, this).forceLoad(); + LoaderManager.getInstance(this).initLoader(0, null, this).forceLoad(); m_activity.invalidateOptionsMenu(); } @@ -448,7 +396,6 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } } - @SuppressWarnings({ "serial" }) public void refresh() { if (!isAdded()) return; @@ -456,11 +403,11 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_swipeLayout.setRefreshing(true); } - getLoaderManager().restartLoader(0, null, this).forceLoad(); + LoaderManager.getInstance(this).restartLoader(0, null, this).forceLoad(); } private class FeedListAdapter extends ArrayAdapter<Feed> { - private ArrayList<Feed> items; + private final ArrayList<Feed> items; public static final int VIEW_NORMAL = 0; public static final int VIEW_SELECTED = 1; @@ -502,11 +449,9 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi if (v == null) { int layoutId = R.layout.feeds_row; - switch (getItemViewType(position)) { - case VIEW_SELECTED: - layoutId = R.layout.feeds_row_selected; - break; - } + if (getItemViewType(position) == VIEW_SELECTED) { + layoutId = R.layout.feeds_row_selected; + } LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(layoutId, null); @@ -566,17 +511,6 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi tu.setVisibility((feed.unread > 0) ? View.VISIBLE : View.INVISIBLE); } - /*ImageButton ib = (ImageButton) v.findViewById(R.id.feed_menu_button); - - if (ib != null) { - ib.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - getActivity().openContextMenu(v); - } - }); - }*/ - return v; } } @@ -595,7 +529,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } try { - Collections.sort(m_feeds, cmp); + m_feeds.sort(cmp); } catch (IllegalArgumentException e) { // sort order got changed in prefs or something e.printStackTrace(); @@ -613,8 +547,6 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi String key) { sortFeeds(); - //m_enableFeedIcons = m_prefs.getBoolean("download_feed_icons", false); - } public Feed getFeedAtPosition(int position) { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java index 4df392f6..92ce64d2 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java @@ -5,7 +5,7 @@ import android.content.Context; import java.util.HashMap; class FeedsLoader extends ApiLoader { - private int m_catId; + private final int m_catId; public FeedsLoader(Context context, HashMap<String, String> params, int catId) { super(context, params); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java index 7868c6af..c527730b 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java @@ -4,7 +4,6 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.view.MenuInflater; import android.view.MenuItem; @@ -21,6 +20,7 @@ import androidx.core.view.WindowInsetsControllerCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.preference.PreferenceManager; import androidx.viewpager.widget.ViewPager; import com.ToxicBakery.viewpager.transforms.DepthPageTransformer; @@ -50,7 +50,7 @@ public class GalleryActivity extends CommonActivity { private ProgressBar m_checkProgress; private static class ArticleImagesPagerAdapter extends FragmentStatePagerAdapter { - private List<GalleryEntry> m_items; + private final List<GalleryEntry> m_items; public ArticleImagesPagerAdapter(FragmentManager fm, List<GalleryEntry> items) { super(fm); @@ -70,22 +70,17 @@ public class GalleryActivity extends CommonActivity { GalleryEntry item = m_items.get(position); switch (item.type) { - case TYPE_IMAGE: - if (true) { - GalleryImageFragment frag = new GalleryImageFragment(); - frag.initialize(item.url); + case TYPE_IMAGE: { + GalleryImageFragment frag = new GalleryImageFragment(); + frag.initialize(item.url); - return frag; - } - break; + return frag; + } case TYPE_VIDEO: - if (true) { - GalleryVideoFragment frag = new GalleryVideoFragment(); - frag.initialize(item.url, item.coverUrl); + GalleryVideoFragment frag = new GalleryVideoFragment(); + frag.initialize(item.url, item.coverUrl); - return frag; - } - break; + return frag; } return null; @@ -106,7 +101,7 @@ public class GalleryActivity extends CommonActivity { private class MediaCheckTask extends AsyncTask<List<GalleryEntry>, MediaProgressResult, List<GalleryEntry>> { - private List<GalleryEntry> m_checkedItems = new ArrayList<>(); + private final List<GalleryEntry> m_checkedItems = new ArrayList<>(); @Override protected List<GalleryEntry> doInBackground(List<GalleryEntry>... params) { @@ -172,7 +167,7 @@ public class GalleryActivity extends CommonActivity { if (source != null) { String src = source.attr("src"); - if (src.length() > 0) { + if (!src.isEmpty()) { //Log.d(TAG, "vid/src=" + src); if (src.startsWith("//")) { @@ -200,7 +195,7 @@ public class GalleryActivity extends CommonActivity { } else { String src = elem.attr("src"); - if (src.length() > 0) { + if (!src.isEmpty()) { if (src.startsWith("//")) { src = "https:" + src; } @@ -225,8 +220,8 @@ public class GalleryActivity extends CommonActivity { } } - if ((firstFound || imgSrcFirst.equals("")) && item.url != null) { - if (m_items.size() == 0) + if ((firstFound || imgSrcFirst.isEmpty()) && item.url != null) { + if (m_items.isEmpty()) m_items.add(item); else uncheckedItems.add(item); @@ -293,28 +288,20 @@ public class GalleryActivity extends CommonActivity { m_content = savedInstanceState.getString("m_content"); } - findViewById(R.id.gallery_overflow).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - PopupMenu popup = new PopupMenu(GalleryActivity.this, v); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.content_gallery_entry, popup.getMenu()); + findViewById(R.id.gallery_overflow).setOnClickListener(v -> { + PopupMenu popup = new PopupMenu(GalleryActivity.this, v); + MenuInflater inflater = popup.getMenuInflater(); + inflater.inflate(R.menu.content_gallery_entry, popup.getMenu()); - final GalleryEntry entry = m_items.get(m_pager.getCurrentItem()); + final GalleryEntry entry = m_items.get(m_pager.getCurrentItem()); - popup.getMenu().findItem(R.id.article_img_share) - .setVisible(entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE); + popup.getMenu().findItem(R.id.article_img_share) + .setVisible(entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE); - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return onImageMenuItemSelected(item, entry); - } - }); + popup.setOnMenuItemClickListener(item -> onImageMenuItemSelected(item, entry)); - popup.show(); + popup.show(); - } }); setTitle(m_title); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java index addb48d3..8f9d5783 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java @@ -47,7 +47,7 @@ public class GalleryImageFragment extends GalleryBaseFragment { imgView.setOnTouchListener(touchHandler); // shared element transitions stop GIFs from playing - if (m_url.toLowerCase().indexOf(".gif") == -1) { + if (!m_url.toLowerCase().contains(".gif")) { ViewCompat.setTransitionName(imgView, "gallery:" + m_url); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java index 2e2df149..a96e59b5 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java @@ -126,17 +126,14 @@ public class GalleryVideoFragment extends GalleryBaseFragment { registerForContextMenu(textureView); - textureView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - try { - if (!m_mediaController.isShowing()) - m_mediaController.show(5000); - else - m_mediaController.hide(); - } catch (Exception e) { - e.printStackTrace(); - } + textureView.setOnClickListener(v -> { + try { + if (!m_mediaController.isShowing()) + m_mediaController.show(5000); + else + m_mediaController.hide(); + } catch (Exception e) { + e.printStackTrace(); } }); @@ -215,22 +212,19 @@ public class GalleryVideoFragment extends GalleryBaseFragment { e.printStackTrace(); } - m_mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - getView().findViewById(R.id.flavor_image).setVisibility(View.GONE); - getView().findViewById(R.id.flavor_image_progress).setVisibility(View.GONE); - - try { - resizeSurface(textureView); - mp.setLooping(true); - - if (m_userVisibleHint) { - mp.start(); - } - } catch (IllegalStateException e) { - e.printStackTrace(); + m_mediaPlayer.setOnPreparedListener(mp -> { + getView().findViewById(R.id.flavor_image).setVisibility(View.GONE); + getView().findViewById(R.id.flavor_image_progress).setVisibility(View.GONE); + + try { + resizeSurface(textureView); + mp.setLooping(true); + + if (m_userVisibleHint) { + mp.start(); } + } catch (IllegalStateException e) { + e.printStackTrace(); } }); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index 352ebab6..32943961 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -4,7 +4,6 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.ColorStateList; @@ -16,10 +15,8 @@ import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.preference.PreferenceManager; import android.text.Html; import android.transition.Fade; import android.transition.Transition; @@ -35,9 +32,7 @@ import android.view.MenuItem; import android.view.Surface; import android.view.TextureView; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.view.WindowManager; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.CheckBox; @@ -52,6 +47,7 @@ import android.widget.TextView; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; import androidx.core.view.ViewCompat; +import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; @@ -83,7 +79,6 @@ import org.jsoup.nodes.Element; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.TimeZone; @@ -111,13 +106,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private SharedPreferences m_prefs; private HeaderViewRecyclerAdapter m_adapter; - ArticleList m_articles = new ArticleList(); - private ArticleList m_readArticles = new ArticleList(); + private final ArticleList m_readArticles = new ArticleList(); private HeadlinesEventListener m_listener; private OnlineActivity m_activity; private SwipeRefreshLayout m_swipeLayout; - private int m_maxImageSize = 0; - boolean m_compactLayoutMode = false; + boolean m_compactLayoutMode = false; private RecyclerView m_list; private LinearLayoutManager m_layoutManager; @@ -127,7 +120,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public ArticleList getSelectedArticles() { ArticleList tmp = new ArticleList(); - for (Article a : m_articles) { + for (Article a : Application.getArticles()) { if (a.selected) tmp.add(a); } @@ -138,7 +131,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_feed = feed; } - public void initialize(Feed feed, Article activeArticle, boolean compactMode, ArticleList articles) { + public void initialize(Feed feed, Article activeArticle, boolean compactMode) { m_feed = feed; m_compactLayoutMode = compactMode; @@ -146,9 +139,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_activeArticle = getArticleById(activeArticle.id); } - if (articles != null) { - m_articles = articles; - } } public boolean onArticleMenuItemSelected(MenuItem item, Article article, int position) { @@ -184,32 +174,17 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_activity.shareArticle(article); return true; } else if (itemId == R.id.catchup_above) { - if (true) { - - final Article fa = article; - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) - .setMessage(R.string.confirm_catchup_above) - .setPositiveButton(R.string.dialog_ok, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - catchupAbove(fa); + final Article fa = article; - } - }) - .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) + .setMessage(R.string.confirm_catchup_above) + .setPositiveButton(R.string.dialog_ok, + (dialog, which) -> catchupAbove(fa)) + .setNegativeButton(R.string.dialog_cancel, + (dialog, which) -> { }); - } - }); - - Dialog dialog = builder.create(); - dialog.show(); - } + Dialog dialog = builder.create(); + dialog.show(); return true; } Log.d(TAG, "onArticleMenuItemSelected, unhandled id=" + item.getItemId()); @@ -228,7 +203,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { tmp.add(a); } } - if (tmp.size() > 0) { + if (!tmp.isEmpty()) { m_activity.toggleArticlesUnread(tmp); //updateHeadlines(); } @@ -253,12 +228,10 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public HeadlinesFragment() { super(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Transition fade = new Fade(); + Transition fade = new Fade(); - setEnterTransition(fade); - setReenterTransition(fade); - } + setEnterTransition(fade); + setReenterTransition(fade); } @Override @@ -283,20 +256,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_searchQuery = savedInstanceState.getString("m_searchQuery"); m_firstId = savedInstanceState.getInt("m_firstId"); m_lazyLoadDisabled = savedInstanceState.getBoolean("m_lazyLoadDisabled"); - - /*ArrayList<Article> list = savedInstanceState.getParcelableArrayList("m_articles"); - - m_articles.clear(); // ? - m_articles.addAll(list);*/ - - ArticleList tmp = Application.getInstance().tmpArticleList; - - if (tmp != null) { - m_articles.clear(); - m_articles.addAll(Application.getInstance().tmpArticleList); - } - - savedInstanceState.getBoolean("m_compactLayoutMode", m_compactLayoutMode); + m_compactLayoutMode = savedInstanceState.getBoolean("m_compactLayoutMode"); } setRetainInstance(true); @@ -313,21 +273,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { out.putString("m_searchQuery", m_searchQuery); out.putInt("m_firstId", m_firstId); out.putBoolean("m_lazyLoadDisabled", m_lazyLoadDisabled); - //out.putParcelable("m_articles", m_articles); out.putBoolean("m_compactLayoutMode", m_compactLayoutMode); - - Application.getInstance().tmpArticleList = m_articles; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - if (savedInstanceState != null) { - if (m_activity instanceof DetailActivity) { - m_articles = ((DetailActivity)m_activity).m_articles; - } - } - String headlineMode = m_prefs.getString("headline_mode", "HL_DEFAULT"); if ("HL_COMPACT".equals(headlineMode) || "HL_COMPACT_NOIMAGES".equals(headlineMode)) @@ -335,20 +286,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); - m_maxImageSize = (int) (128 * metrics.density + 0.5); - - Log.d(TAG, "maxImageSize=" + m_maxImageSize); View view = inflater.inflate(R.layout.fragment_headlines, container, false); m_swipeLayout = view.findViewById(R.id.headlines_swipe_container); - m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(false, true); - } - }); + m_swipeLayout.setOnRefreshListener(() -> refresh(false, true)); m_list = view.findViewById(R.id.headlines_list); registerForContextMenu(m_list); @@ -357,14 +300,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_list.setLayoutManager(m_layoutManager); m_list.setItemAnimator(new DefaultItemAnimator()); - /* if (m_compactLayoutMode) { - MaterialDividerItemDecoration materialDivider = new MaterialDividerItemDecoration(m_list.getContext(), m_layoutManager.getOrientation()); - materialDivider.setDividerInsetStart(dpToPx(80)); - - m_list.addItemDecoration(materialDivider); - } */ - - ArticleListAdapter adapter = new ArticleListAdapter(getActivity(), R.layout.headlines_row, m_articles); + ArticleListAdapter adapter = new ArticleListAdapter(Application.getArticles()); m_adapter = new HeaderViewRecyclerAdapter(adapter); @@ -382,7 +318,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { @Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { - int position = viewHolder.getAdapterPosition() - m_adapter.getHeaderCount(); + int position = viewHolder.getBindingAdapterPosition() - m_adapter.getHeaderCount(); Article article = getArticleAtPosition(position); @@ -395,7 +331,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { - final int adapterPosition = viewHolder.getAdapterPosition(); + final int adapterPosition = viewHolder.getBindingAdapterPosition(); final int position = adapterPosition - m_adapter.getHeaderCount(); try { @@ -412,24 +348,21 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { wasUnread = false; } - m_articles.remove(position); + Application.getArticles().remove(position); m_adapter.notifyDataSetChanged(); Snackbar.make(m_list, R.string.headline_undo_row_prompt, Snackbar.LENGTH_LONG) - .setAction(getString(R.string.headline_undo_row_button), new OnClickListener() { - @Override - public void onClick(View v) { - - if (wasUnread) { - article.unread = true; - m_activity.saveArticleUnread(article); - } - - m_articles.add(position, article); - m_adapter.notifyItemInserted(adapterPosition); - m_adapter.notifyItemRangeChanged(adapterPosition, 1); - } - }).show(); + .setAction(getString(R.string.headline_undo_row_button), v -> { + + if (wasUnread) { + article.unread = true; + m_activity.saveArticleUnread(article); + } + + Application.getArticles().add(position, article); + m_adapter.notifyItemInserted(adapterPosition); + m_adapter.notifyItemRangeChanged(adapterPosition, 1); + }).show(); } @@ -448,29 +381,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - /*if (newState != RecyclerView.SCROLL_STATE_IDLE) { - - try { - if (m_mediaPlayer != null && m_mediaPlayer.isPlaying()) { - m_mediaPlayer.pause(); - } - } catch (IllegalStateException e) { - // i guess it was already released, oh well - } - - }*/ - if (newState == RecyclerView.SCROLL_STATE_IDLE && m_prefs.getBoolean("headlines_mark_read_scroll", false)) { if (!m_readArticles.isEmpty()) { m_activity.toggleArticlesUnread(m_readArticles); m_readArticles.clear(); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - m_activity.refresh(false); - } - }, 100); + new Handler().postDelayed(() -> m_activity.refresh(false), 100); } } } @@ -486,7 +402,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (m_prefs.getBoolean("headlines_mark_read_scroll", false) && firstVisibleItem > m_adapter.getHeaderCount()) { - if (firstVisibleItem <= m_articles.size() + m_adapter.getHeaderCount()) { + if (firstVisibleItem <= Application.getArticles().size() + m_adapter.getHeaderCount()) { Article a = getArticleAtPosition(firstVisibleItem - m_adapter.getHeaderCount() - 1); @@ -500,14 +416,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } } - if (!m_refreshInProgress && !m_lazyLoadDisabled && lastVisibleItem >= m_articles.size() - 5) { + if (!m_refreshInProgress && !m_lazyLoadDisabled && lastVisibleItem >= Application.getArticles().size() - 5) { m_refreshInProgress = true; - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - refresh(true); - } - }, 100); + new Handler().postDelayed(() -> refresh(true), 100); } } @@ -532,7 +443,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { setActiveArticle(m_activeArticle); } - if (m_articles.size() == 0) { + if (Application.getArticles().isEmpty()) { refresh(false); } @@ -551,9 +462,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { refresh(append, false); } - @SuppressWarnings({ "serial" }) public void refresh(final boolean append, boolean userInitiated) { - m_articles.stripFooters(); + Application.getArticles().stripFooters(); m_adapter.notifyDataSetChanged(); if (!append) m_lazyLoadDisabled = false; @@ -565,11 +475,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (!append) { m_activity.getSupportActionBar().show(); - m_articles.clear(); + Application.getArticles().clear(); m_adapter.notifyDataSetChanged(); } else { if (!(m_activity instanceof DetailActivity)) { - m_articles.add(new Article(Article.TYPE_LOADMORE)); + Application.getArticles().add(new Article(Article.TYPE_LOADMORE)); m_adapter.notifyDataSetChanged(); } } @@ -577,12 +487,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { final String sessionId = m_activity.getSessionId(); final boolean isCat = m_feed.is_cat; - @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, m_articles) { - @Override - protected void onProgressUpdate(Integer... progress) { - m_activity.setProgress(Math.round((((float) progress[0] / (float) progress[1]) * 10000))); - } - + @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, Application.getArticles()) { @Override protected void onPostExecute(JsonElement result) { if (isDetached() || !isAdded()) return; @@ -597,7 +502,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (result != null) { - if (m_activeArticle != null && !m_articles.containsId(m_activeArticle.id)) { + if (m_activeArticle != null && !Application.getArticles().containsId(m_activeArticle.id)) { m_activeArticle = null; } @@ -609,16 +514,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (m_activity.isSmallScreen() || !m_activity.isPortrait()) { Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) - .setAction(R.string.reload, new OnClickListener() { - @Override - public void onClick(View v) { - refresh(false); - } - }).show(); + .setAction(R.string.reload, v -> refresh(false)).show(); } } - if (m_amountLoaded < Integer.valueOf(m_prefs.getString("headlines_request_size", "15"))) { + if (m_amountLoaded < Integer.parseInt(m_prefs.getString("headlines_request_size", "15"))) { //Log.d(TAG, "amount loaded < request size, disabling lazy load"); m_lazyLoadDisabled = true; } @@ -643,7 +543,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } if (!(m_activity instanceof DetailActivity)) { - m_articles.add(new Article(Article.TYPE_AMR_FOOTER)); + Application.getArticles().add(new Article(Article.TYPE_AMR_FOOTER)); m_adapter.notifyDataSetChanged(); } } @@ -655,9 +555,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { // adaptive, all_articles, marked, published, unread String viewMode = m_activity.getViewMode(); int numUnread = 0; - int numAll = m_articles.size(); + int numAll = Application.getArticles().size(); - for (Article a : m_articles) { + for (Article a : Application.getArticles()) { if (a.unread) ++numUnread; } @@ -667,7 +567,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { skip = numAll; } else if ("unread".equals(viewMode)) { skip = numUnread; - } else if (m_searchQuery != null && m_searchQuery.length() > 0) { + } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { skip = numAll; } else if ("adaptive".equals(viewMode)) { skip = numUnread > 0 ? numUnread : numAll; @@ -686,7 +586,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { req.setOffset(skip); - HashMap<String,String> map = new HashMap<String,String>(); + HashMap<String,String> map = new HashMap<>(); map.put("op", "getHeadlines"); map.put("sid", sessionId); map.put("feed_id", String.valueOf(m_feed.id)); @@ -714,7 +614,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { map.put("force_update", "true"); } - if (m_searchQuery != null && m_searchQuery.length() != 0) { + if (m_searchQuery != null && !m_searchQuery.isEmpty()) { map.put("search", m_searchQuery); map.put("search_mode", ""); map.put("match_on", "both"); @@ -757,8 +657,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public View flavorImageOverflow; public TextureView flavorVideoView; public MaterialButton attachmentsView; - //public int position; - public boolean flavorImageEmbedded; public ProgressTarget<String, GlideDrawable> flavorProgressTarget; public ArticleViewHolder(View v) { @@ -766,18 +664,15 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { view = v; - view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - View flavorImage = view.findViewById(R.id.flavor_image); + view.getViewTreeObserver().addOnPreDrawListener(() -> { + View flavorImage = view.findViewById(R.id.flavor_image); - if (flavorImage != null) { - article.flavorViewHeight = flavorImage.getMeasuredHeight(); - } + if (flavorImage != null) { + article.flavorViewHeight = flavorImage.getMeasuredHeight(); + } - return true; - } - }); + return true; + }); titleView = v.findViewById(R.id.title); @@ -839,7 +734,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } private class ArticleListAdapter extends RecyclerView.Adapter<ArticleViewHolder> { - private ArrayList<Article> items; + private final ArticleList items; public static final int VIEW_NORMAL = 0; public static final int VIEW_UNREAD = 1; @@ -852,12 +747,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private final Integer[] origTitleColors = new Integer[VIEW_COUNT]; - private ColorGenerator m_colorGenerator = ColorGenerator.DEFAULT; - private TextDrawable.IBuilder m_drawableBuilder = TextDrawable.builder().round(); + private final ColorGenerator m_colorGenerator = ColorGenerator.DEFAULT; + private final TextDrawable.IBuilder m_drawableBuilder = TextDrawable.builder().round(); boolean flavorImageEnabled; - private int m_minimumHeightToEmbed; - private int m_screenHeight; + private final int m_screenHeight; private int m_lastAddedPosition; private final ConnectivityManager m_cmgr; @@ -879,14 +773,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { return false; } - public ArticleListAdapter(Context context, int textViewResourceId, ArrayList<Article> items) { + public ArticleListAdapter(ArticleList items) { super(); this.items = items; Display display = m_activity.getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); - m_minimumHeightToEmbed = size.y/3; m_screenHeight = size.y; String headlineMode = m_prefs.getString("headline_mode", "HL_DEFAULT"); @@ -945,67 +838,52 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { // nothing else of interest for those below anyway if (article.id < 0) return; - holder.view.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - m_list.showContextMenuForChild(v); - return true; - } - }); + holder.view.setOnLongClickListener(v -> { + m_list.showContextMenuForChild(v); + return true; + }); - holder.view.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - m_listener.onArticleSelected(article); + holder.view.setOnClickListener(v -> { + m_listener.onArticleSelected(article); - // only set active article when it makes sense (in DetailActivity) - if (getActivity() instanceof DetailActivity) { - m_activeArticle = article; - m_adapter.notifyDataSetChanged(); - } - } - }); + // only set active article when it makes sense (in DetailActivity) + if (getActivity() instanceof DetailActivity) { + m_activeArticle = article; + m_adapter.notifyDataSetChanged(); + } + }); // block footer clicks to make button/selection clicking easier if (holder.headlineFooter != null) { - holder.headlineFooter.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - // - } - }); + holder.headlineFooter.setOnClickListener(view -> { + // + }); } if (holder.textImage != null) { - updateTextCheckedState(holder, article, position); + updateTextCheckedState(holder, article); - holder.textImage.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - Log.d(TAG, "textImage : onclicked"); + holder.textImage.setOnClickListener(view -> { + Log.d(TAG, "textImage : onclicked"); - article.selected = !article.selected; + article.selected = !article.selected; - updateTextCheckedState(holder, article, m_list.getChildPosition(holder.view)); + updateTextCheckedState(holder, article); - m_listener.onArticleListSelectionChange(getSelectedArticles()); + m_listener.onArticleListSelectionChange(getSelectedArticles()); - Log.d(TAG, "num selected: " + getSelectedArticles().size()); - } - }); + Log.d(TAG, "num selected: " + getSelectedArticles().size()); + }); ViewCompat.setTransitionName(holder.textImage, "gallery:" + article.flavorImageUri); if (article.flavorImage != null) { - holder.textImage.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { + holder.textImage.setOnLongClickListener(v -> { - openGalleryForType(article, holder, holder.textImage); + openGalleryForType(article, holder, holder.textImage); - return true; - } - }); + return true; + }); } } @@ -1046,17 +924,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { else holder.markedView.setIconTint(ColorStateList.valueOf(tvPrimary.data)); - holder.markedView.setOnClickListener(new OnClickListener() { + holder.markedView.setOnClickListener(v -> { + article.marked = !article.marked; - @Override - public void onClick(View v) { - article.marked = !article.marked; + m_adapter.notifyItemChanged(m_list.getChildAdapterPosition(holder.view)); - m_adapter.notifyItemChanged(m_list.getChildPosition(holder.view)); - - m_activity.saveArticleMarked(article); - } - }); + m_activity.saveArticleMarked(article); + }); } if (holder.scoreView != null) { @@ -1078,51 +952,29 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { holder.scoreView.setIconTint(ColorStateList.valueOf(tvPrimary.data)); if (m_activity.getApiLevel() >= 16) { - holder.scoreView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - final EditText edit = new EditText(getActivity()); - edit.setText(String.valueOf(article.score)); - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) - .setTitle(R.string.score_for_this_article) - .setPositiveButton(R.string.set_score, - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, - int which) { - - try { - int newScore = Integer.parseInt(edit.getText().toString()); - - article.score = newScore; - - m_activity.saveArticleScore(article); - - m_adapter.notifyItemChanged(m_list.getChildPosition(holder.view)); - } catch (NumberFormatException e) { - m_activity.toast(R.string.score_invalid); - e.printStackTrace(); - } - } - }) - .setNegativeButton(getString(R.string.cancel), - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, - int which) { - - // - - } - }).setView(edit); + holder.scoreView.setOnClickListener(v -> { + final EditText edit = new EditText(getActivity()); + edit.setText(String.valueOf(article.score)); + + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()) + .setTitle(R.string.score_for_this_article) + .setPositiveButton(R.string.set_score, + (dialog, which) -> { + try { + article.score = Integer.parseInt(edit.getText().toString()); + m_activity.saveArticleScore(article); + m_adapter.notifyItemChanged(m_list.getChildAdapterPosition(holder.view)); + } catch (NumberFormatException e) { + m_activity.toast(R.string.score_invalid); + e.printStackTrace(); + } + }) + .setNegativeButton(getString(R.string.cancel), + (dialog, which) -> { }).setView(edit); - Dialog dialog = builder.create(); - dialog.show(); - } - }); + Dialog dialog = builder.create(); + dialog.show(); + }); } } @@ -1137,29 +989,19 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { else holder.publishedView.setIconTint(ColorStateList.valueOf(tvPrimary.data)); - holder.publishedView.setOnClickListener(new OnClickListener() { + holder.publishedView.setOnClickListener(v -> { + article.published = !article.published; + m_adapter.notifyItemChanged(m_list.getChildAdapterPosition(holder.view)); - @Override - public void onClick(View v) { - article.published = !article.published; - //m_adapter.notifyDataSetChanged(); - m_adapter.notifyItemChanged(m_list.getChildPosition(holder.view)); - - m_activity.saveArticlePublished(article); - } - }); + m_activity.saveArticlePublished(article); + }); } if (holder.attachmentsView != null) { - if (article.attachments != null && article.attachments.size() > 0) { + if (article.attachments != null && !article.attachments.isEmpty()) { holder.attachmentsView.setVisibility(View.VISIBLE); - holder.attachmentsView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - m_activity.displayAttachments(article); - } - }); + holder.attachmentsView.setOnClickListener(v -> m_activity.displayAttachments(article)); } else { holder.attachmentsView.setVisibility(View.GONE); @@ -1217,80 +1059,62 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { Glide.clear(holder.flavorImageView); // this is needed if our flavor image goes behind base listview element - holder.headlineHeader.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - m_listener.onArticleSelected(article); - - // only set active article when it makes sense (in DetailActivity) - if (getActivity() instanceof DetailActivity) { - m_activeArticle = article; - m_adapter.notifyDataSetChanged(); - } - } - }); + holder.headlineHeader.setOnClickListener(v -> { + m_listener.onArticleSelected(article); - holder.headlineHeader.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - m_list.showContextMenuForChild(holder.view); + // only set active article when it makes sense (in DetailActivity) + if (getActivity() instanceof DetailActivity) { + m_activeArticle = article; + m_adapter.notifyDataSetChanged(); + } + }); - return true; - } - }); + holder.headlineHeader.setOnLongClickListener(v -> { + m_list.showContextMenuForChild(holder.view); + + return true; + }); if (canShowFlavorImage() && article.flavorImageUri != null && holder.flavorImageView != null) { if (holder.flavorImageOverflow != null) { - holder.flavorImageOverflow.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - PopupMenu popup = new PopupMenu(getActivity(), holder.flavorImageOverflow); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.content_gallery_entry, popup.getMenu()); - - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - - Uri mediaUri = Uri.parse(article.flavorStreamUri != null ? article.flavorStreamUri : article.flavorImageUri); - - int itemId = item.getItemId(); - if (itemId == R.id.article_img_open) { - m_activity.openUri(mediaUri); - return true; - } else if (itemId == R.id.article_img_copy) { - m_activity.copyToClipboard(mediaUri.toString()); - return true; - } else if (itemId == R.id.article_img_share) { - m_activity.shareImageFromUri(mediaUri.toString()); - return true; - } else if (itemId == R.id.article_img_share_url) { - m_activity.shareText(mediaUri.toString()); - return true; - } else if (itemId == R.id.article_img_view_caption) { - m_activity.displayImageCaption(article.flavorImageUri, article.content); - return true; - } - return false; - } - }); - - popup.show(); - } - }); - - holder.flavorImageView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - m_list.showContextMenuForChild(holder.view); - return true; - } - }); + holder.flavorImageOverflow.setOnClickListener(v -> { + PopupMenu popup = new PopupMenu(getActivity(), holder.flavorImageOverflow); + MenuInflater inflater = popup.getMenuInflater(); + inflater.inflate(R.menu.content_gallery_entry, popup.getMenu()); + + popup.setOnMenuItemClickListener(item -> { + + Uri mediaUri = Uri.parse(article.flavorStreamUri != null ? article.flavorStreamUri : article.flavorImageUri); + + int itemId = item.getItemId(); + if (itemId == R.id.article_img_open) { + m_activity.openUri(mediaUri); + return true; + } else if (itemId == R.id.article_img_copy) { + m_activity.copyToClipboard(mediaUri.toString()); + return true; + } else if (itemId == R.id.article_img_share) { + m_activity.shareImageFromUri(mediaUri.toString()); + return true; + } else if (itemId == R.id.article_img_share_url) { + m_activity.shareText(mediaUri.toString()); + return true; + } else if (itemId == R.id.article_img_view_caption) { + m_activity.displayImageCaption(article.flavorImageUri, article.content); + return true; + } + return false; + }); + + popup.show(); + }); + + holder.flavorImageView.setOnLongClickListener(v -> { + m_list.showContextMenuForChild(holder.view); + return true; + }); } - //Log.d(TAG, "IMG: " + article.flavorImageUri + " STREAM: " + article.flavorStreamUri + " H:" + article.flavorViewHeight); - //Log.d(TAG, "TAG:" + holder.flavorImageOverflow.getTag()); - holder.flavorImageView.setVisibility(View.VISIBLE); holder.flavorImageView.setMaxHeight((int)(m_screenHeight * 0.6f)); @@ -1348,129 +1172,108 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } if (m_prefs.getBoolean("inline_video_player", false) && article.flavorImage != null && - "video".equals(article.flavorImage.tagName().toLowerCase()) && article.flavorStreamUri != null) { - - holder.flavorImageView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - releaseSurface(); - openGalleryForType(article, holder, holder.flavorImageView); - return true; - } - }); - - holder.flavorVideoView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - releaseSurface(); - openGalleryForType(article, holder, holder.flavorImageView); - return true; - } - }); + "video".equalsIgnoreCase(article.flavorImage.tagName()) && article.flavorStreamUri != null) { + + holder.flavorImageView.setOnLongClickListener(v -> { + releaseSurface(); + openGalleryForType(article, holder, holder.flavorImageView); + return true; + }); + + holder.flavorVideoView.setOnLongClickListener(v -> { + releaseSurface(); + openGalleryForType(article, holder, holder.flavorImageView); + return true; + }); + + holder.flavorImageView.setOnClickListener(view -> { + releaseSurface(); + m_mediaPlayer = new MediaPlayer(); + + holder.flavorVideoView.setVisibility(View.VISIBLE); + final ProgressBar bar = holder.flavorImageLoadingBar; + + bar.setIndeterminate(true); + bar.setVisibility(View.VISIBLE); + + holder.flavorVideoView.setOnClickListener(v -> { + try { + if (m_mediaPlayer.isPlaying()) + m_mediaPlayer.pause(); + else + m_mediaPlayer.start(); + } catch (IllegalStateException e) { + releaseSurface(); + } + }); - holder.flavorImageView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - releaseSurface(); - m_mediaPlayer = new MediaPlayer(); + m_activeTexture = holder.flavorVideoView; - holder.flavorVideoView.setVisibility(View.VISIBLE); - final ProgressBar bar = holder.flavorImageLoadingBar; + ViewGroup.LayoutParams lp = m_activeTexture.getLayoutParams(); - bar.setIndeterminate(true); - bar.setVisibility(View.VISIBLE); + Drawable drawable = holder.flavorImageView.getDrawable(); - holder.flavorVideoView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - try { - if (m_mediaPlayer.isPlaying()) - m_mediaPlayer.pause(); - else - m_mediaPlayer.start(); - } catch (IllegalStateException e) { - releaseSurface(); - } - } - }); + if (drawable != null) { - m_activeTexture = holder.flavorVideoView; + float aspect = drawable.getIntrinsicWidth() / (float) drawable.getIntrinsicHeight(); - android.view.ViewGroup.LayoutParams lp = m_activeTexture.getLayoutParams(); + lp.height = holder.flavorImageView.getMeasuredHeight(); + lp.width = (int) (lp.height * aspect); - Drawable drawable = holder.flavorImageView.getDrawable(); + m_activeTexture.setLayoutParams(lp); + } - if (drawable != null) { + holder.flavorVideoView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + try { + m_mediaPlayer.setSurface(new Surface(surface)); - float aspect = drawable.getIntrinsicWidth() / (float) drawable.getIntrinsicHeight(); + m_mediaPlayer.setDataSource(article.flavorStreamUri); - lp.height = holder.flavorImageView.getMeasuredHeight(); - lp.width = (int) (lp.height * aspect); + m_mediaPlayer.setOnPreparedListener(mp -> { + try { + bar.setVisibility(View.GONE); + mp.setLooping(true); + mp.start(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + }); - m_activeTexture.setLayoutParams(lp); - } + m_mediaPlayer.prepareAsync(); + } catch (Exception e) { + e.printStackTrace(); + } - holder.flavorVideoView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { - @Override - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { - try { - m_mediaPlayer.setSurface(new Surface(surface)); - - m_mediaPlayer.setDataSource(article.flavorStreamUri); - - m_mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - - try { - bar.setVisibility(View.GONE); - mp.setLooping(true); - mp.start(); - } catch (IllegalStateException e) { - e.printStackTrace(); - } - } - }); - - m_mediaPlayer.prepareAsync(); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { - - } - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { - try { - m_mediaPlayer.release(); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surface) { - - } - } - ); + } - } - }); + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + try { + m_mediaPlayer.release(); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) { + + } + } + ); + + }); } else { - holder.flavorImageView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - openGalleryForType(article, holder, holder.flavorImageView); - } - }); + holder.flavorImageView.setOnClickListener(view -> openGalleryForType(article, holder, holder.flavorImageView)); } } @@ -1479,7 +1282,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (holder.authorView != null) { holder.authorView.setTextSize(TypedValue.COMPLEX_UNIT_SP, headlineSmallFontSize); - if (articleAuthor.length() > 0) { + if (!articleAuthor.isEmpty()) { holder.authorView.setText(getString(R.string.author_formatted, articleAuthor)); } else { holder.authorView.setText(""); @@ -1510,44 +1313,33 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (holder.selectionBoxView != null) { holder.selectionBoxView.setChecked(article.selected); - holder.selectionBoxView.setOnClickListener(new OnClickListener() { + holder.selectionBoxView.setOnClickListener(view -> { + CheckBox cb = (CheckBox)view; - @Override - public void onClick(View view) { - CheckBox cb = (CheckBox)view; + article.selected = cb.isChecked(); - article.selected = cb.isChecked(); + m_listener.onArticleListSelectionChange(getSelectedArticles()); - m_listener.onArticleListSelectionChange(getSelectedArticles()); - - Log.d(TAG, "num selected: " + getSelectedArticles().size()); - } - }); + Log.d(TAG, "num selected: " + getSelectedArticles().size()); + }); } if (holder.menuButtonView != null) { - holder.menuButtonView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { + holder.menuButtonView.setOnClickListener(v -> { - PopupMenu popup = new PopupMenu(getActivity(), v); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.context_headlines, popup.getMenu()); + PopupMenu popup = new PopupMenu(getActivity(), v); + MenuInflater inflater = popup.getMenuInflater(); + inflater.inflate(R.menu.context_headlines, popup.getMenu()); - popup.getMenu().findItem(R.id.article_set_labels).setEnabled(m_activity.getApiLevel() >= 1); - popup.getMenu().findItem(R.id.article_edit_note).setEnabled(m_activity.getApiLevel() >= 1); + popup.getMenu().findItem(R.id.article_set_labels).setEnabled(m_activity.getApiLevel() >= 1); + popup.getMenu().findItem(R.id.article_edit_note).setEnabled(m_activity.getApiLevel() >= 1); - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return onArticleMenuItemSelected(item, article, m_list.getChildPosition(holder.view)); - } - }); + popup.setOnMenuItemClickListener(item -> onArticleMenuItemSelected(item, article, + m_list.getChildAdapterPosition(holder.view))); - popup.show(); - } - }); + popup.show(); + }); } } @@ -1575,8 +1367,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { return items.size(); } - private void updateTextCheckedState(final ArticleViewHolder holder, final Article article, final int position) { - String tmp = article.title.length() > 0 ? article.title.substring(0, 1).toUpperCase() : "?"; + private void updateTextCheckedState(final ArticleViewHolder holder, final Article article) { + String tmp = !article.title.isEmpty() ? article.title.substring(0, 1).toUpperCase() : "?"; if (article.selected) { holder.textImage.setImageDrawable(m_drawableBuilder.build(" ", 0xff616161)); @@ -1619,7 +1411,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private void openGalleryForType(Article article, ArticleViewHolder holder, View transitionView) { //Log.d(TAG, "openGalleryForType: " + article + " " + holder + " " + transitionView); - if ("iframe".equals(article.flavorImage.tagName().toLowerCase())) { + if ("iframe".equalsIgnoreCase(article.flavorImage.tagName())) { m_activity.openUri(Uri.parse(article.flavorStreamUri)); } else { @@ -1663,10 +1455,10 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private void adjustVideoKindView(ArticleViewHolder holder, Article article) { if (article.flavorImage != null) { - if (article.flavor_kind == Article.FLAVOR_KIND_YOUTUBE || "iframe".equals(article.flavorImage.tagName().toLowerCase())) { + if (article.flavor_kind == Article.FLAVOR_KIND_YOUTUBE || "iframe".equalsIgnoreCase(article.flavorImage.tagName())) { holder.flavorVideoKindView.setImageResource(R.drawable.baseline_play_circle_outline_24); holder.flavorVideoKindView.setVisibility(View.VISIBLE); - } else if (article.flavor_kind == Article.FLAVOR_KIND_VIDEO || "video".equals(article.flavorImage.tagName().toLowerCase())) { + } else if (article.flavor_kind == Article.FLAVOR_KIND_VIDEO || "video".equalsIgnoreCase(article.flavorImage.tagName())) { holder.flavorVideoKindView.setImageResource(R.drawable.baseline_play_circle_24); holder.flavorVideoKindView.setVisibility(View.VISIBLE); } else { @@ -1681,12 +1473,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { int viewType = getItemViewType(position); if (origTitleColors[viewType] == null) // store original color - origTitleColors[viewType] = Integer.valueOf(tv.getCurrentTextColor()); + origTitleColors[viewType] = tv.getCurrentTextColor(); if (score < Article.SCORE_LOW) { tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); } else { - tv.setTextColor(origTitleColors[viewType].intValue()); + tv.setTextColor(origTitleColors[viewType]); tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); } } @@ -1716,7 +1508,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { // returns cloned array without footers public ArticleList getAllArticles() { - ArticleList tmp = (ArticleList) m_articles.clone(); + ArticleList tmp = (ArticleList) Application.getArticles().clone(); tmp.stripFooters(); return tmp; @@ -1740,11 +1532,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } public void setSelection(ArticlesSelection select) { - for (Article a : m_articles) + for (Article a : Application.getArticles()) a.selected = false; if (select != ArticlesSelection.NONE) { - for (Article a : m_articles) { + for (Article a : Application.getArticles()) { if (select == ArticlesSelection.ALL || select == ArticlesSelection.UNREAD && a.unread) { a.selected = true; } @@ -1758,7 +1550,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public Article getArticleAtPosition(int position) { try { - return m_articles.get(position); + return Application.getArticles().get(position); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } catch (Exception e) { @@ -1769,28 +1561,20 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } public Article getArticleById(int id) { - for (Article a : m_articles) { + for (Article a : Application.getArticles()) { if (a.id == id) return a; } return null; } - public ArticleList getUnreadArticles() { - ArticleList tmp = new ArticleList(); - for (Article a : m_articles) { - if (a.unread) tmp.add(a); - } - return tmp; - } - public Article getActiveArticle() { return m_activeArticle; } public int getArticlePositionById(int id) { - for (int i = 0; i < m_articles.size(); i++) { - if (m_articles.get(i).id == id) { + for (int i = 0; i < Application.getArticles().size(); i++) { + if (Application.getArticles().get(i).id == id) { return i + m_adapter.getHeaderCount(); } } @@ -1817,27 +1601,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { return m_feed; } - public void setArticles(ArticleList articles) { - m_articles.clear(); - m_articles.addAll(articles); - - m_articles.add(new Article(Article.TYPE_AMR_FOOTER)); - - m_adapter.notifyDataSetChanged(); - } - - public int pxToDp(int px) { - DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); - int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); - return dp; - } - - public int dpToPx(int dp) { - DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); - int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); - return px; - } - @Override public void onPause() { super.onPause(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/LogcatActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/LogcatActivity.java index 22db9e08..baa17267 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/LogcatActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/LogcatActivity.java @@ -49,12 +49,9 @@ public class LogcatActivity extends CommonActivity { final SwipeRefreshLayout swipeLayout = findViewById(R.id.logcat_swipe_container); - swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(); - swipeLayout.setRefreshing(false); - } + swipeLayout.setOnRefreshListener(() -> { + refresh(); + swipeLayout.setRefreshing(false); }); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java index 9d9d0901..f88ea1a8 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java @@ -3,13 +3,11 @@ package org.fox.ttrss; import android.annotation.SuppressLint; import android.app.Dialog; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.preference.PreferenceManager; import android.util.Log; import android.view.MenuItem; import android.view.View; @@ -23,6 +21,7 @@ import androidx.core.view.WindowInsetsCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import androidx.preference.PreferenceManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -186,9 +185,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList if (!shortcutMode && openFeedId != 0) { Log.d(TAG, "opening feed id: " + openFeedId); - HeadlinesFragment hf = new HeadlinesFragment(); - hf.initialize(new Feed(openFeedId, openFeedTitle, openFeedIsCat)); - ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); + onFeedSelected(new Feed(openFeedId, openFeedTitle, openFeedIsCat), false); } else if (m_drawerLayout != null) { m_drawerLayout.openDrawer(GravityCompat.START); } @@ -212,16 +209,13 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList if (fab != null) { fab.show(); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + fab.setOnClickListener(view -> { + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - if (hf != null && hf.isAdded()) { - hf.refresh(false); - } - } - }); + if (hf != null && hf.isAdded()) { + hf.refresh(false); + } + }); } } @@ -286,24 +280,23 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList m_drawerLayout.closeDrawers(); } - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - FragmentTransaction ft = getSupportFragmentManager() - .beginTransaction(); + Application.getArticles().clear(); - HeadlinesFragment hf = new HeadlinesFragment(); - hf.initialize(feed); + new Handler().postDelayed(() -> { + FragmentTransaction ft = getSupportFragmentManager() + .beginTransaction(); - ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); + HeadlinesFragment hf = new HeadlinesFragment(); + hf.initialize(feed); - ft.commit(); + ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); - m_feedIsSelected = true; - m_userFeedSelected = selectedByUser; + ft.commit(); - } - }, 250); + m_feedIsSelected = true; + m_userFeedSelected = selectedByUser; + + }, 250); Date date = new Date(); @@ -386,24 +379,20 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList .setTitle(getString(R.string.headlines_sort_articles_title)) .setSingleChoiceItems( sortTitles, - selectedIndex, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, - int which) { + selectedIndex, (dialog, which) -> { - try { + try { // Log.d(TAG, "sort selected index:" + which + ": " + sortNames[which]); - setSortMode((String) sortNames[which]); + setSortMode((String) sortNames[which]); - } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); - } + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); + } - dialog.cancel(); + dialog.cancel(); - refresh(); - } + refresh(); }); Dialog dialog = builder.create(); @@ -482,8 +471,8 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList Intent intent = new Intent(MasterActivity.this, DetailActivity.class); intent.putExtra("feed", hf.getFeed()); intent.putExtra("searchQuery", hf.getSearchQuery()); - Application.getInstance().tmpArticleList = hf.getAllArticles(); - Application.getInstance().tmpArticle = article; + + Application.getInstance().tmpActiveArticle = article; startActivityForResult(intent, HEADLINES_REQUEST); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); @@ -525,44 +514,20 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == HEADLINES_REQUEST && data != null) { - ArticleList articles = Application.getInstance().tmpArticleList; - - if (articles != null) { - HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + super.onActivityResult(requestCode, resultCode, data); - if (hf != null) { - hf.setArticles(articles); - } - } - } + if (requestCode == HEADLINES_REQUEST) { + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - super.onActivityResult(requestCode, resultCode, data); - } + if (hf != null) { + hf.notifyUpdated(); - // TODO: remove; not supported on oreo - public void createFeedShortcut(Feed feed) { - final Intent shortcutIntent = new Intent(this, MasterActivity.class); - shortcutIntent.putExtra("feed_id", feed.id); - shortcutIntent.putExtra("feed_is_cat", feed.is_cat); - shortcutIntent.putExtra("feed_title", feed.title); - shortcutIntent.putExtra("shortcut_mode", true); - - Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); - - intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, feed.title); - intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); - intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher)); - intent.putExtra("duplicate", false); - - sendBroadcast(intent); - - toast(R.string.shortcut_has_been_placed_on_the_home_screen); - } + // this makes position in headlines in master activity (not quite) randomly jump around when returning + // even if active article hasn't been changed, i guess keeping it as-is is a lesser evil? - // TODO: remove; not supported on oreo - public void createCategoryShortcut(FeedCategory cat) { - createFeedShortcut(new Feed(cat.id, cat.title, true)); + // hf.setActiveArticle(Application.getInstance().tmpActiveArticle); + } + } } public void unsubscribeFeed(final Feed feed) { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java index 2e73af7f..04629561 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java @@ -3,9 +3,6 @@ package org.fox.ttrss; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.DialogInterface.OnMultiChoiceClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Point; @@ -13,7 +10,6 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.view.Display; import android.view.KeyEvent; @@ -27,6 +23,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.Toolbar; +import androidx.preference.PreferenceManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.gson.Gson; @@ -47,6 +44,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +@SuppressLint("StaticFieldLeak") public class OnlineActivity extends CommonActivity { private final String TAG = this.getClass().getSimpleName(); @@ -81,7 +79,7 @@ public class OnlineActivity extends CommonActivity { searchQuery = ""; } - int titleStringId = searchQuery.length() > 0 ? R.string.catchup_dialog_title_search : R.string.catchup_dialog_title; + int titleStringId = !searchQuery.isEmpty() ? R.string.catchup_dialog_title_search : R.string.catchup_dialog_title; MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(getString(titleStringId, feed.title)) @@ -92,36 +90,26 @@ public class OnlineActivity extends CommonActivity { getString(R.string.catchup_dialog_1week), getString(R.string.catchup_dialog_2week) }, - selectedIndex, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, - int which) { - } - }) + selectedIndex, (dialog, which) -> { + }) .setPositiveButton(R.string.catchup, - new OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - ListView list = ((AlertDialog)dialog).getListView(); + ListView list = ((AlertDialog)dialog).getListView(); - if (list.getCheckedItemCount() > 0) { - int position = list.getCheckedItemPosition(); + if (list.getCheckedItemCount() > 0) { + int position = list.getCheckedItemPosition(); - String[] catchupModes = { "all", "1day", "1week", "2week" }; - String mode = catchupModes[position]; + String[] catchupModes = { "all", "1day", "1week", "2week" }; + String mode = catchupModes[position]; - catchupFeed(feed, mode, true, searchQuery); - } - } - }) + catchupFeed(feed, mode, true, searchQuery); + } + }) .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - } - }); + }); Dialog dialog = builder.create(); dialog.show(); @@ -130,21 +118,11 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setMessage(getString(R.string.catchup_dialog_title, feed.title)) .setPositiveButton(R.string.catchup, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - catchupFeed(feed, "all", true, ""); - - } - }) + (dialog, which) -> catchupFeed(feed, "all", true, "")) .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - } - }); + }); Dialog dialog = builder.create(); dialog.show(); @@ -215,8 +193,6 @@ public class OnlineActivity extends CommonActivity { super.onCreate(savedInstanceState); - SharedPreferences localPrefs = getSharedPreferences("localprefs", Context.MODE_PRIVATE); - setContentView(R.layout.activity_login); Toolbar toolbar = findViewById(R.id.toolbar); @@ -236,27 +212,21 @@ public class OnlineActivity extends CommonActivity { public void login(boolean refresh, OnLoginFinishedListener listener) { - if (m_prefs.getString("ttrss_url", "").trim().length() == 0) { + if (m_prefs.getString("ttrss_url", "").trim().isEmpty()) { setLoadingStatus(R.string.login_need_configure); MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setMessage(R.string.dialog_need_configure_prompt) .setCancelable(false) - .setPositiveButton(R.string.dialog_open_preferences, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // launch preferences - - Intent intent = new Intent(OnlineActivity.this, - PreferencesActivity.class); - startActivityForResult(intent, 0); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); + .setPositiveButton(R.string.dialog_open_preferences, (dialog, id) -> { + // launch preferences + + Intent intent = new Intent(OnlineActivity.this, + PreferencesActivity.class); + startActivityForResult(intent, 0); + }) + .setNegativeButton(R.string.cancel, (dialog, id) -> dialog.cancel()); Dialog alert = builder.create(); alert.show(); @@ -266,7 +236,7 @@ public class OnlineActivity extends CommonActivity { LoginRequest ar = new LoginRequest(getApplicationContext(), refresh, listener); - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("op", "login"); map.put("user", m_prefs.getString("login", "").trim()); map.put("password", m_prefs.getString("password", "").trim()); @@ -293,9 +263,6 @@ public class OnlineActivity extends CommonActivity { @Override public boolean onContextItemSelected(android.view.MenuItem item) { - /* AdapterContextMenuInfo info = (AdapterContextMenuInfo) item - .getMenuInfo(); */ - final ArticlePager ap = (ArticlePager)getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); int itemId = item.getItemId(); @@ -345,13 +312,13 @@ public class OnlineActivity extends CommonActivity { } public void displayAttachments(Article article) { - if (article != null && article.attachments != null && article.attachments.size() > 0) { + if (article != null && article.attachments != null && !article.attachments.isEmpty()) { CharSequence[] items = new CharSequence[article.attachments.size()]; final CharSequence[] itemUrls = new CharSequence[article.attachments.size()]; for (int i = 0; i < article.attachments.size(); i++) { - items[i] = article.attachments.get(i).title != null ? article.attachments.get(i).content_url : - article.attachments.get(i).content_url; + items[i] = article.attachments.get(i).title != null && !article.attachments.get(i).title.isEmpty() ? + article.attachments.get(i).title : article.attachments.get(i).content_url; itemUrls[i] = article.attachments.get(i).content_url; } @@ -359,35 +326,19 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(R.string.attachments_prompt) .setCancelable(true) - .setSingleChoiceItems(items, 0, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // - } - }).setNeutralButton(R.string.attachment_copy, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); + .setSingleChoiceItems(items, 0, (dialog, which) -> { + // + }).setNeutralButton(R.string.attachment_copy, (dialog, which) -> { + int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); - copyToClipboard((String)itemUrls[selectedPosition]); - } - }).setPositiveButton(R.string.attachment_view, new OnClickListener() { + copyToClipboard((String)itemUrls[selectedPosition]); + }).setPositiveButton(R.string.attachment_view, (dialog, id) -> { + int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); - @Override - public void onClick(DialogInterface dialog, int id) { - int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); + openUri(Uri.parse((String)itemUrls[selectedPosition])); - openUri(Uri.parse((String)itemUrls[selectedPosition])); - - dialog.cancel(); - } - }).setNegativeButton(R.string.dialog_cancel, new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); + dialog.cancel(); + }).setNegativeButton(R.string.dialog_cancel, (dialog, id) -> dialog.cancel()); Dialog dialog = builder.create(); dialog.show(); @@ -426,38 +377,26 @@ public class OnlineActivity extends CommonActivity { return true; } else if (itemId == R.id.search) { if (hf != null) { - Dialog dialog = new Dialog(this); - final EditText edit = new EditText(this); MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(R.string.search) .setPositiveButton(getString(R.string.search), - new OnClickListener() { + (dialog4, which) -> { - @Override - public void onClick(DialogInterface dialog, - int which) { + String query = edit.getText().toString().trim(); - String query = edit.getText().toString().trim(); + hf.setSearchQuery(query); - hf.setSearchQuery(query); - - } }) .setNegativeButton(getString(R.string.cancel), - new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, - int which) { + (dialog3, which) -> { - // + // - } }).setView(edit); - dialog = builder.create(); + Dialog dialog = builder.create(); dialog.show(); } return true; @@ -473,8 +412,6 @@ public class OnlineActivity extends CommonActivity { return true; } else if (itemId == R.id.headlines_display_mode) { if (hf != null) { - Dialog dialog = new Dialog(this); - String headlineMode = m_prefs.getString("headline_mode", "HL_DEFAULT"); String[] headlineModeNames = getResources().getStringArray(R.array.headline_mode_names); final String[] headlineModeValues = getResources().getStringArray(R.array.headline_mode_values); @@ -484,56 +421,53 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(R.string.headlines_set_view_mode) .setSingleChoiceItems(headlineModeNames, - selectedIndex, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, - int which) { - dialog.cancel(); + selectedIndex, (dialog2, which) -> { + dialog2.cancel(); - SharedPreferences.Editor editor = m_prefs.edit(); - editor.putString("headline_mode", headlineModeValues[which]); - editor.apply(); + SharedPreferences.Editor editor = m_prefs.edit(); + editor.putString("headline_mode", headlineModeValues[which]); + editor.apply(); - Intent intent = getIntent(); + Intent intent = getIntent(); - Feed feed = hf.getFeed(); + Feed feed = hf.getFeed(); - if (feed != null) { - intent.putExtra("feed_id", feed.id); - intent.putExtra("feed_is_cat", feed.is_cat); - intent.putExtra("feed_title", feed.title); - } + if (feed != null) { + intent.putExtra("feed_id", feed.id); + intent.putExtra("feed_is_cat", feed.is_cat); + intent.putExtra("feed_title", feed.title); + } - finish(); + finish(); - startActivity(intent); - overridePendingTransition(0, 0); - } + startActivity(intent); + overridePendingTransition(0, 0); }); - dialog = builder.create(); + Dialog dialog = builder.create(); dialog.show(); } return true; } else if (itemId == R.id.headlines_view_mode) { if (hf != null) { - Dialog dialog = new Dialog(this); - String viewMode = getViewMode(); - //Log.d(TAG, "viewMode:" + getViewMode()); - int selectedIndex = 0; - if (viewMode.equals("all_articles")) { - selectedIndex = 1; - } else if (viewMode.equals("marked")) { - selectedIndex = 2; - } else if (viewMode.equals("published")) { - selectedIndex = 3; - } else if (viewMode.equals("unread")) { - selectedIndex = 4; + switch (viewMode) { + case "all_articles": + selectedIndex = 1; + break; + case "marked": + selectedIndex = 2; + break; + case "published": + selectedIndex = 3; + break; + case "unread": + selectedIndex = 4; + break; } MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) @@ -545,34 +479,30 @@ public class OnlineActivity extends CommonActivity { getString(R.string.headlines_starred), getString(R.string.headlines_published), getString(R.string.headlines_unread)}, - selectedIndex, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, - int which) { - switch (which) { - case 0: - setViewMode("adaptive"); - break; - case 1: - setViewMode("all_articles"); - break; - case 2: - setViewMode("marked"); - break; - case 3: - setViewMode("published"); - break; - case 4: - setViewMode("unread"); - break; - } - dialog.cancel(); - - refresh(); + selectedIndex, (dialog1, which) -> { + switch (which) { + case 0: + setViewMode("adaptive"); + break; + case 1: + setViewMode("all_articles"); + break; + case 2: + setViewMode("marked"); + break; + case 3: + setViewMode("published"); + break; + case 4: + setViewMode("unread"); + break; } + dialog1.cancel(); + + refresh(); }); - dialog = builder.create(); + Dialog dialog = builder.create(); dialog.show(); } @@ -586,24 +516,20 @@ public class OnlineActivity extends CommonActivity { getString(R.string.headlines_select_all), getString(R.string.headlines_select_unread), getString(R.string.headlines_select_none)}, - 0, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, - int which) { - switch (which) { - case 0: - hf.setSelection(HeadlinesFragment.ArticlesSelection.ALL); - break; - case 1: - hf.setSelection(HeadlinesFragment.ArticlesSelection.UNREAD); - break; - case 2: - hf.setSelection(HeadlinesFragment.ArticlesSelection.NONE); - break; - } - dialog.cancel(); - invalidateOptionsMenu(); + 0, (dialog, which) -> { + switch (which) { + case 0: + hf.setSelection(HeadlinesFragment.ArticlesSelection.ALL); + break; + case 1: + hf.setSelection(HeadlinesFragment.ArticlesSelection.UNREAD); + break; + case 2: + hf.setSelection(HeadlinesFragment.ArticlesSelection.NONE); + break; } + dialog.cancel(); + invalidateOptionsMenu(); }); Dialog dialog = builder.create(); @@ -650,7 +576,7 @@ public class OnlineActivity extends CommonActivity { if (hf != null) { ArticleList selected = hf.getSelectedArticles(); - if (selected.size() > 0) { + if (!selected.isEmpty()) { for (Article a : selected) a.unread = !a.unread; @@ -664,7 +590,7 @@ public class OnlineActivity extends CommonActivity { if (hf != null) { ArticleList selected = hf.getSelectedArticles(); - if (selected.size() > 0) { + if (!selected.isEmpty()) { for (Article a : selected) a.marked = !a.marked; @@ -678,7 +604,7 @@ public class OnlineActivity extends CommonActivity { if (hf != null) { ArticleList selected = hf.getSelectedArticles(); - if (selected.size() > 0) { + if (!selected.isEmpty()) { for (Article a : selected) a.published = !a.published; @@ -702,20 +628,10 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setMessage(R.string.confirm_catchup_above) .setPositiveButton(R.string.dialog_ok, - new OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - catchupAbove(hf, ap); - - } - }) + (dialog, which) -> catchupAbove(hf, ap)) .setNegativeButton(R.string.dialog_cancel, - new OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - } }); Dialog dialog = builder.create(); @@ -733,12 +649,6 @@ public class OnlineActivity extends CommonActivity { } return true; - /*case R.id.update_headlines: - if (hf != null) { - //m_pullToRefreshAttacher.setRefreshing(true); - hf.refresh(false, true); - } - return true;*/ } Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId()); return super.onOptionsItemSelected(item); @@ -759,7 +669,7 @@ public class OnlineActivity extends CommonActivity { tmp.add(a); } } - if (tmp.size() > 0) { + if (!tmp.isEmpty()) { toggleArticlesUnread(tmp); hf.notifyUpdated(); invalidateOptionsMenu(); @@ -767,39 +677,6 @@ public class OnlineActivity extends CommonActivity { } } - /* protected void catchupVisibleArticles() { - final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - - if (hf != null) { - ArticleList articles = hf.getUnreadArticles(); - - for (Article a : articles) - a.unread = false; - - ApiRequest req = new ApiRequest(getApplicationContext()) { - protected void onPostExecute(JsonElement result) { - if (hf.isAdded()) { - hf.refresh(false); - } - } - }; - - final String articleIds = articlesToIdString(articles); - - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>() { - { - put("sid", getSessionId()); - put("op", "updateArticle"); - put("article_ids", articleIds); - put("mode", "0"); - put("field", "2"); - } - }; - req.execute(map); - } - } */ - public void editArticleNote(final Article article) { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(article.title); @@ -808,25 +685,21 @@ public class OnlineActivity extends CommonActivity { topicEdit.setText(article.note); builder.setView(topicEdit); - builder.setPositiveButton(R.string.article_edit_note, new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - String note = topicEdit.getText().toString().trim(); - - saveArticleNote(article, note); - - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - if (hf != null) hf.notifyUpdated(); - - ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); - if (ap != null) ap.notifyUpdated(); - } - }); + builder.setPositiveButton(R.string.article_edit_note, (dialog, which) -> { + String note = topicEdit.getText().toString().trim(); + + saveArticleNote(article, note); + + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + if (hf != null) hf.notifyUpdated(); + + ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + if (ap != null) ap.notifyUpdated(); + }); - builder.setNegativeButton(R.string.dialog_cancel, new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - // - } - }); + builder.setNegativeButton(R.string.dialog_cancel, (dialog, which) -> { + // + }); Dialog dialog = builder.create(); dialog.show(); @@ -854,31 +727,20 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(OnlineActivity.this) .setTitle(R.string.article_set_labels) - .setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which, final boolean isChecked) { - final int labelId = itemIds[which]; - - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); - map.put("sid", getSessionId()); - map.put("op", "setArticleLabel"); - map.put("label_id", String.valueOf(labelId)); - map.put("article_ids", String.valueOf(articleId)); - if (isChecked) map.put("assign", "true"); - - ApiRequest req = new ApiRequest(OnlineActivity.this); - req.execute(map); - - } - }).setPositiveButton(R.string.dialog_close, new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); + .setMultiChoiceItems(items, checkedItems, (dialog, which, isChecked) -> { + final int labelId = itemIds[which]; + + HashMap<String, String> map = new HashMap<>(); + map.put("sid", getSessionId()); + map.put("op", "setArticleLabel"); + map.put("label_id", String.valueOf(labelId)); + map.put("article_ids", String.valueOf(articleId)); + if (isChecked) map.put("assign", "true"); + + ApiRequest req1 = new ApiRequest(OnlineActivity.this); + req1.execute(map); + + }).setPositiveButton(R.string.dialog_close, (dialog, which) -> dialog.cancel()); Dialog dialog = builder.create(); dialog.show(); @@ -887,8 +749,7 @@ public class OnlineActivity extends CommonActivity { } }; - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "getLabels"); map.put("article_id", String.valueOf(articleId)); @@ -956,7 +817,6 @@ public class OnlineActivity extends CommonActivity { Application.getInstance().m_apiLevel = apiLevel; } - @SuppressWarnings({ "unchecked", "serial" }) public void saveArticleUnread(final Article article) { ApiRequest req = new ApiRequest(getApplicationContext()) { protected void onPostExecute(JsonElement result) { @@ -965,7 +825,7 @@ public class OnlineActivity extends CommonActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); map.put("article_ids", String.valueOf(article.id)); @@ -983,7 +843,7 @@ public class OnlineActivity extends CommonActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); map.put("article_ids", String.valueOf(article.id)); @@ -1001,7 +861,7 @@ public class OnlineActivity extends CommonActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); map.put("article_ids", String.valueOf(article.id)); @@ -1011,7 +871,6 @@ public class OnlineActivity extends CommonActivity { req.execute(map); } - @SuppressWarnings({ "unchecked", "serial" }) public void saveArticlePublished(final Article article) { ApiRequest req = new ApiRequest(getApplicationContext()) { @@ -1021,7 +880,7 @@ public class OnlineActivity extends CommonActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); map.put("article_ids", String.valueOf(article.id)); @@ -1031,7 +890,6 @@ public class OnlineActivity extends CommonActivity { req.execute(map); } - @SuppressWarnings({ "unchecked", "serial" }) public void saveArticleNote(final Article article, final String note) { ApiRequest req = new ApiRequest(getApplicationContext()) { protected void onPostExecute(JsonElement result) { @@ -1039,7 +897,7 @@ public class OnlineActivity extends CommonActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); map.put("article_ids", String.valueOf(article.id)); @@ -1050,15 +908,6 @@ public class OnlineActivity extends CommonActivity { req.execute(map); } - public static String articlesToIdString(ArticleList articles) { - String tmp = ""; - - for (Article a : articles) - tmp += a.id + ","; - - return tmp.replaceAll(",$", ""); - } - public void shareArticle(Article article) { if (article != null) { shareText(article.link, article.title); @@ -1072,33 +921,23 @@ public class OnlineActivity extends CommonActivity { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setTitle(R.string.score_for_this_article) .setPositiveButton(R.string.set_score, - new DialogInterface.OnClickListener() { + (dialog, which) -> { - @Override - public void onClick(DialogInterface dialog, - int which) { + try { +article.score = Integer.parseInt(edit.getText().toString()); - try { - article.score = Integer.parseInt(edit.getText().toString()); - - saveArticleScore(article); - } catch (NumberFormatException e) { - toast(R.string.score_invalid); - e.printStackTrace(); - } - } - }) + saveArticleScore(article); + } catch (NumberFormatException e) { + toast(R.string.score_invalid); + e.printStackTrace(); + } + }) .setNegativeButton(getString(R.string.cancel), - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, - int which) { + (dialog, which) -> { - // + // - } - }).setView(edit); + }).setView(edit); Dialog dialog = builder.create(); dialog.show(); @@ -1186,8 +1025,7 @@ public class OnlineActivity extends CommonActivity { } }; - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "catchupFeed"); map.put("feed_id", String.valueOf(feed.id)); @@ -1203,11 +1041,10 @@ public class OnlineActivity extends CommonActivity { public void toggleArticlesMarked(final ArticleList articles) { ApiRequest req = new ApiRequest(getApplicationContext()); - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); - map.put("article_ids", articlesToIdString(articles)); + map.put("article_ids", articles.getAsCommaSeparatedIds()); map.put("mode", "2"); map.put("field", "0"); @@ -1217,12 +1054,11 @@ public class OnlineActivity extends CommonActivity { public void toggleArticlesUnread(final ArticleList articles) { ApiRequest req = new ApiRequest(getApplicationContext()); - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); - map.put("article_ids", articlesToIdString(articles)); - map.put("mode", "2"); + map.put("article_ids", articles.getAsCommaSeparatedIds()); + map.put("mode", "2"); map.put("field", "2"); req.execute(map); @@ -1232,12 +1068,11 @@ public class OnlineActivity extends CommonActivity { public void toggleArticlesPublished(final ArticleList articles) { ApiRequest req = new ApiRequest(getApplicationContext()); - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "updateArticle"); - map.put("article_ids", articlesToIdString(articles)); - map.put("mode", "2"); + map.put("article_ids", articles.getAsCommaSeparatedIds()); + map.put("mode", "2"); map.put("field", "1"); req.execute(map); @@ -1280,13 +1115,13 @@ public class OnlineActivity extends CommonActivity { HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); if (hf != null && !m_forceDisableActionMode) { - if (hf.getSelectedArticles().size() > 0) { + if (!hf.getSelectedArticles().isEmpty()) { if (m_headlinesActionMode == null) { m_headlinesActionMode = startSupportActionMode(m_headlinesActionModeCallback); } m_headlinesActionMode.setTitle(String.valueOf(hf.getSelectedArticles().size())); - } else if (hf.getSelectedArticles().size() == 0 && m_headlinesActionMode != null) { + } else if (hf.getSelectedArticles().isEmpty() && m_headlinesActionMode != null) { m_headlinesActionMode.finish(); } } else if (m_forceDisableActionMode && m_headlinesActionMode != null) { @@ -1328,7 +1163,7 @@ public class OnlineActivity extends CommonActivity { } protected class LoginRequest extends ApiRequest { - boolean m_refreshAfterLogin = false; + boolean m_refreshAfterLogin; OnLoginFinishedListener m_listener; public LoginRequest(Context context, boolean refresh, OnLoginFinishedListener listener) { @@ -1337,7 +1172,6 @@ public class OnlineActivity extends CommonActivity { m_listener = listener; } - @SuppressWarnings("unchecked") @SuppressLint("StaticFieldLeak") protected void onPostExecute(JsonElement result) { if (result != null) { @@ -1410,13 +1244,10 @@ public class OnlineActivity extends CommonActivity { Log.d(TAG, "Received API level: " + getApiLevel()); loginSuccess(m_refreshAfterLogin); - - return; } }; - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", getSessionId()); map.put("op", "getApiLevel"); @@ -1447,7 +1278,7 @@ public class OnlineActivity extends CommonActivity { } public LinkedHashMap<String, String> getSortModes() { - LinkedHashMap<String, String> tmp = new LinkedHashMap<String, String>(); + LinkedHashMap<String, String> tmp = new LinkedHashMap<>(); tmp.put("default", getString(R.string.headlines_sort_default)); tmp.put("feed_dates", getString(R.string.headlines_sort_newest_first)); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java index 9ac9f56c..c880161a 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java @@ -1,11 +1,11 @@ package org.fox.ttrss; import android.os.Bundle; -import android.preference.PreferenceManager; import android.view.MenuItem; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentTransaction; +import androidx.preference.PreferenceManager; public class PreferencesActivity extends CommonActivity { @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesFragment.java index 6e4c10f5..6b7728a4 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesFragment.java @@ -6,9 +6,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; @@ -26,26 +24,20 @@ public class PreferencesFragment extends PreferenceFragmentCompat { findPreference("ttrss_url").setSummary(prefs.getString("ttrss_url", getString(R.string.ttrss_url_summary))); findPreference("login").setSummary(prefs.getString("login", getString(R.string.login_summary))); - findPreference("show_logcat").setOnPreferenceClickListener(new androidx.preference.Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(@NonNull androidx.preference.Preference preference) { - Intent intent = new Intent(getActivity(), LogcatActivity.class); - startActivity(intent); - return false; - } + findPreference("show_logcat").setOnPreferenceClickListener(preference -> { + Intent intent = new Intent(getActivity(), LogcatActivity.class); + startActivity(intent); + return false; }); - findPreference("network_settings").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - getActivity().getSupportFragmentManager() - .beginTransaction() - .replace(R.id.preferences_container, new NetworkPreferencesFragment() ) - .addToBackStack( NetworkPreferencesFragment.class.getSimpleName() ) - .commit(); - - return false; - } + findPreference("network_settings").setOnPreferenceClickListener(preference -> { + getActivity().getSupportFragmentManager() + .beginTransaction() + .replace(R.id.preferences_container, new NetworkPreferencesFragment() ) + .addToBackStack( NetworkPreferencesFragment.class.getSimpleName() ) + .commit(); + + return false; }); CommonActivity activity = (CommonActivity) getActivity(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java index 91e0ecf8..312988bf 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java @@ -40,14 +40,12 @@ public class OkHttpProgressGlideModule implements GlideModule { } private static Interceptor createInterceptor(final ResponseProgressListener listener) { - return new Interceptor() { - @Override public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); - Response response = chain.proceed(request); - return response.newBuilder() - .body(new OkHttpProgressResponseBody(request.url(), response.body(), listener)) - .build(); - } + return chain -> { + Request request = chain.request(); + Response response = chain.proceed(request); + return response.newBuilder() + .body(new OkHttpProgressResponseBody(request.url(), response.body(), listener)) + .build(); }; } @@ -101,11 +99,7 @@ public class OkHttpProgressGlideModule implements GlideModule { forget(key); } if (needsDispatch(key, bytesRead, contentLength, listener.getGranualityPercentage())) { - handler.post(new Runnable() { - @Override public void run() { - listener.onProgress(bytesRead, contentLength); - } - }); + handler.post(() -> listener.onProgress(bytesRead, contentLength)); } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java index ca13c746..5796f289 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java @@ -1,16 +1,16 @@ package org.fox.ttrss.share; import android.app.Dialog; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import androidx.preference.PreferenceManager; + import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.fox.ttrss.ApiRequest; @@ -53,25 +53,19 @@ public abstract class CommonShareActivity extends CommonActivity { public void login(int requestId) { - if (m_prefs.getString("ttrss_url", "").trim().length() == 0) { + if (m_prefs.getString("ttrss_url", "").trim().isEmpty()) { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) .setMessage(R.string.dialog_need_configure_prompt) .setCancelable(false) - .setPositiveButton(R.string.dialog_open_preferences, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // launch preferences - - Intent intent = new Intent(CommonShareActivity.this, - PreferencesActivity.class); - startActivityForResult(intent, 0); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); + .setPositiveButton(R.string.dialog_open_preferences, (dialog, id) -> { + // launch preferences + + Intent intent = new Intent(CommonShareActivity.this, + PreferencesActivity.class); + startActivityForResult(intent, 0); + }) + .setNegativeButton(R.string.cancel, (dialog, id) -> dialog.cancel()); Dialog alert = builder.create(); alert.show(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java index 9e391411..3a1553b6 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java @@ -2,7 +2,6 @@ package org.fox.ttrss.share; import android.content.Intent; import android.os.Bundle; -import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; @@ -53,12 +52,7 @@ public class ShareActivity extends CommonShareActivity { m_button = (Button) findViewById(R.id.share_button); - m_button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - login(0); - } - }); + m_button.setOnClickListener(v -> login(0)); } @Override @@ -108,7 +102,7 @@ public class ShareActivity extends CommonShareActivity { final EditText content = (EditText) findViewById(R.id.content); if (url != null && title != null && content != null) { - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", m_sessionId); map.put("op", "shareToPublished"); map.put("title", title.getText().toString()); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java index df0c82f9..e71583d3 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java @@ -39,8 +39,8 @@ public class SubscribeActivity extends CommonShareActivity { private Button m_catButton; private CatListAdapter m_catAdapter; private FeedListAdapter m_feedAdapter; - private FeedCategoryList m_cats = new FeedCategoryList(); - private ArrayList<Map.Entry<String, JsonElement>> m_feeds = new ArrayList<Map.Entry<String, JsonElement>>(); + private final FeedCategoryList m_cats = new FeedCategoryList(); + private final ArrayList<Map.Entry<String, JsonElement>> m_feeds = new ArrayList<>(); private ProgressBar m_progressBar; private static final int REQ_CATS = 1; @@ -95,7 +95,7 @@ public class SubscribeActivity extends CommonShareActivity { m_progressBar = (ProgressBar) findViewById(R.id.subscribe_progress); Spinner catList = (Spinner) findViewById(R.id.category_spinner); - if (m_cats.size() == 0) m_cats.add(new FeedCategory(0, "Uncategorized", 0)); + if (m_cats.isEmpty()) m_cats.add(new FeedCategory(0, "Uncategorized", 0)); m_catAdapter = new CatListAdapter(this, android.R.layout.simple_spinner_dropdown_item, m_cats); catList.setAdapter(m_catAdapter); @@ -127,21 +127,11 @@ public class SubscribeActivity extends CommonShareActivity { m_postButton = (Button) findViewById(R.id.subscribe_button); - m_postButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - login(REQ_POST); - } - }); + m_postButton.setOnClickListener(v -> login(REQ_POST)); m_catButton = (Button) findViewById(R.id.cats_button); - m_catButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - login(REQ_CATS); - } - }); + m_catButton.setOnClickListener(v -> login(REQ_CATS)); login(REQ_CATS); } @@ -237,7 +227,7 @@ public class SubscribeActivity extends CommonShareActivity { final EditText feedUrl = (EditText) findViewById(R.id.feed_url); if (feedUrl != null ) { - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", m_sessionId); map.put("op", "subscribeToFeed"); map.put("feed_url", feedUrl.getText().toString()); @@ -299,7 +289,7 @@ public class SubscribeActivity extends CommonShareActivity { } }; - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", m_sessionId); map.put("op", "getCategories"); @@ -326,7 +316,7 @@ public class SubscribeActivity extends CommonShareActivity { } private static class CatListAdapter extends ArrayAdapter<String> { - private List<FeedCategory> m_items; + private final List<FeedCategory> m_items; public CatListAdapter(Context context, int resource, List<FeedCategory> items) { @@ -355,7 +345,7 @@ public class SubscribeActivity extends CommonShareActivity { } private static class FeedListAdapter extends ArrayAdapter<String> { - private List<Map.Entry<String, JsonElement>> m_items; + private final List<Map.Entry<String, JsonElement>> m_items; public FeedListAdapter(Context context, int resource, List<Map.Entry<String, JsonElement>> items) { super(context, resource); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java index 0a49252b..f66df08d 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java @@ -26,7 +26,7 @@ public class Article implements Parcelable { public int id; public boolean unread; - public boolean marked; + public boolean marked; public boolean published; public int score; public int updated; @@ -78,13 +78,13 @@ public class Article implements Parcelable { } public void collectMediaInfo() { - if (flavor_image != null && flavor_image.length() > 0) { + if (flavor_image != null && !flavor_image.isEmpty()) { flavorImageUri = flavor_image; flavorImage = new Element("img") .attr("src", flavorImageUri); - if (flavor_stream != null && flavor_stream.length() > 0) { + if (flavor_stream != null && !flavor_stream.isEmpty()) { flavorStreamUri = flavor_stream; } @@ -127,7 +127,7 @@ public class Article implements Parcelable { String srcEmbed = flavorImage.attr("src"); - if (srcEmbed.length() > 0) { + if (!srcEmbed.isEmpty()) { Pattern pattern = Pattern.compile("/embed/([\\w-]+)"); Matcher matcher = pattern.matcher(srcEmbed); @@ -141,7 +141,7 @@ public class Article implements Parcelable { } else { flavorImageUri = flavorImage.attr("src"); - if (flavorImageUri.length() > 0 && flavorImageUri.startsWith("//")) { + if (!flavorImageUri.isEmpty() && flavorImageUri.startsWith("//")) { flavorImageUri = "https:" + flavorImageUri; } @@ -157,7 +157,7 @@ public class Article implements Parcelable { } } - if (flavorImageUri == null || flavorImageUri.length() == 0) { + if (flavorImageUri == null || flavorImageUri.isEmpty()) { // consider attachments if (attachments != null) { for (Attachment a : attachments) { @@ -185,7 +185,7 @@ public class Article implements Parcelable { this.id = id; this.title = "ID:" + id; this.link = ""; - this.tags = new ArrayList<String>(); + this.tags = new ArrayList<>(); } @Override @@ -231,13 +231,13 @@ public class Article implements Parcelable { link = in.readString(); feed_id = in.readInt(); - if (tags == null) tags = new ArrayList<String>(); + if (tags == null) tags = new ArrayList<>(); in.readStringList(tags); content = in.readString(); excerpt = in.readString(); - attachments = new ArrayList<Attachment>(); + attachments = new ArrayList<>(); in.readList(attachments, Attachment.class.getClassLoader()); feed_title = in.readString(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java index bee0a46d..bd108b25 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java @@ -3,10 +3,10 @@ package org.fox.ttrss.types; import android.os.Parcel; import android.os.Parcelable; -import java.util.ArrayList; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; -@SuppressWarnings("serial") -public class ArticleList extends ArrayList<Article> implements Parcelable { +public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcelable { @Override public int describeContents() { return 0; @@ -55,6 +55,11 @@ public class ArticleList extends ArrayList<Article> implements Parcelable { } } + public String getAsCommaSeparatedIds() { + return this.stream().map(a -> String.valueOf(a.id)) + .collect(Collectors.joining(",")); + } + @SuppressWarnings("rawtypes") public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Attachment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Attachment.java index 6df0cb10..70212800 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Attachment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Attachment.java @@ -39,7 +39,7 @@ public class Attachment implements Parcelable { } public String toString() { - if (title != null && title.length() > 0) { + if (title != null && !title.isEmpty()) { return title; } else { try { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategoryList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategoryList.java index 1671e8e8..ba8caaec 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategoryList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategoryList.java @@ -5,7 +5,6 @@ import android.os.Parcelable; import java.util.ArrayList; -@SuppressWarnings("serial") public class FeedCategoryList extends ArrayList<FeedCategory> implements Parcelable { public FeedCategoryList() { } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedList.java index fe4b8557..08164361 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedList.java @@ -5,7 +5,6 @@ import android.os.Parcelable; import java.util.ArrayList; -@SuppressWarnings("serial") public class FeedList extends ArrayList<Feed> implements Parcelable { public FeedList() { } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DatabaseHelper.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DatabaseHelper.java deleted file mode 100644 index e80f7116..00000000 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DatabaseHelper.java +++ /dev/null @@ -1,140 +0,0 @@ -package org.fox.ttrss.util; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.provider.BaseColumns; - - -public class DatabaseHelper extends SQLiteOpenHelper { - - @SuppressWarnings("unused") - private final String TAG = this.getClass().getSimpleName(); - public static final String DATABASE_NAME = "OfflineStorage.db"; - public static final int DATABASE_VERSION = 5; - private static DatabaseHelper m_instance; - private Context m_context; - - private DatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - m_context = context; - } - - public static synchronized DatabaseHelper getInstance(Context context) { - - if (m_instance == null) { - m_instance = new DatabaseHelper(context.getApplicationContext()); - } - - return m_instance; - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL("DROP VIEW IF EXISTS cats_unread;"); - db.execSQL("DROP VIEW IF EXISTS feeds_unread;"); - db.execSQL("DROP TRIGGER IF EXISTS articles_set_modified;"); - db.execSQL("DROP TABLE IF EXISTS categories;"); - db.execSQL("DROP TABLE IF EXISTS feeds;"); - db.execSQL("DROP TABLE IF EXISTS articles;"); - - db.execSQL("CREATE TABLE IF NOT EXISTS feeds (" + - BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + - "feed_url TEXT, " + - "title TEXT, " + - "has_icon BOOLEAN, " + - "cat_id INTEGER" + - ");"); - - db.execSQL("CREATE TABLE IF NOT EXISTS categories (" + - BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + - "title TEXT" + - ");"); - - db.execSQL("CREATE TABLE IF NOT EXISTS articles (" + - BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + - "unread BOOLEAN, " + - "marked BOOLEAN, " + - "published BOOLEAN, " + - "score INTEGER, " + - "updated INTEGER, " + - "is_updated BOOLEAN, " + - "title TEXT, " + - "link TEXT, " + - "feed_id INTEGER, " + - "tags TEXT, " + - "content TEXT, " + - "author TEXT, " + - "selected BOOLEAN, " + - "modified BOOLEAN," + - "modified_published BOOLEAN," + - "modified_marked BOOLEAN" + - ");"); - - db.execSQL("CREATE TRIGGER articles_set_modified UPDATE OF marked, published, unread ON articles " + - "BEGIN " + - " UPDATE articles SET modified = 1 WHERE " + BaseColumns._ID + " = " + "OLD." + BaseColumns._ID + "; " + - "END;"); - - db.execSQL("CREATE VIEW feeds_unread AS SELECT feeds."+BaseColumns._ID+" AS "+BaseColumns._ID+", " + - "feeds.title AS title, " + - "cat_id, " + - "SUM(articles.unread) AS unread FROM feeds " + - "LEFT JOIN articles ON (articles.feed_id = feeds."+BaseColumns._ID+") " + - "GROUP BY feeds."+BaseColumns._ID+", feeds.title;"); - - //sqlite> select categories._id,categories.title,sum(articles.unread) from categories left j - //oin feeds on (feeds.cat_id = categories._id) left join articles on (articles.feed_id = fee - //ds._id) group by categories._id; - - db.execSQL("CREATE VIEW cats_unread AS SELECT categories."+BaseColumns._ID+" AS "+BaseColumns._ID+", " + - "categories.title AS title, " + - "SUM(articles.unread) AS unread FROM categories " + - "LEFT JOIN feeds ON (feeds.cat_id = categories."+BaseColumns._ID+") "+ - "LEFT JOIN articles ON (articles.feed_id = feeds."+BaseColumns._ID+") " + - "GROUP BY categories."+BaseColumns._ID+", categories.title;"); - - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - onCreate(db); - } - - public boolean hasPendingOfflineData() { - try { - Cursor c = getReadableDatabase().query("articles", - new String[] { "COUNT(*)" }, "modified = 1", null, null, null, - null); - if (c.moveToFirst()) { - int modified = c.getInt(0); - c.close(); - - return modified > 0; - } - } catch (IllegalStateException e) { - // db is closed? ugh - } - - return false; - } - - public boolean hasOfflineData() { - try { - Cursor c = getReadableDatabase().query("articles", - new String[] { "COUNT(*)" }, null, null, null, null, null); - if (c.moveToFirst()) { - int modified = c.getInt(0); - c.close(); - - return modified > 0; - } - } catch (IllegalStateException e) { - // db is closed? - } - - return false; - } - -} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java index 1d7b15df..e6371ff1 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DetailActivityScrollingViewBehavior.java @@ -2,13 +2,13 @@ package org.fox.ttrss.util; import android.content.Context; import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.util.AttributeSet; import android.view.View; import androidx.annotation.NonNull; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.view.ViewCompat; +import androidx.preference.PreferenceManager; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.bottomappbar.BottomAppBar; @@ -18,7 +18,7 @@ import java.util.List; public class DetailActivityScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { - private SharedPreferences m_prefs; + private final SharedPreferences m_prefs; public DetailActivityScrollingViewBehavior(Context context, AttributeSet attrs) { super(context, attrs); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java index fb2218c1..898cad88 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java @@ -51,17 +51,18 @@ public class HeaderViewRecyclerAdapter extends RecyclerView.Adapter<RecyclerView private static final int ADAPTER_MAX_TYPES = 100; private RecyclerView.Adapter mWrappedAdapter; - private List<View> mHeaderViews, mFooterViews; - private Map<Class, Integer> mItemTypesOffset; + private final List<View> mHeaderViews; + private final List<View> mFooterViews; + private final Map<Class, Integer> mItemTypesOffset; /** * Construct a new header view recycler adapter * @param adapter The underlying adapter to wrap */ public HeaderViewRecyclerAdapter(RecyclerView.Adapter adapter) { - mHeaderViews = new ArrayList<View>(); - mFooterViews = new ArrayList<View>(); - mItemTypesOffset = new HashMap<Class, Integer>(); + mHeaderViews = new ArrayList<>(); + mFooterViews = new ArrayList<>(); + mItemTypesOffset = new HashMap<>(); setWrappedAdapter(adapter); } @@ -176,7 +177,7 @@ public class HeaderViewRecyclerAdapter extends RecyclerView.Adapter<RecyclerView return mItemTypesOffset.get(mWrappedAdapter.getClass()); } - private RecyclerView.AdapterDataObserver mDataObserver = new RecyclerView.AdapterDataObserver() { + private final RecyclerView.AdapterDataObserver mDataObserver = new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java index 1df20837..49883d23 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java @@ -24,9 +24,9 @@ public class HeadlinesRequest extends ApiRequest { private final String TAG = this.getClass().getSimpleName(); private int m_offset = 0; - private OnlineActivity m_activity; - private ArticleList m_articles; // = new ArticleList(); //Application.getInstance().m_loadedArticles; - private Feed m_feed; + private final OnlineActivity m_activity; + private final ArticleList m_articles; // = new ArticleList(); //Application.getInstance().m_loadedArticles; + private final Feed m_feed; protected boolean m_firstIdChanged = false; protected int m_firstId = 0; @@ -72,8 +72,6 @@ public class HeadlinesRequest extends ApiRequest { Type listType = new TypeToken<List<Article>>() {}.getType(); articles = new Gson().fromJson(content.get(1), listType); } else { - header = null; - Type listType = new TypeToken<List<Article>>() {}.getType(); articles = new Gson().fromJson(content, listType); } @@ -87,11 +85,6 @@ public class HeadlinesRequest extends ApiRequest { while (m_articles.size() > HeadlinesFragment.HEADLINES_BUFFER_MAX) { m_articles.remove(0); } - - /*if (m_articles.get(m_articles.size()-1).id == HeadlinesFragment.ARTICLE_SPECIAL_LOADMORE) { - m_articles.remove(m_articles.size()-1); // remove previous placeholder - }*/ - } m_amountLoaded = articles.size(); @@ -103,17 +96,6 @@ public class HeadlinesRequest extends ApiRequest { m_articles.add(f); } - /*if (articles.size() == HEADLINES_REQUEST_SIZE) { - Article placeholder = new Article(HeadlinesFragment.ARTICLE_SPECIAL_LOADMORE); - m_articles.add(placeholder); - }*/ - - /* if (m_articles.size() == 0) - m_activity.setLoadingStatus(R.string.no_headlines_to_display, false); - else */ - - //m_activity.setLoadingStatus(R.string.blank, false); - return; } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/PrefsBackupAgent.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/PrefsBackupAgent.java deleted file mode 100644 index 2b33615f..00000000 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/PrefsBackupAgent.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.fox.ttrss.util; - -import android.app.backup.BackupAgentHelper; -import android.app.backup.SharedPreferencesBackupHelper; - -public class PrefsBackupAgent extends BackupAgentHelper { - // The name of the SharedPreferences file - static final String PREFS = "org.fox.ttrss_preferences"; - - // A key to uniquely identify the set of backup data - static final String PREFS_BACKUP_KEY = "prefs"; - - // Allocate a helper and add it to the backup agent - @Override - public void onCreate() { - SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS); - addHelper(PREFS_BACKUP_KEY, helper); - } -} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/SimpleLoginManager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/SimpleLoginManager.java index 7502a95c..abbe1ffa 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/SimpleLoginManager.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/SimpleLoginManager.java @@ -14,7 +14,7 @@ public abstract class SimpleLoginManager { private final String TAG = this.getClass().getSimpleName(); protected class LoginRequest extends ApiRequest { - private int m_requestId; + private final int m_requestId; protected String m_sessionId; protected int m_apiLevel; protected Context m_context; @@ -55,8 +55,7 @@ public abstract class SimpleLoginManager { } }; - @SuppressWarnings("serial") - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("sid", m_sessionId); map.put("op", "getApiLevel"); @@ -80,7 +79,7 @@ public abstract class SimpleLoginManager { public void logIn(Context context, int requestId, final String login, final String password) { LoginRequest ar = new LoginRequest(context, requestId); - HashMap<String, String> map = new HashMap<String, String>(); + HashMap<String, String> map = new HashMap<>(); map.put("op", "login"); map.put("user", login.trim()); map.put("password", password.trim()); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/SmallWidgetProvider.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/SmallWidgetProvider.java index c86b3810..d525cb90 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/SmallWidgetProvider.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/SmallWidgetProvider.java @@ -7,11 +7,12 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.widget.RemoteViews; +import androidx.preference.PreferenceManager; + import org.fox.ttrss.CommonActivity; import org.fox.ttrss.OnlineActivity; import org.fox.ttrss.R; diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/WidgetUpdateService.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/WidgetUpdateService.java index 3e2d2eaf..43b12d9e 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/WidgetUpdateService.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/widget/WidgetUpdateService.java @@ -10,12 +10,12 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.os.Handler; -import android.preference.PreferenceManager; import android.util.Log; import android.widget.RemoteViews; import androidx.annotation.NonNull; import androidx.core.app.JobIntentService; +import androidx.preference.PreferenceManager; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -58,19 +58,16 @@ public class WidgetUpdateService extends JobIntentService { Log.d(TAG, "service update requested but network is not available, try: " + retryCount); if (retryCount < 10) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - Intent serviceIntent = new Intent(getApplicationContext(), WidgetUpdateService.class); - serviceIntent.putExtra("retryCount", retryCount + 1); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - startForegroundService(serviceIntent); - } else { - startService(serviceIntent); - } - + new Handler().postDelayed(() -> { + Intent serviceIntent = new Intent(getApplicationContext(), WidgetUpdateService.class); + serviceIntent.putExtra("retryCount", retryCount + 1); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(serviceIntent); + } else { + startService(serviceIntent); } + }, 3 * 1000); } else { updateWidgets(-1, UPDATE_RESULT_ERROR_OTHER); @@ -83,7 +80,7 @@ public class WidgetUpdateService extends JobIntentService { m_prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); - if (m_prefs.getString("ttrss_url", "").trim().length() == 0) { + if (m_prefs.getString("ttrss_url", "").trim().isEmpty()) { updateWidgets(-1, UPDATE_RESULT_ERROR_NEED_CONF); @@ -124,7 +121,7 @@ public class WidgetUpdateService extends JobIntentService { final String fSessionId = sessionId; - HashMap<String, String> umap = new HashMap<String, String>(); + HashMap<String, String> umap = new HashMap<>(); umap.put("op", "getUnread"); umap.put("feed_id", String.valueOf(feedId)); umap.put("sid", fSessionId); diff --git a/org.fox.ttrss/src/main/res/menu/context_category.xml b/org.fox.ttrss/src/main/res/menu/context_category.xml index f2547a6d..8f975c0a 100644 --- a/org.fox.ttrss/src/main/res/menu/context_category.xml +++ b/org.fox.ttrss/src/main/res/menu/context_category.xml @@ -3,10 +3,6 @@ <item android:id="@+id/browse_headlines" android:title="@string/category_browse_headlines"/> - - <!-- <item - android:id="@+id/browse_articles" - android:title="@string/category_browse_articles"/> --> <item android:id="@+id/browse_feeds" @@ -15,8 +11,5 @@ <item android:id="@+id/catchup_category" android:title="@string/catchup"/> - - <item - android:id="@+id/create_shortcut" - android:title="@string/place_shortcut"/> + </menu>
\ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/menu/context_feed.xml b/org.fox.ttrss/src/main/res/menu/context_feed.xml index ba5ad55b..0b0cdc3e 100644 --- a/org.fox.ttrss/src/main/res/menu/context_feed.xml +++ b/org.fox.ttrss/src/main/res/menu/context_feed.xml @@ -17,10 +17,6 @@ android:title="@string/catchup"/> <item - android:id="@+id/create_shortcut" - android:title="@string/place_shortcut"/> - - <item android:id="@+id/unsubscribe_feed" android:title="@string/unsubscribe"/> |