aboutsummaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java/org
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-09 12:12:03 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-09 12:12:03 +0300
commitd720a53e0b94ce2872fd4141e3f044ff7ec4baab (patch)
tree0e9ba206f2a0fae00373ce6591f36ad55e1f3836 /org.fox.ttrss/src/main/java/org
parentbe2aec246a4d096cf6ee36353ddf84cea59da448 (diff)
parent961104e4426ac48aa390915f118be6f6ff0387ce (diff)
Merge branch 'protected/spring-cleaning' into 'master'
Protected/spring cleaning See merge request tt-rss/tt-rss-android!29
Diffstat (limited to 'org.fox.ttrss/src/main/java/org')
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/Application.java20
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java184
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java33
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java216
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java37
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java34
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java113
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java177
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java110
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryBaseFragment.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java20
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java26
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java406
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/LogcatActivity.java42
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java96
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/NetworkPreferencesFragment.java13
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java764
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java14
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesFragment.java28
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/StateSavedFragment.java23
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/YoutubePlayerActivity.java144
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java649
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java87
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java16
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java25
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java61
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java39
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java210
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java21
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java4
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java56
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java10
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java4
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/types/GalleryEntry.java39
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/FontSizeDialogPreference.java224
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java2
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenSwitchPreference.java77
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenWebView.java37
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/util/ScrimInsetsFrameLayout.java142
40 files changed, 1760 insertions, 2447 deletions
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 94857855..ae6eaef6 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
@@ -2,19 +2,11 @@ package org.fox.ttrss;
import android.os.Bundle;
-import com.livefront.bridge.Bridge;
-import com.livefront.bridge.SavedStateHandler;
-
import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
import java.util.LinkedHashMap;
-import icepick.Icepick;
-
public class Application extends android.app.Application {
private static Application m_singleton;
@@ -34,18 +26,6 @@ public class Application extends android.app.Application {
public final void onCreate() {
super.onCreate();
- Bridge.initialize(getApplicationContext(), new SavedStateHandler() {
- @Override
- public void saveInstanceState(@NonNull Object target, @NonNull Bundle state) {
- Icepick.saveInstanceState(target, state);
- }
-
- @Override
- public void restoreInstanceState(@NonNull Object target, @Nullable Bundle state) {
- Icepick.restoreInstanceState(target, state);
- }
- });
-
m_singleton = this;
}
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 995e0074..f2fbce2c 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,13 +6,12 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
+import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
-import android.text.Html;
import android.util.Log;
import android.util.TypedValue;
import android.view.ContextMenu;
@@ -29,11 +28,13 @@ import android.webkit.WebView.HitTestResult;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.FrameLayout;
-import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.text.HtmlCompat;
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.Attachment;
@@ -43,13 +44,11 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
-import icepick.State;
-
-public class ArticleFragment extends StateSavedFragment {
+public class ArticleFragment extends androidx.fragment.app.Fragment {
private final String TAG = this.getClass().getSimpleName();
private SharedPreferences m_prefs;
- @State protected Article m_article;
+ protected Article m_article;
private DetailActivity m_activity;
private WebView m_web;
protected View m_customView;
@@ -155,6 +154,15 @@ public class ArticleFragment extends StateSavedFragment {
}
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ m_article = savedInstanceState.getParcelable("m_article");
+ }
+ }
+
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
@@ -171,7 +179,6 @@ public class ArticleFragment extends StateSavedFragment {
view.findViewById(R.id.article_scrollview).setVisibility(View.INVISIBLE);
} */
- m_contentView = view.findViewById(R.id.article_scrollview);
m_customViewContainer = view.findViewById(R.id.article_fullscreen_video);
/* if (m_article.id == HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED) {
@@ -185,7 +192,7 @@ public class ArticleFragment extends StateSavedFragment {
return view;
} */
- m_articleFontSize = Integer.parseInt(m_prefs.getString("article_font_size_sp", "16"));
+ m_articleFontSize = m_prefs.getInt("article_font_size_sp_int", 16);
m_articleSmallFontSize = Math.max(10, Math.min(18, m_articleFontSize - 2));
TextView title = view.findViewById(R.id.title);
@@ -217,97 +224,6 @@ public class ArticleFragment extends StateSavedFragment {
}
- final ImageView scoreView = view.findViewById(R.id.score);
-
- if (scoreView != null) {
- setScoreImage(scoreView, m_article.score);
-
- Resources.Theme theme = m_activity.getTheme();
- TypedValue tv = new TypedValue();
- theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
- int titleHighScoreUnreadColor = tv.data;
-
- if (m_article.score > Article.SCORE_HIGH)
- scoreView.setColorFilter(titleHighScoreUnreadColor);
- else
- scoreView.setColorFilter(null);
-
- if (m_activity.getApiLevel() >= 16) {
- scoreView.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- final EditText edit = new EditText(getActivity());
- edit.setText(String.valueOf(m_article.score));
-
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
- .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());
-
- m_article.score = newScore;
-
- m_activity.saveArticleScore(m_article);
-
- setScoreImage(scoreView, newScore);
- } 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);
-
- Dialog dialog = builder.create();
- dialog.show();
- }
- });
- }
- }
-
- ImageView attachments = view.findViewById(R.id.attachments);
-
- if (attachments != null) {
- if (m_article.attachments != null && m_article.attachments.size() > 0) {
- attachments.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- m_activity.displayAttachments(m_article);
- }
- });
-
- } else {
- attachments.setVisibility(View.GONE);
- }
- }
-
- ImageView share = view.findViewById(R.id.share);
-
- if (share != null) {
- share.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- m_activity.shareArticle(m_article);
- }
- });
- }
-
TextView comments = view.findViewById(R.id.comments);
if (comments != null) {
@@ -337,31 +253,17 @@ public class ArticleFragment extends StateSavedFragment {
}
}
- TextView host = view.findViewById(R.id.host);
- if (host != null) {
- try {
- URL inurl = new URL(m_article.site_url != null ? m_article.site_url : m_article.comments_link);
- URL outurl = new URL(m_article.link);
- String inhost = inurl.getHost();
- String outhost = outurl.getHost();
- if (!inhost.equals(outhost)) {
- host.setText(outhost.replaceFirst("^www\\.", ""));
- host.setTextSize(TypedValue.COMPLEX_UNIT_SP, m_articleSmallFontSize);
- host.setVisibility(View.VISIBLE);
- }
- } catch (MalformedURLException ignored) {}
- }
-
TextView note = view.findViewById(R.id.note);
+ View noteContainer = view.findViewById(R.id.note_container);
- if (note != null) {
- if (m_article.note != null && !"".equals(m_article.note)) {
+ if (note != null && noteContainer != null) {
+ if (m_article.note != null && m_article.note.length() > 0) {
note.setTextSize(TypedValue.COMPLEX_UNIT_SP, m_articleSmallFontSize);
note.setText(m_article.note);
+ noteContainer.setVisibility(View.VISIBLE);
} else {
- note.setVisibility(View.GONE);
+ noteContainer.setVisibility(View.GONE);
}
-
}
TextView dv = view.findViewById(R.id.date);
@@ -446,7 +348,7 @@ public class ArticleFragment extends StateSavedFragment {
return view;
}
- private void setScoreImage(ImageView scoreView, int score) {
+ private void setScoreImage(MaterialButton scoreView, int score) {
TypedValue tv = new TypedValue();
int scoreAttr = R.attr.ic_action_trending_flat;
@@ -457,7 +359,10 @@ public class ArticleFragment extends StateSavedFragment {
m_activity.getTheme().resolveAttribute(scoreAttr, tv, true);
- scoreView.setImageResource(tv.resourceId);
+ scoreView.setIconResource(tv.resourceId);
+
+ TypedValue tvPrimary = new TypedValue();
+ m_activity.getTheme().resolveAttribute(R.attr.colorPrimary, tvPrimary, true);
}
protected void renderContent(Bundle savedInstanceState) {
@@ -468,42 +373,30 @@ public class ArticleFragment extends StateSavedFragment {
WebSettings ws = m_web.getSettings();
ws.setSupportZoom(false);
- TypedValue tvBackground = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.articleBackground, tvBackground, true);
-
- String backgroundHexColor = String.format("#%06X", (0xFFFFFF & tvBackground.data));
-
- String cssOverride = "";
-
- cssOverride = "body { background : "+ backgroundHexColor+"; }";
-
TypedValue tvTextColor = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.articleTextColor, tvTextColor, true);
+ getActivity().getTheme().resolveAttribute(R.attr.colorOnSurface, tvTextColor, true);
String textColor = String.format("#%06X", (0xFFFFFF & tvTextColor.data));
- cssOverride += "body { color : "+textColor+"; }";
+ String cssOverride = "body { color : "+textColor+"; }";
- TypedValue tvLinkColor = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.linkColor, tvLinkColor, true);
+ TypedValue tvColorPrimary = new TypedValue();
+ getActivity().getTheme().resolveAttribute(R.attr.colorPrimary, tvColorPrimary, true);
- String linkHexColor = String.format("#%06X", (0xFFFFFF & tvLinkColor.data));
+ String linkHexColor = String.format("#%06X", (0xFFFFFF & tvColorPrimary.data));
cssOverride += " a:link {color: "+linkHexColor+";} a:visited { color: "+linkHexColor+";}";
String articleContent = m_article.content != null ? m_article.content : "";
- ws.setJavaScriptEnabled(true);
+ ws.setJavaScriptEnabled(false);
m_chromeClient = new FSVideoChromeClient(getView());
m_web.setWebChromeClient(m_chromeClient);
+ m_web.setBackgroundColor(Color.TRANSPARENT);
ws.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
ws.setMediaPlaybackRequiresUserGesture(true);
- if (m_activity.isUiNightMode()) {
- m_web.setBackgroundColor(Color.BLACK);
- }
-
if (m_prefs.getBoolean("justify_article_text", true)) {
cssOverride += "body { text-align : justify; } ";
}
@@ -512,12 +405,14 @@ public class ArticleFragment extends StateSavedFragment {
ws.setDefaultFontSize(m_articleFontSize);
+ int margin8dp = CommonActivity.dpToPx(getContext(), 8);
+
StringBuilder content = new StringBuilder("<html>" +
"<head>" +
"<meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\">" +
"<meta name=\"viewport\" content=\"width=device-width, user-scalable=no\" />" +
"<style type=\"text/css\">" +
- "body { padding : 0px; margin : 0px; line-height : 1.3; word-wrap: break-word; }" +
+ "body { padding : 0px; margin : "+margin8dp+"px; line-height : 1.3; word-wrap: break-word; }" +
"h1, h2, h3, h4, h5, h6 { line-height: 1; text-align: initial; }" +
"img, video, iframe { max-width : 100%; width : auto; height : auto; }" +
" table { width : 100%; }" +
@@ -628,4 +523,11 @@ public class ArticleFragment extends StateSavedFragment {
m_activity = (DetailActivity)activity;
}
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putParcelable("m_article", m_article);
+ }
}
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 86feeaed..c94f0c3a 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
@@ -28,20 +28,18 @@ import org.fox.ttrss.util.HeadlinesRequest;
import java.util.HashMap;
-import icepick.State;
-
-public class ArticlePager extends StateSavedFragment {
+public class ArticlePager extends androidx.fragment.app.Fragment {
private final String TAG = "ArticlePager";
private PagerAdapter m_adapter;
private HeadlinesEventListener m_listener;
- @State protected Article m_article;
- @State protected ArticleList m_articles = new ArticleList(); //m_articles = Application.getInstance().m_loadedArticles;
+ protected Article m_article;
+ protected ArticleList m_articles = new ArticleList(); //m_articles = Application.getInstance().m_loadedArticles;
private OnlineActivity m_activity;
private String m_searchQuery = "";
- @State protected Feed m_feed;
+ protected Feed m_feed;
private SharedPreferences m_prefs;
- @State protected int m_firstId = 0;
+ protected int m_firstId = 0;
private boolean m_refreshInProgress;
private boolean m_lazyLoadDisabled;
@@ -112,15 +110,32 @@ public class ArticlePager extends StateSavedFragment {
}
@Override
+ public void onSaveInstanceState(Bundle out) {
+ 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);
+ }
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ m_article = savedInstanceState.getParcelable("m_article");
+ //m_articles = savedInstanceState.getParcelable("m_articles");
+ m_feed = savedInstanceState.getParcelable("m_feed");
+ m_firstId = savedInstanceState.getInt("m_firstId");
+ }
+
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.article_pager, container, false);
+ View view = inflater.inflate(R.layout.fragment_article_pager, container, false);
if (savedInstanceState != null) {
if (m_activity instanceof DetailActivity) {
@@ -354,7 +369,7 @@ public class ArticlePager extends StateSavedFragment {
m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
}
-
+
@SuppressLint("NewApi")
@Override
public void onResume() {
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 b97448fe..0952e7f7 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
@@ -11,166 +11,126 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import androidx.appcompat.widget.SwitchCompat;
+
import org.fox.ttrss.offline.OfflineActivity;
import java.net.MalformedURLException;
import java.net.URL;
-import androidx.appcompat.widget.SwitchCompat;
-
-public abstract class BaseFeedlistFragment extends StateSavedFragment {
+public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragment {
abstract public void refresh();
public void initDrawerHeader(LayoutInflater inflater, View view, ListView list, final CommonActivity activity, final SharedPreferences prefs, boolean isRoot) {
boolean isOffline = activity instanceof OfflineActivity;
- if (true /*m_activity.findViewById(R.id.headlines_drawer) != null*/) {
- try {
+ try {
+ View layout = inflater.inflate(R.layout.drawer_header, list, false);
+ list.addHeaderView(layout, null, false);
- boolean needSettingsFooter = false;
+ TextView login = view.findViewById(R.id.drawer_header_login);
+ TextView server = view.findViewById(R.id.drawer_header_server);
- if (activity.isSmallScreen()) {
- View layout = inflater.inflate(R.layout.drawer_header, list, false);
- list.addHeaderView(layout, null, false);
+ login.setText(prefs.getString("login", ""));
+ try {
+ server.setText(new URL(prefs.getString("ttrss_url", "")).getHost());
+ } catch (MalformedURLException e) {
+ server.setText("");
+ }
- TextView login = view.findViewById(R.id.drawer_header_login);
- TextView server = view.findViewById(R.id.drawer_header_server);
+ View settings = view.findViewById(R.id.drawer_settings_btn);
- login.setText(prefs.getString("login", ""));
+ settings.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
try {
- server.setText(new URL(prefs.getString("ttrss_url", "")).getHost());
- } catch (MalformedURLException e) {
- server.setText("");
- }
+ Intent intent = new Intent(getActivity(),
+ PreferencesActivity.class);
- View settings = view.findViewById(R.id.drawer_settings_btn);
+ startActivityForResult(intent, 0);
- settings.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- Intent intent = new Intent(getActivity(),
- PreferencesActivity.class);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
- startActivityForResult(intent, 0);
+ /* deal with ~material~ footers */
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- } else {
- needSettingsFooter = true;
+ // divider
+ final View footer = inflater.inflate(R.layout.drawer_divider, list, false);
+ footer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //
}
+ });
+ list.addFooterView(footer);
+
+ // unread only checkbox
+ final View rowToggle = inflater.inflate(R.layout.feeds_row_toggle, list, false);
+ list.addFooterView(rowToggle);
+ TextView text = rowToggle.findViewById(R.id.title);
+ text.setText(R.string.unread_only);
+
+ ImageView icon = rowToggle.findViewById(R.id.icon);
+ TypedValue tv = new TypedValue();
+ getActivity().getTheme().resolveAttribute(R.attr.ic_filter_variant, tv, true);
+ icon.setImageResource(tv.resourceId);
+
+ 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();
+ }
+ });
- /* deal with ~material~ footers */
+ footer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ rowSwitch.setChecked(!rowSwitch.isChecked());
+ }
+ });
- // divider
- View footer = inflater.inflate(R.layout.drawer_divider, list, false);
- footer.setOnClickListener(new View.OnClickListener() {
+ // root or subdirectory (i.e. feed category)
+ if (isRoot) {
+ // offline
+ final View offlineFooter = inflater.inflate(R.layout.feeds_row, list, false);
+ offlineFooter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- //
- }
- });
- list.addFooterView(footer);
-
- // unread only checkbox
- footer = inflater.inflate(R.layout.feeds_row_toggle, list, false);
- list.addFooterView(footer);
- TextView text = footer.findViewById(R.id.title);
- text.setText(R.string.unread_only);
-
- ImageView icon = footer.findViewById(R.id.icon);
- TypedValue tv = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.ic_filter_variant, tv, true);
- icon.setImageResource(tv.resourceId);
-
- final SwitchCompat rowSwitch = footer.findViewById(R.id.row_switch);
- rowSwitch.setChecked(activity.getUnreadOnly());
+ if (activity instanceof OnlineActivity) {
+ ((OnlineActivity)activity).switchOffline();
- rowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton button, boolean isChecked) {
- activity.setUnreadOnly(isChecked);
- refresh();
+ } else if (activity instanceof OfflineActivity) {
+ ((OfflineActivity)activity).switchOnline();
+ }
}
});
- footer.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- rowSwitch.setChecked(!rowSwitch.isChecked());
- }
- });
+ list.addFooterView(offlineFooter);
+ text = offlineFooter.findViewById(R.id.title);
+ text.setText(isOffline ? R.string.go_online : R.string.go_offline);
- if (isRoot) {
- if (needSettingsFooter) {
- // settings (as a list footer row)
-
- footer = inflater.inflate(R.layout.feeds_row, list, false);
- footer.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- Intent intent = new Intent(getActivity(),
- PreferencesActivity.class);
-
- startActivityForResult(intent, 0);
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
-
- list.addFooterView(footer);
- text = footer.findViewById(R.id.title);
- text.setText(R.string.action_settings);
-
- icon = footer.findViewById(R.id.icon);
- tv = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.ic_settings, tv, true);
- icon.setImageResource(tv.resourceId);
-
- TextView counter = footer.findViewById(R.id.unread_counter);
- counter.setText(R.string.blank);
- }
-
- // offline
- footer = inflater.inflate(R.layout.feeds_row, list, false);
- footer.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (activity instanceof OnlineActivity) {
- ((OnlineActivity)activity).switchOffline();
-
- } else if (activity instanceof OfflineActivity) {
- ((OfflineActivity)activity).switchOnline();
- }
- }
- });
-
- list.addFooterView(footer);
- text = footer.findViewById(R.id.title);
- text.setText(isOffline ? R.string.go_online : R.string.go_offline);
-
- icon = footer.findViewById(R.id.icon);
- tv = new TypedValue();
- getActivity().getTheme().resolveAttribute(isOffline ? R.attr.ic_cloud_upload : R.attr.ic_cloud_download, tv, true);
- icon.setImageResource(tv.resourceId);
-
- TextView counter = footer.findViewById(R.id.unread_counter);
- counter.setText(R.string.blank);
- }
+ icon = offlineFooter.findViewById(R.id.icon);
+ tv = new TypedValue();
+ getActivity().getTheme().resolveAttribute(isOffline ? R.attr.ic_cloud_upload : R.attr.ic_cloud_download, tv, true);
+ icon.setImageResource(tv.resourceId);
- } catch (InflateException e) {
- // welp couldn't inflate header i guess
- e.printStackTrace();
- } catch (java.lang.UnsupportedOperationException e) {
- e.printStackTrace();
+ TextView counter = offlineFooter.findViewById(R.id.unread_counter);
+ counter.setText(R.string.blank);
}
+
+ } catch (InflateException e) {
+ // welp couldn't inflate header i guess
+ e.printStackTrace();
+ } catch (java.lang.UnsupportedOperationException e) {
+ e.printStackTrace();
}
}
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 1933fe6a..fad4f8ef 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
@@ -27,12 +27,14 @@ import android.os.Bundle;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.View;
import android.widget.CheckBox;
+import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.browser.customtabs.CustomTabsCallback;
@@ -47,8 +49,8 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
-import com.livefront.bridge.Bridge;
import org.fox.ttrss.util.DatabaseHelper;
import org.fox.ttrss.widget.SmallWidgetProvider;
@@ -63,8 +65,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import icepick.State;
-
public class CommonActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private final String TAG = this.getClass().getSimpleName();
@@ -91,7 +91,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
//private SQLiteDatabase m_writableDb;
private boolean m_smallScreenMode = true;
- @State protected String m_theme;
+ protected String m_theme;
private boolean m_needRestart;
private static String s_customTabPackageName;
@@ -233,6 +233,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
@Override
public void onCreate(Bundle savedInstanceState) {
+ EdgeToEdge.enable(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager nmgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
@@ -263,10 +264,10 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
setupWidgetUpdates(this);
- Bridge.restoreInstanceState(this, savedInstanceState);
-
if (savedInstanceState == null) {
m_theme = m_prefs.getString("theme", CommonActivity.THEME_DEFAULT);
+ } else {
+ m_theme = savedInstanceState.getString("m_theme");
}
String customTabPackageName = getCustomTabPackageName(this);
@@ -282,7 +283,8 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
@Override
public void onSaveInstanceState(Bundle out) {
super.onSaveInstanceState(out);
- Bridge.saveInstanceState(this, out);
+
+ out.putString("m_theme", m_theme);
}
public boolean isSmallScreen() {
@@ -454,15 +456,11 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
private void openUriWithCustomTab(Uri uri) {
if (m_customTabClient != null) {
- TypedValue tvBackground = new TypedValue();
- getTheme().resolveAttribute(R.attr.colorPrimary, tvBackground, true);
-
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(getCustomTabSession());
builder.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right);
- builder.setToolbarColor(tvBackground.data);
builder.setShowTitle(true);
Intent shareIntent = getShareIntent(uri.toString(), null);
@@ -470,7 +468,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
CommonActivity.PENDING_INTENT_CHROME_SHARE, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- builder.setActionButton(BitmapFactory.decodeResource(getResources(), R.drawable.ic_share),
+ builder.setActionButton(BitmapFactory.decodeResource(getResources(), R.drawable.baseline_share_24),
getString(R.string.share_article), pendingIntent);
CustomTabsIntent intent = builder.build();
@@ -508,8 +506,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
View dialogView = View.inflate(this, R.layout.dialog_open_link_askcb, null);
final CheckBox askEveryTimeCB = dialogView.findViewById(R.id.open_link_ask_checkbox);
- AlertDialog.Builder builder = new AlertDialog.Builder(
- CommonActivity.this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setView(dialogView)
.setMessage(uri.toString())
.setPositiveButton(R.string.quick_preview,
@@ -564,7 +561,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
}
});*/
- AlertDialog dlg = builder.create();
+ Dialog dlg = builder.create();
dlg.show();
} else {
@@ -616,7 +613,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
if (es.size() > 0) {
if (es.get(0).hasAttr("title")) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setCancelable(true)
.setMessage(es.get(0).attr("title"))
.setPositiveButton(R.string.dialog_close, new DialogInterface.OnClickListener() {
@@ -627,7 +624,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
}
);
- AlertDialog dialog = builder.create();
+ Dialog dialog = builder.create();
dialog.show();
} else {
@@ -656,5 +653,11 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
JobIntentService.enqueueWork(context.getApplicationContext(), WidgetUpdateService.class, 0, new Intent());
}
+ 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;
+ }
+
}
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 97819411..0edd6c10 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
@@ -13,19 +13,18 @@ import android.util.Log;
import android.view.MenuItem;
import android.view.View;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.FragmentTransaction;
+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
import org.fox.ttrss.types.Feed;
-import androidx.appcompat.widget.Toolbar;
-import androidx.fragment.app.FragmentTransaction;
-import icepick.State;
-
public class DetailActivity extends OnlineActivity implements HeadlinesEventListener {
private final String TAG = this.getClass().getSimpleName();
- @State protected ArticleList m_articles = new ArticleList();
+ protected ArticleList m_articles = new ArticleList();
protected SharedPreferences m_prefs;
private Article m_activeArticle;
@@ -40,6 +39,10 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ m_articles = savedInstanceState.getParcelable("m_articles");
+ }
+
if (m_prefs.getBoolean("force_phone_layout", false)) {
setContentView(R.layout.activity_detail_phone);
} else {
@@ -111,6 +114,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
ArticleList tmp = Application.getInstance().tmpArticleList;
if (tmp != null) {
+ m_articles.clear();
m_articles.addAll(tmp);
}
@@ -166,20 +170,20 @@ 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);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
+ if (item.getItemId() == android.R.id.home) {
onBackPressed();
- return true;
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ return true;
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
@Override
public void onResume() {
@@ -208,12 +212,12 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
/* if (!isCompatMode() && (isSmallScreen() || !isPortrait())) {
m_menu.findItem(R.id.toggle_attachments).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
} */
- //m_menu.findItem(R.id.toggle_attachments).setVisible(true);
+ m_menu.findItem(R.id.toggle_attachments).setVisible(true);
} else {
/* if (!isCompatMode()) {
m_menu.findItem(R.id.toggle_attachments).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
} */
- //m_menu.findItem(R.id.toggle_attachments).setVisible(false);
+ m_menu.findItem(R.id.toggle_attachments).setVisible(false);
}
}
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 0feda5d9..b805ee6a 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
@@ -24,6 +24,10 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
@@ -40,17 +44,12 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
-import androidx.loader.app.LoaderManager;
-import androidx.loader.content.Loader;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-import icepick.State;
-
public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnItemClickListener, OnSharedPreferenceChangeListener,
LoaderManager.LoaderCallbacks<JsonElement> {
private final String TAG = this.getClass().getSimpleName();
private FeedCategoryListAdapter m_adapter;
private FeedCategoryList m_cats = new FeedCategoryList();
- @State FeedCategory m_selectedCat;
+ FeedCategory m_selectedCat;
private MasterActivity m_activity;
private SwipeRefreshLayout m_swipeLayout;
private ListView m_list;
@@ -216,50 +215,48 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
-
- switch (item.getItemId()) {
- case R.id.browse_headlines:
- if (true) {
- FeedCategory cat = getCategoryAtPosition(info.position);
- if (cat != null) {
- m_activity.onCatSelected(cat, true);
- //setSelectedCategory(cat);
- }
- }
- return true;
- case R.id.browse_feeds:
- if (true) {
- FeedCategory cat = getCategoryAtPosition(info.position);
- if (cat != null) {
- m_activity.onCatSelected(cat, false);
- //cf.setSelectedCategory(cat);
- }
- }
- return true;
- case R.id.create_shortcut:
- if (true) {
- FeedCategory cat = getCategoryAtPosition(info.position);
- if (cat != null) {
- m_activity.createCategoryShortcut(cat);
- //cf.setSelectedCategory(cat);
- }
- }
- return true;
- case R.id.catchup_category:
- if (true) {
- final FeedCategory cat = getCategoryAtPosition(info.position);
- if (cat != null) {
- m_activity.catchupDialog(new Feed(cat.id, cat.title, true));
- }
- }
- return true;
-
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+ 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);
+ }
+ }
+ 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);
+ }
+ }
+ return true;
+ } else if (itemId == R.id.catchup_category) {
+ if (true) {
+ final FeedCategory cat = getCategoryAtPosition(info.position);
+
+ if (cat != null) {
+ m_activity.catchupDialog(new Feed(cat.id, cat.title, true));
+ }
+ }
+ return true;
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
@@ -290,11 +287,20 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt
return null;
}
}
-
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ m_selectedCat = savedInstanceState.getParcelable("m_selectedCat");
+ }
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_cats, container, false);
+ View view = inflater.inflate(R.layout.fragment_feeds, container, false);
m_swipeLayout = view.findViewById(R.id.feeds_swipe_container);
@@ -474,5 +480,10 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt
}
}
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+ out.putParcelable("m_selectedCat", m_selectedCat);
+ }
}
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 60020086..55c8950b 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
@@ -29,6 +29,11 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
@@ -45,11 +50,6 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
-import androidx.loader.app.LoaderManager;
-import androidx.loader.content.Loader;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-import icepick.State;
-
public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickListener, OnSharedPreferenceChangeListener,
LoaderManager.LoaderCallbacks<JsonElement> {
private final String TAG = this.getClass().getSimpleName();
@@ -57,10 +57,10 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi
private FeedListAdapter m_adapter;
private FeedList m_feeds = new FeedList();
private MasterActivity m_activity;
- @State Feed m_selectedFeed;
- @State FeedCategory m_activeCategory;
+ Feed m_selectedFeed;
+ FeedCategory m_activeCategory;
private SwipeRefreshLayout m_swipeLayout;
- @State boolean m_enableParentBtn = false;
+ boolean m_enableParentBtn = false;
private ListView m_list;
public void initialize(FeedCategory cat, boolean enableParentBtn) {
@@ -237,75 +237,72 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
- switch (item.getItemId()) {
- case R.id.browse_headlines:
- if (true) {
- Feed feed = getFeedAtPosition(info.position);
- if (feed != null) {
- m_activity.onFeedSelected(feed);
- }
- }
- return true;
- case 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;
- case R.id.unsubscribe_feed:
- if (true) {
- final Feed feed = getFeedAtPosition(info.position);
-
- AlertDialog.Builder builder = new AlertDialog.Builder(
- m_activity)
- .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) {
-
- }
- });
-
- AlertDialog dlg = builder.create();
- dlg.show();
- }
-
- return true;
- case R.id.create_shortcut:
- if (true) {
- Feed feed = getFeedAtPosition(info.position);
- if (feed != null) {
- m_activity.createFeedShortcut(feed);
- }
- }
- return true;
- case R.id.catchup_feed:
- if (true) {
- Feed feed = getFeedAtPosition(info.position);
-
- if (feed != null) {
- m_activity.catchupDialog(feed);
- }
- }
- return true;
-
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+ 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);
+ }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
@@ -334,6 +331,32 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi
super.onCreateContextMenu(menu, v, menuInfo);
}
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ ArrayList<Feed> list = savedInstanceState.getParcelableArrayList("m_feeds");
+
+ m_feeds.clear();
+ m_feeds.addAll(list);
+
+ m_selectedFeed = savedInstanceState.getParcelable("m_selectedFeed");
+ m_activeCategory = savedInstanceState.getParcelable("m_activeCategory");
+ m_enableParentBtn = savedInstanceState.getBoolean("m_enableParentBtn");
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putParcelableArrayList("m_feeds", m_feeds);
+ out.putParcelable("m_selectedFeed", m_selectedFeed);
+ out.putParcelable("m_activeCategory", m_activeCategory);
+ out.putBoolean("m_enableParentBtn", m_enableParentBtn);
+ }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
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 9645ad80..ef3797b3 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
@@ -3,18 +3,26 @@ package org.fox.ttrss;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.Window;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
+import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowCompat;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.core.view.WindowInsetsControllerCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -34,16 +42,15 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
-import icepick.State;
import me.relex.circleindicator.CircleIndicator;
public class GalleryActivity extends CommonActivity {
private final String TAG = this.getClass().getSimpleName();
- @State protected ArrayList<GalleryEntry> m_items = new ArrayList<>();
- @State protected String m_title;
+ protected ArrayList<GalleryEntry> m_items = new ArrayList<>();
+ protected String m_title;
private ArticleImagesPagerAdapter m_adapter;
- @State public String m_content;
+ public String m_content;
private ViewPager m_pager;
private ProgressBar m_checkProgress;
@@ -234,6 +241,14 @@ public class GalleryActivity extends CommonActivity {
return firstFound;
}
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putParcelableArrayList("m_items", m_items);
+ out.putString("m_title", m_title);
+ out.putString("m_content", m_content);
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
ActivityCompat.postponeEnterTransition(this);
@@ -242,19 +257,19 @@ public class GalleryActivity extends CommonActivity {
m_prefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
-
- getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
- setTheme(R.style.AppTheme);
+ setAppTheme(m_prefs);
super.onCreate(savedInstanceState);
+ Window window = getWindow();
+ WindowInsetsControllerCompat windowInsetsController = WindowCompat.getInsetsController(window, window.getDecorView());
+ windowInsetsController.hide(WindowInsetsCompat.Type.statusBars());
+
setContentView(R.layout.activity_gallery);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- //m_progress = (ProgressBar) findViewById(R.id.gallery_check_progress);
-
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().hide();
@@ -273,6 +288,14 @@ public class GalleryActivity extends CommonActivity {
if (!collectGalleryContents(imgSrcFirst, doc, uncheckedItems))
if (!collectGalleryContents("", doc, uncheckedItems))
m_items.add(new GalleryEntry(imgSrcFirst, GalleryEntry.GalleryEntryType.TYPE_IMAGE, null));
+ } else {
+ ArrayList<GalleryEntry> list = savedInstanceState.getParcelableArrayList("m_items");
+
+ m_items.clear();
+ m_items.addAll(list);
+
+ m_title = savedInstanceState.getString("m_title");
+ m_content = savedInstanceState.getString("m_content");
}
findViewById(R.id.gallery_overflow).setOnClickListener(new View.OnClickListener() {
@@ -361,44 +384,43 @@ public class GalleryActivity extends CommonActivity {
public boolean onImageMenuItemSelected(MenuItem item, GalleryEntry entry) {
String url = entry.url;
- switch (item.getItemId()) {
- case R.id.article_img_open:
- if (url != null) {
- try {
- openUri(Uri.parse(url));
- } catch (Exception e) {
- e.printStackTrace();
- toast(R.string.error_other_error);
- }
- }
- return true;
- case R.id.article_img_copy:
- if (url != null) {
- copyToClipboard(url);
+ int itemId = item.getItemId();
+ if (itemId == R.id.article_img_open) {
+ if (url != null) {
+ try {
+ openUri(Uri.parse(url));
+ } catch (Exception e) {
+ e.printStackTrace();
+ toast(R.string.error_other_error);
}
- return true;
- case R.id.article_img_share:
- if (url != null) {
- if (entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE) {
- Log.d(TAG, "image sharing image from URL=" + url);
+ }
+ return true;
+ } else if (itemId == R.id.article_img_copy) {
+ if (url != null) {
+ copyToClipboard(url);
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share) {
+ if (url != null) {
+ if (entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE) {
+ Log.d(TAG, "image sharing image from URL=" + url);
- shareImageFromUri(url);
- }
- }
- return true;
- case R.id.article_img_share_url:
- if (url != null) {
- shareText(url);
- }
- return true;
- case R.id.article_img_view_caption:
- if (url != null) {
- displayImageCaption(url, m_content);
+ shareImageFromUri(url);
}
- return true;
- default:
- Log.d(TAG, "onImageMenuItemSelected, unhandled id=" + item.getItemId());
- return false;
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share_url) {
+ if (url != null) {
+ shareText(url);
+ }
+ return true;
+ } else if (itemId == R.id.article_img_view_caption) {
+ if (url != null) {
+ displayImageCaption(url, m_content);
+ }
+ return true;
}
+ Log.d(TAG, "onImageMenuItemSelected, unhandled id=" + item.getItemId());
+ return false;
}
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryBaseFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryBaseFragment.java
index 338845a2..b35ca9e7 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryBaseFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryBaseFragment.java
@@ -5,7 +5,7 @@ import android.os.Bundle;
import android.view.ContextMenu;
import android.view.View;
-public class GalleryBaseFragment extends StateSavedFragment {
+public class GalleryBaseFragment extends androidx.fragment.app.Fragment {
private final String TAG = this.getClass().getSimpleName();
protected GalleryActivity m_activity;
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 e058ca7b..addb48d3 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
@@ -19,12 +19,19 @@ import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
-import icepick.State;
-
public class GalleryImageFragment extends GalleryBaseFragment {
private final String TAG = this.getClass().getSimpleName();
- @State String m_url;
+ String m_url;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ m_url = savedInstanceState.getString("m_url");
+ }
+ }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -84,6 +91,13 @@ public class GalleryImageFragment extends GalleryBaseFragment {
m_url = url;
}
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putString("m_url", m_url);
+ }
+
/*@Override
public boolean onContextItemSelected(MenuItem item) {
int position = m_pager.getCurrentItem();
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 c2f8841d..2e2df149 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
@@ -15,20 +15,36 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.MediaController;
-import java.io.IOException;
-
import androidx.core.app.ActivityCompat;
import androidx.core.view.ViewCompat;
-import icepick.State;
+
+import java.io.IOException;
public class GalleryVideoFragment extends GalleryBaseFragment {
private final String TAG = this.getClass().getSimpleName();
- @State String m_url;
- @State String m_coverUrl;
+ String m_url;
+ String m_coverUrl;
MediaPlayer m_mediaPlayer;
private boolean m_userVisibleHint = false;
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ m_url = savedInstanceState.getString("m_url");
+ m_coverUrl = savedInstanceState.getString("m_coverUrl");
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putString("m_url", m_url);
+ out.putString("m_coverUrl", m_coverUrl);
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_gallery_entry, container, false);
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 fb43f7ca..b6953bc6 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
@@ -2,14 +2,12 @@ package org.fox.ttrss;
import android.annotation.SuppressLint;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.res.Resources.Theme;
+import android.content.res.ColorStateList;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
@@ -44,18 +42,17 @@ import android.view.WindowManager;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.CheckBox;
import android.widget.EditText;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
-import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -69,6 +66,9 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.android.material.divider.MaterialDividerItemDecoration;
import com.google.android.material.snackbar.Snackbar;
import com.google.gson.JsonElement;
@@ -87,14 +87,11 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import java.util.List;
import java.util.TimeZone;
-import java.util.concurrent.TimeUnit;
-import icepick.State;
import jp.wasabeef.glide.transformations.CropCircleTransformation;
-public class HeadlinesFragment extends StateSavedFragment {
+public class HeadlinesFragment extends androidx.fragment.app.Fragment {
public enum ArticlesSelection { ALL, NONE, UNREAD }
@@ -105,23 +102,23 @@ public class HeadlinesFragment extends StateSavedFragment {
private final String TAG = this.getClass().getSimpleName();
- @State Feed m_feed;
- @State Article m_activeArticle;
- @State String m_searchQuery = "";
+ Feed m_feed;
+ Article m_activeArticle;
+ String m_searchQuery = "";
private boolean m_refreshInProgress = false;
- @State int m_firstId = 0;
- @State boolean m_lazyLoadDisabled = false;
+ int m_firstId = 0;
+ boolean m_lazyLoadDisabled = false;
private SharedPreferences m_prefs;
private HeaderViewRecyclerAdapter m_adapter;
- @State ArticleList m_articles = new ArticleList();
+ ArticleList m_articles = new ArticleList();
private ArticleList m_readArticles = new ArticleList();
private HeadlinesEventListener m_listener;
private OnlineActivity m_activity;
private SwipeRefreshLayout m_swipeLayout;
private int m_maxImageSize = 0;
- @State boolean m_compactLayoutMode = false;
+ boolean m_compactLayoutMode = false;
private RecyclerView m_list;
private LinearLayoutManager m_layoutManager;
@@ -159,68 +156,66 @@ public class HeadlinesFragment extends StateSavedFragment {
if (article == null) return false;
- switch (item.getItemId()) {
- case R.id.set_labels:
- m_activity.editArticleLabels(article);
- return true;
- case R.id.article_set_note:
- m_activity.editArticleNote(article);
- return true;
- case R.id.headlines_article_unread:
- article.unread = !article.unread;
- m_activity.saveArticleUnread(article);
- m_adapter.notifyItemChanged(position);
- return true;
- case R.id.headlines_article_link_copy:
- m_activity.copyToClipboard(article.link);
- return true;
- case R.id.headlines_article_link_open:
- m_activity.openUri(Uri.parse(article.link));
-
- if (article.unread) {
- article.unread = false;
- m_activity.saveArticleUnread(article);
-
- m_adapter.notifyItemChanged(position);
- }
- return true;
- case R.id.headlines_share_article:
- m_activity.shareArticle(article);
- return true;
- case R.id.catchup_above:
- if (true) {
-
- final Article fa = article;
-
- AlertDialog.Builder builder = new AlertDialog.Builder(
- m_activity)
- .setMessage(R.string.confirm_catchup_above)
- .setPositiveButton(R.string.dialog_ok,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- catchupAbove(fa);
-
- }
- })
- .setNegativeButton(R.string.dialog_cancel,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- }
- });
-
- AlertDialog dialog = builder.create();
- dialog.show();
- }
- return true;
- default:
- Log.d(TAG, "onArticleMenuItemSelected, unhandled id=" + item.getItemId());
- return false;
- }
- }
+ int itemId = item.getItemId();
+ if (itemId == R.id.set_labels) {
+ m_activity.editArticleLabels(article);
+ return true;
+ } else if (itemId == R.id.article_set_note) {
+ m_activity.editArticleNote(article);
+ return true;
+ } else if (itemId == R.id.headlines_article_unread) {
+ article.unread = !article.unread;
+ m_activity.saveArticleUnread(article);
+ m_adapter.notifyItemChanged(position);
+ return true;
+ } else if (itemId == R.id.headlines_article_link_copy) {
+ m_activity.copyToClipboard(article.link);
+ return true;
+ } else if (itemId == R.id.headlines_article_link_open) {
+ m_activity.openUri(Uri.parse(article.link));
+
+ if (article.unread) {
+ article.unread = false;
+ m_activity.saveArticleUnread(article);
+
+ m_adapter.notifyItemChanged(position);
+ }
+ return true;
+ } else if (itemId == R.id.headlines_share_article) {
+ 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);
+
+ }
+ })
+ .setNegativeButton(R.string.dialog_cancel,
+ new Dialog.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ }
+ });
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ return true;
+ }
+ Log.d(TAG, "onArticleMenuItemSelected, unhandled id=" + item.getItemId());
+ return false;
+ }
private void catchupAbove(Article article) {
ArticleList articles = getAllArticles();
@@ -283,12 +278,49 @@ public class HeadlinesFragment extends StateSavedFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ m_feed = savedInstanceState.getParcelable("m_feed");
+ m_activeArticle = savedInstanceState.getParcelable("m_activeArticle");
+ 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);
+ }
+
setRetainInstance(true);
Glide.get(getContext()).clearMemory();
}
@Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putParcelable("m_feed", m_feed);
+ out.putParcelable("m_activeArticle", m_activeArticle);
+ 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) {
@@ -325,7 +357,13 @@ public class HeadlinesFragment extends StateSavedFragment {
m_layoutManager = new LinearLayoutManager(m_activity.getApplicationContext());
m_list.setLayoutManager(m_layoutManager);
m_list.setItemAnimator(new DefaultItemAnimator());
- m_list.addItemDecoration(new DividerItemDecoration(m_list.getContext(), m_layoutManager.getOrientation()));
+
+ 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);
@@ -701,16 +739,16 @@ public class HeadlinesFragment extends StateSavedFragment {
public TextView titleView;
public TextView feedTitleView;
- public ImageView markedView;
- public ImageView scoreView;
- public ImageView publishedView;
+ public MaterialButton markedView;
+ public MaterialButton scoreView;
+ public MaterialButton publishedView;
public TextView excerptView;
public ImageView flavorImageView;
public ImageView flavorVideoKindView;
public TextView authorView;
public TextView dateView;
public CheckBox selectionBoxView;
- public ImageView menuButtonView;
+ public MaterialButton menuButtonView;
public ViewGroup flavorImageHolder;
public ProgressBar flavorImageLoadingBar;
public View headlineFooter;
@@ -719,7 +757,7 @@ public class HeadlinesFragment extends StateSavedFragment {
public View headlineHeader;
public View flavorImageOverflow;
public TextureView flavorVideoView;
- public ImageView attachmentsView;
+ public MaterialButton attachmentsView;
//public int position;
public boolean flavorImageEmbedded;
public ProgressTarget<String, GlideDrawable> flavorProgressTarget;
@@ -815,14 +853,12 @@ public class HeadlinesFragment extends StateSavedFragment {
public static final int VIEW_COUNT = VIEW_AMR_FOOTER + 1;
private final Integer[] origTitleColors = new Integer[VIEW_COUNT];
- private final int titleHighScoreUnreadColor;
private ColorGenerator m_colorGenerator = ColorGenerator.DEFAULT;
private TextDrawable.IBuilder m_drawableBuilder = TextDrawable.builder().round();
boolean flavorImageEnabled;
private int m_minimumHeightToEmbed;
- boolean m_youtubeInstalled;
private int m_screenHeight;
private int m_lastAddedPosition;
@@ -859,19 +895,6 @@ public class HeadlinesFragment extends StateSavedFragment {
flavorImageEnabled = "HL_DEFAULT".equals(headlineMode) || "HL_COMPACT".equals(headlineMode);
m_cmgr = (ConnectivityManager) m_activity.getSystemService(Context.CONNECTIVITY_SERVICE);
-
- Theme theme = context.getTheme();
- TypedValue tv = new TypedValue();
- theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
- titleHighScoreUnreadColor = tv.data;
-
- List<ApplicationInfo> packages = m_activity.getPackageManager().getInstalledApplications(0);
- for (ApplicationInfo pi : packages) {
- if (pi.packageName.equals("com.google.android.youtube")) {
- m_youtubeInstalled = true;
- break;
- }
- }
}
@Override
@@ -887,13 +910,13 @@ public class HeadlinesFragment extends StateSavedFragment {
layoutId = R.layout.headlines_row_loadmore;
break;
case VIEW_UNREAD:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_unread_compact : R.layout.headlines_row_unread;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_unread : R.layout.headlines_row_unread;
break;
case VIEW_SELECTED:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_selected_compact : R.layout.headlines_row;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected : R.layout.headlines_row;
break;
case VIEW_SELECTED_UNREAD:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_selected_unread_compact : R.layout.headlines_row_unread;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected_unread : R.layout.headlines_row_unread;
break;
}
@@ -908,7 +931,7 @@ public class HeadlinesFragment extends StateSavedFragment {
public void onBindViewHolder(final ArticleViewHolder holder, int position) {
holder.article = items.get(position);
- int headlineFontSize = Integer.parseInt(m_prefs.getString("headlines_font_size_sp", "13"));
+ int headlineFontSize = m_prefs.getInt("headlines_font_size_sp_int", 13);
int headlineSmallFontSize = Math.max(10, Math.min(18, headlineFontSize - 2));
final Article article = holder.article;
@@ -1007,19 +1030,23 @@ public class HeadlinesFragment extends StateSavedFragment {
}
- TypedValue tvAccent = new TypedValue();
- m_activity.getTheme().resolveAttribute(R.attr.colorAccent, tvAccent, true);
+ TypedValue tvTertiary = new TypedValue();
+ m_activity.getTheme().resolveAttribute(R.attr.colorTertiary, tvTertiary, true);
+
+ TypedValue tvPrimary = new TypedValue();
+ m_activity.getTheme().resolveAttribute(R.attr.colorPrimary, tvPrimary, true);
if (holder.markedView != null) {
TypedValue tv = new TypedValue();
m_activity.getTheme().resolveAttribute(article.marked ? R.attr.ic_star : R.attr.ic_star_outline, tv, true);
- holder.markedView.setImageResource(tv.resourceId);
+ holder.markedView.setIconResource(tv.resourceId);
+
if (article.marked)
- holder.markedView.setColorFilter(tvAccent.data);
+ holder.markedView.setIconTint(ColorStateList.valueOf(tvTertiary.data));
else
- holder.markedView.setColorFilter(null);
+ holder.markedView.setIconTint(ColorStateList.valueOf(tvPrimary.data));
holder.markedView.setOnClickListener(new OnClickListener() {
@@ -1045,12 +1072,12 @@ public class HeadlinesFragment extends StateSavedFragment {
m_activity.getTheme().resolveAttribute(scoreAttr, tv, true);
- holder.scoreView.setImageResource(tv.resourceId);
+ holder.scoreView.setIconResource(tv.resourceId);
if (article.score > Article.SCORE_HIGH)
- holder.scoreView.setColorFilter(titleHighScoreUnreadColor);
+ holder.scoreView.setIconTint(ColorStateList.valueOf(tvTertiary.data));
else
- holder.scoreView.setColorFilter(null);
+ holder.scoreView.setIconTint(ColorStateList.valueOf(tvPrimary.data));
if (m_activity.getApiLevel() >= 16) {
holder.scoreView.setOnClickListener(new OnClickListener() {
@@ -1059,7 +1086,7 @@ public class HeadlinesFragment extends StateSavedFragment {
final EditText edit = new EditText(getActivity());
edit.setText(String.valueOf(article.score));
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext())
.setTitle(R.string.score_for_this_article)
.setPositiveButton(R.string.set_score,
new DialogInterface.OnClickListener() {
@@ -1103,14 +1130,14 @@ public class HeadlinesFragment extends StateSavedFragment {
if (holder.publishedView != null) {
TypedValue tv = new TypedValue();
- m_activity.getTheme().resolveAttribute(article.published ? R.attr.ic_checkbox_marked : R.attr.ic_rss_box, tv, true);
+ m_activity.getTheme().resolveAttribute(R.attr.ic_rss_box, tv, true);
- holder.publishedView.setImageResource(tv.resourceId);
+ holder.publishedView.setIconResource(tv.resourceId);
if (article.published)
- holder.publishedView.setColorFilter(tvAccent.data);
+ holder.publishedView.setIconTint(ColorStateList.valueOf(tvTertiary.data));
else
- holder.publishedView.setColorFilter(null);
+ holder.publishedView.setIconTint(ColorStateList.valueOf(tvPrimary.data));
holder.publishedView.setOnClickListener(new OnClickListener() {
@@ -1182,7 +1209,6 @@ public class HeadlinesFragment extends StateSavedFragment {
holder.flavorVideoKindView.setVisibility(View.GONE);
holder.flavorImageOverflow.setVisibility(View.GONE);
holder.flavorVideoView.setVisibility(View.GONE);
- holder.headlineHeader.setBackgroundDrawable(null);
Glide.clear(holder.flavorImageView);
@@ -1224,26 +1250,25 @@ public class HeadlinesFragment extends StateSavedFragment {
Uri mediaUri = Uri.parse(article.flavorStreamUri != null ? article.flavorStreamUri : article.flavorImageUri);
- switch (item.getItemId()) {
- case R.id.article_img_open:
- m_activity.openUri(mediaUri);
- return true;
- case R.id.article_img_copy:
- m_activity.copyToClipboard(mediaUri.toString());
- return true;
- case R.id.article_img_share:
- m_activity.shareImageFromUri(mediaUri.toString());
- return true;
- case R.id.article_img_share_url:
- m_activity.shareText(mediaUri.toString());
- return true;
- case R.id.article_img_view_caption:
- m_activity.displayImageCaption(article.flavorImageUri, article.content);
- return true;
- default:
- return false;
- }
- }
+ 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();
@@ -1263,24 +1288,15 @@ public class HeadlinesFragment extends StateSavedFragment {
//Log.d(TAG, "TAG:" + holder.flavorImageOverflow.getTag());
holder.flavorImageView.setVisibility(View.VISIBLE);
+ holder.flavorImageView.setMaxHeight((int)(m_screenHeight * 0.6f));
- holder.flavorImageView.setMaxHeight((int)(m_screenHeight * 0.8f));
- holder.flavorProgressTarget.setModel(article.flavorImageUri);
-
+ // prevent lower listiew entries from jumping around if this row is modified
if (article.flavorViewHeight > 0) {
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
lp.height = article.flavorViewHeight;
- holder.flavorImageView.setLayoutParams(lp);
}
-
- /* TODO: maybe an option? force height for all images to reduce list jumping around
-
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
- lp.height = (int)(m_screenHeight * 0.5f);
- lp.addRule(RelativeLayout.BELOW, R.id.headline_header);
- holder.flavorImageView.setLayoutParams(lp);
- */
+ holder.flavorProgressTarget.setModel(article.flavorImageUri);
try {
@@ -1306,16 +1322,9 @@ public class HeadlinesFragment extends StateSavedFragment {
if (resource.getIntrinsicWidth() > FLAVOR_IMG_MIN_SIZE && resource.getIntrinsicHeight() > FLAVOR_IMG_MIN_SIZE) {
- //holder.flavorImageView.setVisibility(View.VISIBLE);
+ holder.flavorImageView.setVisibility(View.VISIBLE);
holder.flavorImageOverflow.setVisibility(View.VISIBLE);
- boolean forceDown = !m_activity.isSmallScreen() || article.flavorImage != null && "video".equals(article.flavorImage.tagName().toLowerCase());
-
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
- lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
- holder.flavorImageView.setLayoutParams(lp);
-
- maybeRepositionFlavorImage(holder.flavorImageView, resource, holder, forceDown);
adjustVideoKindView(holder, article);
return false;
@@ -1607,20 +1616,7 @@ public class HeadlinesFragment extends StateSavedFragment {
//Log.d(TAG, "openGalleryForType: " + article + " " + holder + " " + transitionView);
if ("iframe".equals(article.flavorImage.tagName().toLowerCase())) {
-
- if (m_youtubeInstalled) {
- Intent intent = new Intent(m_activity, YoutubePlayerActivity.class);
- intent.putExtra("streamUri", article.flavorStreamUri);
- intent.putExtra("vid", article.youtubeVid);
- intent.putExtra("title", article.title);
-
- startActivity(intent);
- m_activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
-
- } else {
- m_activity.openUri(Uri.parse(article.flavorStreamUri));
- }
-
+ m_activity.openUri(Uri.parse(article.flavorStreamUri));
} else {
Intent intent = new Intent(m_activity, GalleryActivity.class);
@@ -1664,13 +1660,10 @@ public class HeadlinesFragment extends StateSavedFragment {
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())) {
- holder.flavorVideoKindView.setImageResource(R.drawable.ic_youtube_play);
+ 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())) {
- holder.flavorVideoKindView.setImageResource(R.drawable.ic_play_circle);
- holder.flavorVideoKindView.setVisibility(View.VISIBLE);
- } else if (article.flavor_kind == Article.FLAVOR_KIND_ALBUM ||article.mediaList.size() > 1) {
- holder.flavorVideoKindView.setImageResource(R.drawable.ic_image_album);
+ holder.flavorVideoKindView.setImageResource(R.drawable.baseline_play_circle_24);
holder.flavorVideoKindView.setVisibility(View.VISIBLE);
} else {
holder.flavorVideoKindView.setVisibility(View.INVISIBLE);
@@ -1680,48 +1673,6 @@ public class HeadlinesFragment extends StateSavedFragment {
}
}
- 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;
- }
-
- private void maybeRepositionFlavorImage(View view, GlideDrawable resource, ArticleViewHolder holder, boolean forceDown) {
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
-
- int w = resource.getIntrinsicWidth();
- int h = resource.getIntrinsicHeight();
- float r = h != 0 ? (float)w/h : 0;
-
- //Log.d(TAG, "XYR: " + pxToDp(w) + " " + pxToDp(h) + " " + r);
-
- if (forceDown || h < m_minimumHeightToEmbed || r >= 1) {
-
- lp.addRule(RelativeLayout.BELOW, R.id.headline_header);
-
- holder.headlineHeader.setBackgroundDrawable(null);
- holder.flavorImageEmbedded = false;
-
- } else {
- lp.addRule(RelativeLayout.BELOW, 0);
-
- TypedValue tv = new TypedValue();
- if (m_activity.getTheme().resolveAttribute(R.attr.headlineHeaderBackground, tv, true)) {
- holder.headlineHeader.setBackgroundColor(tv.data);
- }
-
- holder.flavorImageEmbedded = true;
- }
-
- view.setLayoutParams(lp);
- }
-
private void adjustTitleTextView(int score, TextView tv, int position) {
int viewType = getItemViewType(position);
if (origTitleColors[viewType] == null)
@@ -1730,9 +1681,6 @@ public class HeadlinesFragment extends StateSavedFragment {
if (score < Article.SCORE_LOW) {
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- } else if (score > Article.SCORE_HIGH) {
- tv.setTextColor(titleHighScoreUnreadColor);
- tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
} else {
tv.setTextColor(origTitleColors[viewType].intValue());
tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
@@ -1874,7 +1822,19 @@ public class HeadlinesFragment extends StateSavedFragment {
m_adapter.notifyDataSetChanged();
}
- @Override
+ 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 c9cbcbf9..60fad0ba 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
@@ -7,19 +7,18 @@ import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-import icepick.State;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
public class LogcatActivity extends CommonActivity {
private static final int MAX_LOG_ENTRIES = 500;
private final String TAG = this.getClass().getSimpleName();
- @State protected ArrayList<String> m_items = new ArrayList<>();
+ protected ArrayList<String> m_items = new ArrayList<>();
ArrayAdapter<String> m_adapter;
ListView m_list;
@@ -41,6 +40,8 @@ public class LogcatActivity extends CommonActivity {
if (savedInstanceState == null) {
refresh();
+ } else {
+ m_items = savedInstanceState.getStringArrayList("m_items");
}
m_adapter = new ArrayAdapter<>(this, R.layout.logcat_row, m_items);
@@ -59,6 +60,13 @@ public class LogcatActivity extends CommonActivity {
});
}
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putStringArrayList("m_items", m_items);
+ }
+
private void refresh() {
m_items.clear();
@@ -92,19 +100,17 @@ public class LogcatActivity extends CommonActivity {
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
- switch (id) {
- case android.R.id.home:
- onBackPressed();
- return true;
- case R.id.logcat_copy:
- shareLogcat();
- return true;
- case R.id.logcat_refresh:
- refresh();
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ if (id == android.R.id.home) {
+ onBackPressed();
+ return true;
+ } else if (id == R.id.logcat_copy) {
+ shareLogcat();
+ return true;
+ } else if (id == R.id.logcat_refresh) {
+ refresh();
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
private void shareLogcat() {
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 50a0e7f2..9d9d0901 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
@@ -2,7 +2,6 @@ package org.fox.ttrss;
import android.annotation.SuppressLint;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
@@ -17,11 +16,15 @@ import android.view.View;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.widget.Toolbar;
+import androidx.core.graphics.Insets;
import androidx.core.view.GravityCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.gson.JsonElement;
@@ -34,8 +37,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
-import icepick.State;
-
public class MasterActivity extends OnlineActivity implements HeadlinesEventListener {
private final String TAG = this.getClass().getSimpleName();
@@ -45,8 +46,8 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
protected long m_lastRefresh = 0;
protected long m_lastWidgetRefresh = 0;
- @State protected boolean m_feedIsSelected = false;
- @State protected boolean m_userFeedSelected = false;
+ protected boolean m_feedIsSelected = false;
+ protected boolean m_userFeedSelected = false;
private ActionBarDrawerToggle m_drawerToggle;
private DrawerLayout m_drawerLayout;
@@ -69,6 +70,8 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
setSmallScreen(findViewById(R.id.sw600dp_anchor) == null);
+ applyEdgeToEdgeInsets();
+
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -196,6 +199,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
} else { // savedInstanceState != null
+ m_feedIsSelected = savedInstanceState.getBoolean("m_feedIsSelected");
+ m_userFeedSelected = savedInstanceState.getBoolean("m_userFeedSelected");
+
if (m_drawerLayout != null && !m_feedIsSelected) {
m_drawerLayout.openDrawer(GravityCompat.START);
}
@@ -219,7 +225,32 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
}
}
- protected void onPostCreate(Bundle savedInstanceState) {
+ private void applyEdgeToEdgeInsets() {
+ // https://stackoverflow.com/questions/79018063/trying-to-understand-edge-to-edge-in-android
+ // https://developer.android.com/develop/ui/views/layout/edge-to-edge
+
+ View coordinatorView = findViewById(R.id.headlines_coordinator);
+
+ if (coordinatorView != null) {
+ ViewCompat.setOnApplyWindowInsetsListener(coordinatorView, (v, windowInsets) -> {
+ Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(0, insets.top, 0, insets.bottom);
+ return windowInsets;
+ });
+ }
+
+ View navigationView = findViewById(R.id.modal_navigation_view);
+
+ if (navigationView != null) {
+ ViewCompat.setOnApplyWindowInsetsListener(navigationView, (v, windowInsets) -> {
+ Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(0, insets.top, 0, insets.bottom);
+ return windowInsets;
+ });
+ }
+ }
+
+ protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
if (m_drawerToggle != null) m_drawerToggle.syncState();
@@ -331,44 +362,43 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
return true;
}
- switch (item.getItemId()) {
- case R.id.headlines_toggle_sort_order:
+ if (item.getItemId() == R.id.headlines_toggle_sort_order) {
LinkedHashMap<String, String> sortModes = getSortModes();
- CharSequence[] sortTitles = sortModes.values().toArray(new CharSequence[0]);
- final CharSequence[] sortNames = sortModes.keySet().toArray(new CharSequence[0]);
+ CharSequence[] sortTitles = sortModes.values().toArray(new CharSequence[0]);
+ final CharSequence[] sortNames = sortModes.keySet().toArray(new CharSequence[0]);
- String currentMode = getSortMode();
+ String currentMode = getSortMode();
- int i = 0;
- int selectedIndex = 0;
+ int i = 0;
+ int selectedIndex = 0;
- for (CharSequence tmp : sortNames) {
- if (tmp.equals(currentMode)) {
- selectedIndex = i;
- break;
- }
+ for (CharSequence tmp : sortNames) {
+ if (tmp.equals(currentMode)) {
+ selectedIndex = i;
+ break;
+ }
- ++i;
- }
+ ++i;
+ }
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.headlines_sort_articles_title))
.setSingleChoiceItems(
- sortTitles,
+ sortTitles,
selectedIndex, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int 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();
@@ -380,11 +410,10 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
dialog.show();
return true;
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
@Override
public void onBackPressed() {
@@ -413,6 +442,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
public void onSaveInstanceState(Bundle out) {
super.onSaveInstanceState(out);
+ out.putBoolean("m_feedIsSelected", m_feedIsSelected);
+ out.putBoolean("m_userFeedSelected", m_userFeedSelected);
+
Application.getInstance().save(out);
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/NetworkPreferencesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/NetworkPreferencesFragment.java
index 8e0e6519..b279f307 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/NetworkPreferencesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/NetworkPreferencesFragment.java
@@ -1,15 +1,14 @@
package org.fox.ttrss;
import android.os.Bundle;
-import android.preference.PreferenceFragment;
-public class NetworkPreferencesFragment extends PreferenceFragment {
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceFragmentCompat;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+public class NetworkPreferencesFragment extends PreferenceFragmentCompat {
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.preferences_network);
+ @Override
+ public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
+ setPreferencesFromResource(R.xml.preferences_network, rootKey);
}
} \ No newline at end of file
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 2350187e..3af78ddf 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
@@ -31,8 +31,7 @@ import android.widget.TextView;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.Toolbar;
-import com.github.javiersantos.appupdater.AppUpdater;
-import com.github.javiersantos.appupdater.enums.UpdateFrom;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -91,7 +90,7 @@ public class OnlineActivity extends CommonActivity {
int titleStringId = searchQuery.length() > 0 ? R.string.catchup_dialog_title_search : R.string.catchup_dialog_title;
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setTitle(getString(titleStringId, feed.title))
.setSingleChoiceItems(
new String[] {
@@ -135,8 +134,7 @@ public class OnlineActivity extends CommonActivity {
dialog.show();
} else {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setMessage(getString(R.string.catchup_dialog_title, feed.title))
.setPositiveButton(R.string.catchup,
new Dialog.OnClickListener() {
@@ -155,7 +153,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- AlertDialog dialog = builder.create();
+ Dialog dialog = builder.create();
dialog.show();
}
}
@@ -271,23 +269,12 @@ public class OnlineActivity extends CommonActivity {
if (isOffline) {
switchOfflineSuccess();
} else {
- checkUpdates();
-
m_headlinesActionModeCallback = new HeadlinesActionModeCallback();
}
}
- protected void checkUpdates() {
- if (m_prefs.getBoolean("check_for_updates", true) && (BuildConfig.DEBUG || BuildConfig.ENABLE_UPDATER)) {
- new AppUpdater(this)
- .setUpdateFrom(UpdateFrom.JSON)
- .setUpdateJSON(String.format("https://srv.tt-rss.org/fdroid/updates/%1$s.json", this.getPackageName()))
- .start();
- }
- }
-
protected void switchOffline() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setMessage(R.string.dialog_offline_switch_prompt)
.setPositiveButton(R.string.dialog_offline_go,
new Dialog.OnClickListener() {
@@ -314,7 +301,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- AlertDialog dlg = builder.create();
+ Dialog dlg = builder.create();
dlg.show();
}
@@ -380,8 +367,8 @@ public class OnlineActivity extends CommonActivity {
setLoadingStatus(R.string.login_need_configure);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.dialog_need_configure_prompt)
+ 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) {
@@ -397,7 +384,8 @@ public class OnlineActivity extends CommonActivity {
dialog.cancel();
}
});
- AlertDialog alert = builder.create();
+
+ Dialog alert = builder.create();
alert.show();
} else {
@@ -439,53 +427,52 @@ public class OnlineActivity extends CommonActivity {
.getMenuInfo(); */
final ArticlePager ap = (ArticlePager)getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
-
- switch (item.getItemId()) {
- case R.id.article_img_open:
- if (getLastContentImageHitTestUrl() != null) {
- try {
- openUri(Uri.parse(getLastContentImageHitTestUrl()));
- } catch (Exception e) {
- e.printStackTrace();
- toast(R.string.error_other_error);
- }
- }
- return true;
- case R.id.article_img_copy:
- if (getLastContentImageHitTestUrl() != null) {
- copyToClipboard(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_share:
- if (getLastContentImageHitTestUrl() != null) {
- shareImageFromUri(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_share_url:
- if (getLastContentImageHitTestUrl() != null) {
- shareText(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_view_caption:
- if (getLastContentImageHitTestUrl() != null) {
- displayImageCaption(getLastContentImageHitTestUrl(), ap.getSelectedArticle().content);
+
+ int itemId = item.getItemId();
+ if (itemId == R.id.article_img_open) {
+ if (getLastContentImageHitTestUrl() != null) {
+ try {
+ openUri(Uri.parse(getLastContentImageHitTestUrl()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ toast(R.string.error_other_error);
+ }
}
return true;
- case R.id.article_link_share:
- if (ap != null && ap.getSelectedArticle() != null) {
- shareArticle(ap.getSelectedArticle());
- }
- return true;
- case R.id.article_link_copy:
- if (ap != null && ap.getSelectedArticle() != null) {
- copyToClipboard(ap.getSelectedArticle().link);
- }
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+ } else if (itemId == R.id.article_img_copy) {
+ if (getLastContentImageHitTestUrl() != null) {
+ copyToClipboard(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share) {
+ if (getLastContentImageHitTestUrl() != null) {
+ shareImageFromUri(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share_url) {
+ if (getLastContentImageHitTestUrl() != null) {
+ shareText(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_view_caption) {
+ if (getLastContentImageHitTestUrl() != null) {
+ displayImageCaption(getLastContentImageHitTestUrl(), ap.getSelectedArticle().content);
+ }
+ return true;
+ } else if (itemId == R.id.article_link_share) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ shareArticle(ap.getSelectedArticle());
+ }
+ return true;
+ } else if (itemId == R.id.article_link_copy) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ copyToClipboard(ap.getSelectedArticle().link);
+ }
+ return true;
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
public void displayAttachments(Article article) {
if (article != null && article.attachments != null && article.attachments.size() > 0) {
@@ -499,8 +486,7 @@ public class OnlineActivity extends CommonActivity {
itemUrls[i] = article.attachments.get(i).content_url;
}
- Dialog dialog = new Dialog(OnlineActivity.this);
- AlertDialog.Builder builder = new AlertDialog.Builder(OnlineActivity.this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setTitle(R.string.attachments_prompt)
.setCancelable(true)
.setSingleChoiceItems(items, 0, new OnClickListener() {
@@ -533,7 +519,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- dialog = builder.create();
+ Dialog dialog = builder.create();
dialog.show();
}
}
@@ -543,247 +529,249 @@ public class OnlineActivity extends CommonActivity {
final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
final ArticlePager ap = (ArticlePager)getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
- switch (item.getItemId()) {
- case R.id.subscribe_to_feed:
+ int itemId = item.getItemId();
+ if (itemId == R.id.subscribe_to_feed) {
Intent subscribe = new Intent(OnlineActivity.this, SubscribeActivity.class);
startActivityForResult(subscribe, 0);
return true;
- /*case R.id.toggle_attachments:
- if (true) {
- Article article = ap.getSelectedArticle();
+ } else if (itemId == R.id.toggle_attachments) {
+ Article article = ap.getSelectedArticle();
- if (article != null) {
- displayAttachments(article);
- }
+ if (article != null) {
+ displayAttachments(article);
}
- return true; */
+ return true;
/*case R.id.logout:
logout();
return true;*/
- case R.id.login:
- login();
- return true;
+ } else if (itemId == R.id.login) {
+ login();
+ return true;
/*case R.id.go_offline:
switchOffline();
return true;*/
- case R.id.article_set_note:
- if (ap != null && ap.getSelectedArticle() != null) {
- editArticleNote(ap.getSelectedArticle());
- }
- return true;
- case R.id.preferences:
- Intent intent = new Intent(OnlineActivity.this,
- PreferencesActivity.class);
- startActivityForResult(intent, 0);
- return true;
- case R.id.search:
- if (hf != null) {
- Dialog dialog = new Dialog(this);
+ } else if (itemId == R.id.article_set_note) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ editArticleNote(ap.getSelectedArticle());
+ }
+ return true;
+ } else if (itemId == R.id.preferences) {
+ Intent intent = new Intent(OnlineActivity.this,
+ PreferencesActivity.class);
+ startActivityForResult(intent, 0);
+ return true;
+ } else if (itemId == R.id.search) {
+ if (hf != null) {
+ Dialog dialog = new Dialog(this);
- final EditText edit = new EditText(this);
+ final EditText edit = new EditText(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.search)
- .setPositiveButton(getString(R.string.search),
- new OnClickListener() {
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.search)
+ .setPositiveButton(getString(R.string.search),
+ new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
-
- String query = edit.getText().toString().trim();
-
- hf.setSearchQuery(query);
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
- }
- })
- .setNegativeButton(getString(R.string.cancel),
- new OnClickListener() {
+ String query = edit.getText().toString().trim();
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
-
- //
+ hf.setSearchQuery(query);
- }
- }).setView(edit);
-
- dialog = builder.create();
- dialog.show();
- }
- return true;
- case R.id.headlines_mark_as_read:
- if (hf != null) {
+ }
+ })
+ .setNegativeButton(getString(R.string.cancel),
+ new OnClickListener() {
- Feed feed = hf.getFeed();
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
- if (feed != null) {
- catchupDialog(hf.getFeed());
- }
- }
- return true;
- case 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);
+ }
+ }).setView(edit);
- int selectedIndex = Arrays.asList(headlineModeValues).indexOf(headlineMode);
+ dialog = builder.create();
+ dialog.show();
+ }
+ return true;
+ } else if (itemId == R.id.headlines_mark_as_read) {
+ if (hf != null) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.headlines_set_view_mode)
- .setSingleChoiceItems(headlineModeNames,
- selectedIndex, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
- dialog.cancel();
+ Feed feed = hf.getFeed();
- SharedPreferences.Editor editor = m_prefs.edit();
- editor.putString("headline_mode", headlineModeValues[which]);
- editor.apply();
+ if (feed != null) {
+ catchupDialog(hf.getFeed());
+ }
+ }
+ return true;
+ } else if (itemId == R.id.headlines_display_mode) {
+ if (hf != null) {
+ Dialog dialog = new Dialog(this);
- Intent intent = getIntent();
+ 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);
- Feed feed = hf.getFeed();
+ int selectedIndex = Arrays.asList(headlineModeValues).indexOf(headlineMode);
- if (feed != null) {
- intent.putExtra("feed_id", feed.id);
- intent.putExtra("feed_is_cat", feed.is_cat);
- intent.putExtra("feed_title", feed.title);
- }
+ 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();
- finish();
+ SharedPreferences.Editor editor = m_prefs.edit();
+ editor.putString("headline_mode", headlineModeValues[which]);
+ editor.apply();
- startActivity(intent);
- overridePendingTransition(0, 0);
- }
- });
+ Intent intent = getIntent();
- dialog = builder.create();
- dialog.show();
+ Feed feed = hf.getFeed();
- }
- return true;
- case 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;
- }
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.headlines_set_view_mode)
- .setSingleChoiceItems(
- new String[] {
- getString(R.string.headlines_adaptive),
- getString(R.string.headlines_all_articles),
- getString(R.string.headlines_starred),
- getString(R.string.headlines_published),
- getString(R.string.headlines_unread) },
- selectedIndex, new DialogInterface.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();
+ if (feed != null) {
+ intent.putExtra("feed_id", feed.id);
+ intent.putExtra("feed_is_cat", feed.is_cat);
+ intent.putExtra("feed_title", feed.title);
+ }
- refresh();
- }
- });
+ finish();
- dialog = builder.create();
- dialog.show();
+ startActivity(intent);
+ overridePendingTransition(0, 0);
+ }
+ });
- }
- return true;
- case R.id.headlines_select:
- if (hf != null) {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.headlines_select_dialog)
- .setSingleChoiceItems(
- new String[] {
- getString(R.string.headlines_select_all),
- getString(R.string.headlines_select_unread),
- getString(R.string.headlines_select_none) },
- 0, new DialogInterface.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();
- }
- });
+ dialog = builder.create();
+ dialog.show();
- dialog = builder.create();
- dialog.show();
- }
- return true;
- /* case R.id.share_article:
+ }
+ 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;
+ }
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.headlines_set_view_mode)
+ .setSingleChoiceItems(
+ new String[]{
+ getString(R.string.headlines_adaptive),
+ getString(R.string.headlines_all_articles),
+ 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();
+ }
+ });
+
+ dialog = builder.create();
+ dialog.show();
+
+ }
+ return true;
+ } else if (itemId == R.id.headlines_select) {
+ if (hf != null) {
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.headlines_select_dialog)
+ .setSingleChoiceItems(
+ new String[]{
+ 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();
+ }
+ });
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ return true;
+ } else if (itemId == R.id.share_article) {
if (ap != null) {
shareArticle(ap.getSelectedArticle());
}
- return true; */
- case R.id.toggle_marked:
- if (ap != null && ap.getSelectedArticle() != null) {
- Article a = ap.getSelectedArticle();
- a.marked = !a.marked;
- saveArticleMarked(a);
- if (hf != null) hf.notifyUpdated();
+ return true;
+ } else if (itemId == R.id.article_set_score) {
+ if (ap != null) {
+ setArticleScore(ap.getSelectedArticle());
}
return true;
- case R.id.toggle_unread:
- if (ap != null && ap.getSelectedArticle() != null) {
- Article a = ap.getSelectedArticle();
- a.unread = !a.unread;
- saveArticleUnread(a);
- if (hf != null) hf.notifyUpdated();
- }
- return true;
+ } else if (itemId == R.id.toggle_marked) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ Article a = ap.getSelectedArticle();
+ a.marked = !a.marked;
+ saveArticleMarked(a);
+ if (hf != null) hf.notifyUpdated();
+ }
+ return true;
+ } else if (itemId == R.id.toggle_unread) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ Article a = ap.getSelectedArticle();
+ a.unread = !a.unread;
+ saveArticleUnread(a);
+ if (hf != null) hf.notifyUpdated();
+ }
+ return true;
/* case R.id.selection_select_none:
if (hf != null) {
ArticleList selected = hf.getSelectedArticles();
@@ -794,105 +782,103 @@ public class OnlineActivity extends CommonActivity {
}
}
return true; */
- case R.id.selection_toggle_unread:
- if (hf != null) {
- ArticleList selected = hf.getSelectedArticles();
+ } else if (itemId == R.id.selection_toggle_unread) {
+ if (hf != null) {
+ ArticleList selected = hf.getSelectedArticles();
- if (selected.size() > 0) {
- for (Article a : selected)
- a.unread = !a.unread;
+ if (selected.size() > 0) {
+ for (Article a : selected)
+ a.unread = !a.unread;
- toggleArticlesUnread(selected);
- hf.notifyUpdated();
- invalidateOptionsMenu();
- }
- }
- return true;
- case R.id.selection_toggle_marked:
- if (hf != null) {
- ArticleList selected = hf.getSelectedArticles();
+ toggleArticlesUnread(selected);
+ hf.notifyUpdated();
+ invalidateOptionsMenu();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.selection_toggle_marked) {
+ if (hf != null) {
+ ArticleList selected = hf.getSelectedArticles();
- if (selected.size() > 0) {
- for (Article a : selected)
- a.marked = !a.marked;
+ if (selected.size() > 0) {
+ for (Article a : selected)
+ a.marked = !a.marked;
- toggleArticlesMarked(selected);
- hf.notifyUpdated();
- invalidateOptionsMenu();
- }
- }
- return true;
- case R.id.selection_toggle_published:
- if (hf != null) {
- ArticleList selected = hf.getSelectedArticles();
+ toggleArticlesMarked(selected);
+ hf.notifyUpdated();
+ invalidateOptionsMenu();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.selection_toggle_published) {
+ if (hf != null) {
+ ArticleList selected = hf.getSelectedArticles();
- if (selected.size() > 0) {
- for (Article a : selected)
- a.published = !a.published;
+ if (selected.size() > 0) {
+ for (Article a : selected)
+ a.published = !a.published;
- toggleArticlesPublished(selected);
- hf.notifyUpdated();
- invalidateOptionsMenu();
- }
- }
- return true;
- case R.id.toggle_published:
- if (ap != null && ap.getSelectedArticle() != null) {
- Article a = ap.getSelectedArticle();
- a.published = !a.published;
- saveArticlePublished(a);
- if (hf != null) hf.notifyUpdated();
- }
- return true;
- case R.id.catchup_above:
- if (hf != null) {
+ toggleArticlesPublished(selected);
+ hf.notifyUpdated();
+ invalidateOptionsMenu();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.toggle_published) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ Article a = ap.getSelectedArticle();
+ a.published = !a.published;
+ saveArticlePublished(a);
+ if (hf != null) hf.notifyUpdated();
+ }
+ return true;
+ } else if (itemId == R.id.catchup_above) {
+ if (hf != null) {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- OnlineActivity.this)
- .setMessage(R.string.confirm_catchup_above)
- .setPositiveButton(R.string.dialog_ok,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
+ 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);
+ catchupAbove(hf, ap);
- }
- })
- .setNegativeButton(R.string.dialog_cancel,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
+ }
+ })
+ .setNegativeButton(R.string.dialog_cancel,
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
- }
- });
+ }
+ });
- AlertDialog dialog = builder.create();
- dialog.show();
+ Dialog dialog = builder.create();
+ dialog.show();
- }
- return true;
- case R.id.set_labels:
- if (ap != null && ap.getSelectedArticle() != null) {
- if (getApiLevel() != 7) {
- editArticleLabels(ap.getSelectedArticle());
- } else {
- toast(R.string.server_function_not_available);
- }
-
- }
- return true;
+ }
+ return true;
+ } else if (itemId == R.id.set_labels) {
+ if (ap != null && ap.getSelectedArticle() != null) {
+ if (getApiLevel() != 7) {
+ editArticleLabels(ap.getSelectedArticle());
+ } else {
+ toast(R.string.server_function_not_available);
+ }
+
+ }
+ return true;
/*case R.id.update_headlines:
if (hf != null) {
//m_pullToRefreshAttacher.setRefreshing(true);
hf.refresh(false, true);
}
return true;*/
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
private void catchupAbove(HeadlinesFragment hf, ArticlePager ap) {
if (ap != null && ap.getSelectedArticle() != null) {
@@ -952,9 +938,10 @@ public class OnlineActivity extends CommonActivity {
public void editArticleNote(final Article article) {
String note = "";
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(article.title);
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(article.title);
+
final EditText topicEdit = new EditText(this);
topicEdit.setText(note);
builder.setView(topicEdit);
@@ -980,7 +967,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- AlertDialog dialog = builder.create();
+ Dialog dialog = builder.create();
dialog.show();
}
@@ -1003,9 +990,8 @@ public class OnlineActivity extends CommonActivity {
itemIds[i] = labels.get(i).id;
checkedItems[i] = labels.get(i).checked;
}
-
- Dialog dialog = new Dialog(OnlineActivity.this);
- AlertDialog.Builder builder = new AlertDialog.Builder(OnlineActivity.this)
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(OnlineActivity.this)
.setTitle(R.string.article_set_labels)
.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
@@ -1033,7 +1019,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- dialog = builder.create();
+ Dialog dialog = builder.create();
dialog.show();
}
@@ -1075,8 +1061,7 @@ public class OnlineActivity extends CommonActivity {
if (getDatabaseHelper().hasOfflineData()) {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- OnlineActivity.this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setMessage(R.string.dialog_offline_prompt)
.setPositiveButton(R.string.dialog_offline_go,
new Dialog.OnClickListener() {
@@ -1093,7 +1078,7 @@ public class OnlineActivity extends CommonActivity {
}
});
- AlertDialog dlg = builder.create();
+ Dialog dlg = builder.create();
dlg.show();
}
}
@@ -1249,6 +1234,45 @@ public class OnlineActivity extends CommonActivity {
}
}
+ public void setArticleScore(Article article) {
+ final EditText edit = new EditText(this);
+ edit.setText(String.valueOf(article.score));
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.score_for_this_article)
+ .setPositiveButton(R.string.set_score,
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ try {
+ article.score = Integer.parseInt(edit.getText().toString());
+
+ 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) {
+
+ //
+
+ }
+ }).setView(edit);
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
@@ -1418,14 +1442,14 @@ public class OnlineActivity extends CommonActivity {
Article article = ap.getSelectedArticle();
if (article != null) {
- m_menu.findItem(R.id.toggle_marked).setIcon(article.marked ? R.drawable.ic_star :
- R.drawable.ic_star_outline);
+ m_menu.findItem(R.id.toggle_marked).setIcon(article.marked ? R.drawable.baseline_star_24 :
+ R.drawable.baseline_star_outline_24);
- m_menu.findItem(R.id.toggle_published).setIcon(article.published ? R.drawable.ic_checkbox_marked :
- R.drawable.ic_rss_box);
+ m_menu.findItem(R.id.toggle_published).setIcon(article.published ? R.drawable.baseline_check_box_24 :
+ R.drawable.baseline_rss_feed_24);
- m_menu.findItem(R.id.toggle_unread).setIcon(article.unread ? R.drawable.ic_email :
- R.drawable.ic_email_open);
+ m_menu.findItem(R.id.toggle_unread).setIcon(article.unread ? R.drawable.baseline_mark_as_unread_24 :
+ R.drawable.baseline_email_24);
}
}
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 af321a5a..9ac9f56c 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
@@ -5,6 +5,7 @@ import android.preference.PreferenceManager;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.FragmentTransaction;
public class PreferencesActivity extends CommonActivity {
@Override
@@ -24,10 +25,9 @@ public class PreferencesActivity extends CommonActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
- getSupportActionBar().hide();
if (savedInstanceState == null) {
- android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.preferences_container, new PreferencesFragment());
ft.commit();
@@ -36,13 +36,11 @@ public class PreferencesActivity extends CommonActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- onBackPressed();
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ if (item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
}
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 65e0b556..af4c6b44 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
@@ -5,32 +5,31 @@ import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
+
+import androidx.activity.EdgeToEdge;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
import java.text.SimpleDateFormat;
import java.util.Date;
-public class PreferencesFragment extends PreferenceFragment {
+public class PreferencesFragment extends PreferenceFragmentCompat {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.preferences);
-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
- findPreference("check_for_updates").setEnabled(BuildConfig.DEBUG || BuildConfig.ENABLE_UPDATER);
-
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 Preference.OnPreferenceClickListener() {
+ findPreference("show_logcat").setOnPreferenceClickListener(new androidx.preference.Preference.OnPreferenceClickListener() {
@Override
- public boolean onPreferenceClick(Preference preference) {
+ public boolean onPreferenceClick(@NonNull androidx.preference.Preference preference) {
Intent intent = new Intent(getActivity(), LogcatActivity.class);
startActivity(intent);
return false;
@@ -40,7 +39,7 @@ public class PreferencesFragment extends PreferenceFragment {
findPreference("network_settings").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
- getFragmentManager()
+ getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.preferences_container, new NetworkPreferencesFragment() )
.addToBackStack( NetworkPreferencesFragment.class.getSimpleName() )
@@ -76,4 +75,9 @@ public class PreferencesFragment extends PreferenceFragment {
}
}
+
+ @Override
+ public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
+ setPreferencesFromResource(R.xml.preferences,rootKey);
+ }
} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/StateSavedFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/StateSavedFragment.java
deleted file mode 100755
index 08802acd..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/StateSavedFragment.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.fox.ttrss;
-
-import android.os.Bundle;
-
-import com.livefront.bridge.Bridge;
-
-import androidx.fragment.app.Fragment;
-
-public class StateSavedFragment extends Fragment {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Bridge.restoreInstanceState(this, savedInstanceState);
- }
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
-
- Bridge.saveInstanceState(this, out);
- }
-}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/YoutubePlayerActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/YoutubePlayerActivity.java
deleted file mode 100755
index 81afbf0e..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/YoutubePlayerActivity.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.fox.ttrss;
-
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-
-import com.google.android.youtube.player.YouTubeInitializationResult;
-import com.google.android.youtube.player.YouTubePlayer;
-import com.google.android.youtube.player.YouTubePlayerSupportFragment;
-
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.appcompat.widget.Toolbar;
-import icepick.State;
-
-
-public class YoutubePlayerActivity extends CommonActivity implements YouTubePlayer.OnInitializedListener {
-
- private final String TAG = this.getClass().getSimpleName();
- private static final String DEVELOPER_KEY = "AIzaSyD8BS4Uj21jg_gHZfP4v0VXrAWiwqd05nk";
-
- @State protected String m_streamUri;
- @State protected String m_videoId;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
-
- getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
- setTheme(R.style.AppTheme);
-
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_youtube_player);
-
- Toolbar toolbar = findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
-
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-
- if (!isPortrait())
- getSupportActionBar().hide();
-
- setTitle(getIntent().getStringExtra("title"));
-
- if (savedInstanceState == null) {
- m_streamUri = getIntent().getStringExtra("streamUri");
- m_videoId = getIntent().getStringExtra("vid");
- }
-
- YouTubePlayerSupportFragment frag = (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_youtube_player);
- frag.initialize(DEVELOPER_KEY, this);
- }
-
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
-
- if (!isPortrait())
- getSupportActionBar().hide();
- else
- getSupportActionBar().show();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_youtube_player, menu);
- return true;
- }
-
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenu.ContextMenuInfo menuInfo) {
-
- getMenuInflater().inflate(R.menu.activity_youtube_player, menu);
-
- super.onCreateContextMenu(menu, v, menuInfo);
- }
-
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- return onContextItemSelected(item); // this is really bad :()
- }
-
- @Override
- public boolean onContextItemSelected(android.view.MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- onBackPressed();
- return true;
- case R.id.article_vid_open:
- if (m_streamUri != null) {
- try {
- openUri(Uri.parse(m_streamUri));
- } catch (Exception e) {
- e.printStackTrace();
- toast(R.string.error_other_error);
- }
- }
- return true;
- case R.id.article_vid_share:
- if (m_streamUri != null) {
- shareText(m_streamUri);
- }
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
-
- @Override
- public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
- Log.d(TAG, "youtube: init success");
-
- findViewById(R.id.video_loading).setVisibility(View.GONE);
-
- if (!wasRestored) {
- player.cueVideo(m_videoId);
- }
- }
-
- @Override
- public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult result) {
- Log.d(TAG, "youtube: init failure");
-
- findViewById(R.id.video_loading).setVisibility(View.GONE);
-
- toast(result.toString());
- }
-
- @Override
- public void onPause() {
- super.onPause();
-
- if (isFinishing()) {
- overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
- }
-
- }
-}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
index 5b63356d..96e0ee34 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
@@ -24,6 +24,8 @@ import android.widget.EditText;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.Toolbar;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import org.fox.ttrss.CommonActivity;
import org.fox.ttrss.OnlineActivity;
import org.fox.ttrss.PreferencesActivity;
@@ -100,54 +102,53 @@ public class OfflineActivity extends CommonActivity {
.getMenuInfo(); */
final OfflineArticlePager ap = (OfflineArticlePager)getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
-
- switch (item.getItemId()) {
- case R.id.article_img_open:
- if (getLastContentImageHitTestUrl() != null) {
- try {
- openUri(Uri.parse(getLastContentImageHitTestUrl()));
- } catch (Exception e) {
- e.printStackTrace();
- toast(R.string.error_other_error);
- }
- }
- return true;
- case R.id.article_img_copy:
- if (getLastContentImageHitTestUrl() != null) {
- copyToClipboard(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_share:
- if (getLastContentImageHitTestUrl() != null) {
- shareImageFromUri(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_share_url:
- if (getLastContentImageHitTestUrl() != null) {
- shareText(getLastContentImageHitTestUrl());
- }
- return true;
- case R.id.article_img_view_caption:
- if (getLastContentImageHitTestUrl() != null) {
- String content = "";
-
- Cursor article = getArticleById(ap.getSelectedArticleId());
-
- if (article != null) {
- content = article.getString(article.getColumnIndex("content"));
- article.close();
- }
+ int itemId = item.getItemId();
+ if (itemId == R.id.article_img_open) {
+ if (getLastContentImageHitTestUrl() != null) {
+ try {
+ openUri(Uri.parse(getLastContentImageHitTestUrl()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ toast(R.string.error_other_error);
+ }
+ }
+ return true;
+ } else if (itemId == R.id.article_img_copy) {
+ if (getLastContentImageHitTestUrl() != null) {
+ copyToClipboard(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share) {
+ if (getLastContentImageHitTestUrl() != null) {
+ shareImageFromUri(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_share_url) {
+ if (getLastContentImageHitTestUrl() != null) {
+ shareText(getLastContentImageHitTestUrl());
+ }
+ return true;
+ } else if (itemId == R.id.article_img_view_caption) {
+ if (getLastContentImageHitTestUrl() != null) {
- displayImageCaption(getLastContentImageHitTestUrl(), content);
+ String content = "";
+
+ Cursor article = getArticleById(ap.getSelectedArticleId());
+
+ if (article != null) {
+ content = article.getString(article.getColumnIndex("content"));
+ article.close();
+ }
+
+ displayImageCaption(getLastContentImageHitTestUrl(), content);
}
return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
-
- }
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -244,303 +245,295 @@ public class OfflineActivity extends CommonActivity {
final OfflineArticlePager oap = (OfflineArticlePager) getSupportFragmentManager()
.findFragmentByTag(FRAG_ARTICLE);
- switch (item.getItemId()) {
- /* case android.R.id.home:
+ int itemId = item.getItemId();/* case android.R.id.home:
finish();
- return true; */
- /* case R.id.headlines_toggle_sidebar:
+ return true; *//* case R.id.headlines_toggle_sidebar:
if (true && !isSmallScreen()) {
SharedPreferences.Editor editor = m_prefs.edit();
editor.putBoolean("headlines_hide_sidebar", !m_prefs.getBoolean("headlines_hide_sidebar", false));
editor.commit();
-
+
if (ohf != null && ohf.isAdded()) {
ohf.getView().setVisibility(m_prefs.getBoolean("headlines_hide_sidebar", false) ? View.GONE : View.VISIBLE);
}
}
- return true; */
- /*case R.id.go_online:
+ return true; *//*case R.id.go_online:
switchOnline();
return true;*/
- case R.id.search:
- if (ohf != null) {
- Dialog dialog = new Dialog(this);
-
- final EditText edit = new EditText(this);
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.search)
- .setPositiveButton(getString(R.string.search),
- new OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
-
- String query = edit.getText().toString().trim();
-
- ohf.setSearchQuery(query);
-
- }
- })
- .setNegativeButton(getString(R.string.cancel),
- new OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
-
- //
-
- }
- }).setView(edit);
-
- dialog = builder.create();
- dialog.show();
- }
-
- return true;
- case R.id.preferences:
- Intent intent = new Intent(this, PreferencesActivity.class);
- startActivityForResult(intent, 0);
- return true;
- case R.id.headlines_view_mode:
- if (ohf != null) {
- Dialog dialog = new Dialog(this);
-
- String viewMode = getViewMode();
-
- //Log.d(TAG, "viewMode:" + getViewMode());
+ if (itemId == R.id.search) {
+ if (ohf != null) {
+ Dialog dialog = new Dialog(this);
- int selectedIndex = 0;
-
- if (viewMode.equals("all_articles")) {
- selectedIndex = 0;
- } else if (viewMode.equals("marked")) {
- selectedIndex = 1;
- } else if (viewMode.equals("published")) {
- selectedIndex = 2;
- } else if (viewMode.equals("unread")) {
- selectedIndex = 3;
- }
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.headlines_set_view_mode)
- .setSingleChoiceItems(
- new String[] {
- /* getString(R.string.headlines_adaptive), */
- getString(R.string.headlines_all_articles),
- getString(R.string.headlines_starred),
- getString(R.string.headlines_published),
- getString(R.string.headlines_unread) },
- selectedIndex, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
- switch (which) {
+ final EditText edit = new EditText(this);
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.search)
+ .setPositiveButton(getString(R.string.search),
+ new OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ String query = edit.getText().toString().trim();
+
+ ohf.setSearchQuery(query);
+
+ }
+ })
+ .setNegativeButton(getString(R.string.cancel),
+ new OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ //
+
+ }
+ }).setView(edit);
+
+ dialog = builder.create();
+ dialog.show();
+ }
+
+ return true;
+ } else if (itemId == R.id.preferences) {
+ Intent intent = new Intent(this, PreferencesActivity.class);
+ startActivityForResult(intent, 0);
+ return true;
+ } else if (itemId == R.id.headlines_view_mode) {
+ if (ohf != null) {
+ Dialog dialog = new Dialog(this);
+
+ String viewMode = getViewMode();
+
+ //Log.d(TAG, "viewMode:" + getViewMode());
+
+ int selectedIndex = 0;
+
+ if (viewMode.equals("all_articles")) {
+ selectedIndex = 0;
+ } else if (viewMode.equals("marked")) {
+ selectedIndex = 1;
+ } else if (viewMode.equals("published")) {
+ selectedIndex = 2;
+ } else if (viewMode.equals("unread")) {
+ selectedIndex = 3;
+ }
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.headlines_set_view_mode)
+ .setSingleChoiceItems(
+ new String[]{
+ /* getString(R.string.headlines_adaptive), */
+ getString(R.string.headlines_all_articles),
+ 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 0:
- setViewMode("all_articles");
- break;
- case 1:
- setViewMode("marked");
- break;
- case 2:
- setViewMode("published");
- break;
- case 3:
- setViewMode("unread");
- break;
- }
- dialog.cancel();
-
- refresh();
- }
- });
-
- dialog = builder.create();
- dialog.show();
+ case 0:
+ setViewMode("all_articles");
+ break;
+ case 1:
+ setViewMode("marked");
+ break;
+ case 2:
+ setViewMode("published");
+ break;
+ case 3:
+ setViewMode("unread");
+ break;
+ }
+ dialog.cancel();
+
+ refresh();
+ }
+ });
+
+ dialog = builder.create();
+ dialog.show();
+
+ }
+ return true;
+ } else if (itemId == R.id.headlines_select) {
+ if (ohf != null) {
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.headlines_select_dialog)
+ .setSingleChoiceItems(new String[]{
+ 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) {
+
+ selectArticles(ohf.getFeedId(), ohf.getFeedIsCat(), which);
+ invalidateOptionsMenu();
+ refresh();
+
+ dialog.cancel();
+ }
+ });
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ return true;
+ } else if (itemId == R.id.headlines_mark_as_read) {
+ if (ohf != null) {
+ final int feedId = ohf.getFeedId();
+ final boolean isCat = ohf.getFeedIsCat();
+
+ int count = getUnreadArticleCount(feedId, isCat);
+
+ if (count > 0) {
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
+ .setMessage(getResources().getQuantityString(R.plurals.mark_num_headlines_as_read, count, count))
+ .setPositiveButton(R.string.catchup,
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ catchupFeed(feedId, isCat);
+
+ }
+ })
+ .setNegativeButton(R.string.dialog_cancel,
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ }
+ });
+
+ Dialog dlg = builder.create();
+ dlg.show();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.share_article) {
+ int articleId = oap.getSelectedArticleId();
+
+ shareArticle(articleId);
- }
- return true;
- case R.id.headlines_select:
- if (ohf != null) {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.headlines_select_dialog);
-
- builder.setSingleChoiceItems(new String[] {
- getString(R.string.headlines_select_all),
- getString(R.string.headlines_select_unread),
- getString(R.string.headlines_select_none) }, 0,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
-
- selectArticles(ohf.getFeedId(), ohf.getFeedIsCat(), which);
- invalidateOptionsMenu();
- refresh();
-
- dialog.cancel();
- }
- });
-
- dialog = builder.create();
- dialog.show();
- }
- return true;
- case R.id.headlines_mark_as_read:
- if (ohf != null) {
- final int feedId = ohf.getFeedId();
- final boolean isCat = ohf.getFeedIsCat();
-
- int count = getUnreadArticleCount(feedId, isCat);
-
- if (count > 0) {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- OfflineActivity.this)
- .setMessage(getResources().getQuantityString(R.plurals.mark_num_headlines_as_read, count, count))
- .setPositiveButton(R.string.catchup,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- catchupFeed(feedId, isCat);
-
- }
- })
- .setNegativeButton(R.string.dialog_cancel,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- }
- });
-
- AlertDialog dlg = builder.create();
- dlg.show();
- }
- }
- return true;
- /* case R.id.share_article:
- if (true) {
- int articleId = oap.getSelectedArticleId();
-
- shareArticle(articleId);
- }
- return true; */
- case R.id.toggle_marked:
- if (oap != null) {
- int articleId = oap.getSelectedArticleId();
-
- SQLiteStatement stmt = getDatabase().compileStatement(
- "UPDATE articles SET modified = 1, modified_marked = 1, marked = NOT marked WHERE "
- + BaseColumns._ID + " = ?");
- stmt.bindLong(1, articleId);
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.toggle_unread:
- if (oap != null) {
- int articleId = oap.getSelectedArticleId();
-
- SQLiteStatement stmt = getDatabase().compileStatement(
- "UPDATE articles SET modified = 1, unread = NOT unread WHERE "
- + BaseColumns._ID + " = ?");
- stmt.bindLong(1, articleId);
- stmt.execute();
- stmt.close();
-
- refresh();
- }
return true;
+ } else if (itemId == R.id.toggle_marked) {
+ if (oap != null) {
+ int articleId = oap.getSelectedArticleId();
+
+ SQLiteStatement stmt = getDatabase().compileStatement(
+ "UPDATE articles SET modified = 1, modified_marked = 1, marked = NOT marked WHERE "
+ + BaseColumns._ID + " = ?");
+ stmt.bindLong(1, articleId);
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.toggle_unread) {
+ if (oap != null) {
+ int articleId = oap.getSelectedArticleId();
+
+ SQLiteStatement stmt = getDatabase().compileStatement(
+ "UPDATE articles SET modified = 1, unread = NOT unread WHERE "
+ + BaseColumns._ID + " = ?");
+ stmt.bindLong(1, articleId);
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
/* case R.id.selection_select_none:
- deselectAllArticles();
+ deselectAllArticles();
return true; */
- case R.id.selection_toggle_unread:
- if (getSelectedArticleCount() > 0) {
- SQLiteStatement stmt = getDatabase()
- .compileStatement(
- "UPDATE articles SET modified = 1, unread = NOT unread WHERE selected = 1");
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.selection_toggle_marked:
- if (getSelectedArticleCount() > 0) {
- SQLiteStatement stmt = getDatabase()
- .compileStatement(
- "UPDATE articles SET modified = 1, modified_marked = 1, marked = NOT marked WHERE selected = 1");
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.selection_toggle_published:
- if (getSelectedArticleCount() > 0) {
- SQLiteStatement stmt = getDatabase()
- .compileStatement(
- "UPDATE articles SET modified = 1, modified_published = 1, published = NOT published WHERE selected = 1");
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.toggle_published:
- if (oap != null) {
- int articleId = oap.getSelectedArticleId();
-
- SQLiteStatement stmt = getDatabase().compileStatement(
- "UPDATE articles SET modified = 1, modified_published = 1, published = NOT published WHERE "
- + BaseColumns._ID + " = ?");
- stmt.bindLong(1, articleId);
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.catchup_above:
- if (oap != null) {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- OfflineActivity.this)
- .setMessage(R.string.confirm_catchup_above)
- .setPositiveButton(R.string.dialog_ok,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- catchupAbove(oap);
-
- }
- })
- .setNegativeButton(R.string.dialog_cancel,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- }
- });
-
- AlertDialog dlg = builder.create();
- dlg.show();
- }
- return true;
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ } else if (itemId == R.id.selection_toggle_unread) {
+ if (getSelectedArticleCount() > 0) {
+ SQLiteStatement stmt = getDatabase()
+ .compileStatement(
+ "UPDATE articles SET modified = 1, unread = NOT unread WHERE selected = 1");
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.selection_toggle_marked) {
+ if (getSelectedArticleCount() > 0) {
+ SQLiteStatement stmt = getDatabase()
+ .compileStatement(
+ "UPDATE articles SET modified = 1, modified_marked = 1, marked = NOT marked WHERE selected = 1");
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.selection_toggle_published) {
+ if (getSelectedArticleCount() > 0) {
+ SQLiteStatement stmt = getDatabase()
+ .compileStatement(
+ "UPDATE articles SET modified = 1, modified_published = 1, published = NOT published WHERE selected = 1");
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.toggle_published) {
+ if (oap != null) {
+ int articleId = oap.getSelectedArticleId();
+
+ SQLiteStatement stmt = getDatabase().compileStatement(
+ "UPDATE articles SET modified = 1, modified_published = 1, published = NOT published WHERE "
+ + BaseColumns._ID + " = ?");
+ stmt.bindLong(1, articleId);
+ stmt.execute();
+ stmt.close();
+
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.catchup_above) {
+ if (oap != null) {
+ 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(oap);
+
+ }
+ })
+ .setNegativeButton(R.string.dialog_cancel,
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ }
+ });
+
+ Dialog dlg = builder.create();
+ dlg.show();
+ }
+ return true;
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
private void catchupAbove(OfflineArticlePager oap) {
int articleId = oap.getSelectedArticleId();
@@ -610,14 +603,14 @@ public class OfflineActivity extends CommonActivity {
boolean marked = article.getInt(article.getColumnIndex("marked")) == 1;
boolean published = article.getInt(article.getColumnIndex("published")) == 1;
- m_menu.findItem(R.id.toggle_marked).setIcon(marked ? R.drawable.ic_star :
- R.drawable.ic_star_outline);
+ m_menu.findItem(R.id.toggle_marked).setIcon(marked ? R.drawable.baseline_star_24 :
+ R.drawable.baseline_star_outline_24);
- m_menu.findItem(R.id.toggle_published).setIcon(published ? R.drawable.ic_checkbox_marked :
- R.drawable.ic_rss_box);
+ m_menu.findItem(R.id.toggle_published).setIcon(published ? R.drawable.baseline_check_box_24 :
+ R.drawable.baseline_rss_feed_24);
- m_menu.findItem(R.id.toggle_unread).setIcon(unread ? R.drawable.ic_email :
- R.drawable.ic_email_open);
+ m_menu.findItem(R.id.toggle_unread).setIcon(unread ? R.drawable.baseline_mark_as_unread_24 :
+ R.drawable.baseline_email_24);
article.close();
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
index a3b152a7..dfc47131 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
@@ -43,6 +43,8 @@ import java.util.Date;
import androidx.fragment.app.Fragment;
+import com.google.android.material.button.MaterialButton;
+
public class OfflineArticleFragment extends Fragment {
private final String TAG = this.getClass().getSimpleName();
@@ -127,26 +129,25 @@ public class OfflineArticleFragment extends Fragment {
public boolean onContextItemSelected(MenuItem item) {
/* AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo(); */
-
- switch (item.getItemId()) {
- case R.id.article_link_share:
- m_activity.shareArticle(m_articleId);
- return true;
- case R.id.article_link_copy:
- if (true) {
- Cursor article = m_activity.getArticleById(m_articleId);
-
- if (article != null) {
- m_activity.copyToClipboard(article.getString(article.getColumnIndex("link")));
- article.close();
- }
- }
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+
+ int itemId = item.getItemId();
+ if (itemId == R.id.article_link_share) {
+ m_activity.shareArticle(m_articleId);
+ return true;
+ } else if (itemId == R.id.article_link_copy) {
+ if (true) {
+ Cursor article = m_activity.getArticleById(m_articleId);
+
+ if (article != null) {
+ m_activity.copyToClipboard(article.getString(article.getColumnIndex("link")));
+ article.close();
+ }
+ }
+ return true;
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
@@ -198,7 +199,6 @@ public class OfflineArticleFragment extends Fragment {
m_cursor.moveToFirst();
if (m_cursor.isFirst()) {
- m_contentView = view.findViewById(R.id.article_scrollview);
m_customViewContainer = view.findViewById(R.id.article_fullscreen_video);
final String link = m_cursor.getString(m_cursor.getColumnIndex("link"));
@@ -235,19 +235,19 @@ public class OfflineArticleFragment extends Fragment {
}
- ImageView score = view.findViewById(R.id.score);
+ /* MaterialButton score = view.findViewById(R.id.score);
if (score != null) {
score.setVisibility(View.GONE);
}
- ImageView attachments = view.findViewById(R.id.attachments);
+ MaterialButton attachments = view.findViewById(R.id.attachments);
if (attachments != null) {
attachments.setVisibility(View.GONE);
}
- ImageView share = view.findViewById(R.id.share);
+ MaterialButton share = view.findViewById(R.id.share);
if (share != null) {
share.setOnClickListener(new OnClickListener() {
@@ -256,15 +256,14 @@ public class OfflineArticleFragment extends Fragment {
m_activity.shareArticle(m_articleId);
}
});
- }
-
+ } */
TextView comments = view.findViewById(R.id.comments);
if (comments != null) {
comments.setVisibility(View.GONE);
}
-
+
TextView note = view.findViewById(R.id.note);
if (note != null) {
@@ -275,10 +274,6 @@ public class OfflineArticleFragment extends Fragment {
if (m_web != null) {
- if (m_activity.isUiNightMode()) {
- m_web.setBackgroundColor(Color.BLACK);
- }
-
m_web.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
@@ -311,19 +306,16 @@ public class OfflineArticleFragment extends Fragment {
});
String content;
- String cssOverride = "";
WebSettings ws = m_web.getSettings();
ws.setSupportZoom(false);
+ ws.setJavaScriptEnabled(false);
- if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- ws.setJavaScriptEnabled(true);
+ m_chromeClient = new FSVideoChromeClient(getView());
+ m_web.setWebChromeClient(m_chromeClient);
+ m_web.setBackgroundColor(Color.TRANSPARENT);
- m_chromeClient = new FSVideoChromeClient(getView());
- m_web.setWebChromeClient(m_chromeClient);
-
- ws.setMediaPlaybackRequiresUserGesture(true);
- }
+ ws.setMediaPlaybackRequiresUserGesture(true);
// we need to show "insecure" file:// urls
if (m_prefs.getBoolean("offline_image_cache_enabled", false) &&
@@ -332,24 +324,17 @@ public class OfflineArticleFragment extends Fragment {
ws.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
- TypedValue tvBackground = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.articleBackground, tvBackground, true);
-
- String backgroundHexColor = String.format("#%06X", (0xFFFFFF & tvBackground.data));
-
- cssOverride = "body { background : "+ backgroundHexColor+"; }";
-
TypedValue tvTextColor = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.articleTextColor, tvTextColor, true);
+ getActivity().getTheme().resolveAttribute(R.attr.colorOnSurface, tvTextColor, true);
String textColor = String.format("#%06X", (0xFFFFFF & tvTextColor.data));
- cssOverride += "body { color : "+textColor+"; }";
+ String cssOverride = "body { color : "+textColor+"; }";
- TypedValue tvLinkColor = new TypedValue();
- getActivity().getTheme().resolveAttribute(R.attr.linkColor, tvLinkColor, true);
+ TypedValue tvColorPrimary = new TypedValue();
+ getActivity().getTheme().resolveAttribute(R.attr.colorPrimary, tvColorPrimary, true);
- String linkHexColor = String.format("#%06X", (0xFFFFFF & tvLinkColor.data));
+ String linkHexColor = String.format("#%06X", (0xFFFFFF & tvColorPrimary.data));
cssOverride += " a:link {color: "+linkHexColor+";} a:visited { color: "+linkHexColor+";}";
String articleContent = m_cursor.getString(m_cursor.getColumnIndex("content"));
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java
index 20c2fd0c..ce4f6f72 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java
@@ -136,7 +136,7 @@ public class OfflineArticlePager extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.article_pager, container, false);
+ View view = inflater.inflate(R.layout.fragment_article_pager, container, false);
if (savedInstanceState != null) {
m_articleId = savedInstanceState.getInt("articleId", 0);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java
index 50335966..1f8f3dc6 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java
@@ -169,15 +169,13 @@ public class OfflineDetailActivity extends OfflineActivity implements OfflineHea
return true;
}
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
@Override
public void onArticleSelected(int articleId, boolean open) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java
index 933fbc03..c3c31133 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java
@@ -116,7 +116,7 @@ public class OfflineDownloadService extends Service {
.setContentTitle(getString(R.string.notify_downloading_title))
.setContentIntent(contentIntent)
.setWhen(System.currentTimeMillis())
- .setSmallIcon(R.drawable.ic_cloud_download)
+ .setSmallIcon(R.drawable.baseline_cloud_download_24)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(),
R.drawable.ic_launcher))
.setOngoing(!isError)
@@ -124,20 +124,17 @@ public class OfflineDownloadService extends Service {
if (showProgress) builder.setProgress(max, progress, max == 0);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ intent = new Intent(this, OnlineActivity.class);
+ intent.setAction(INTENT_ACTION_CANCEL);
- intent = new Intent(this, OnlineActivity.class);
- intent.setAction(INTENT_ACTION_CANCEL);
+ PendingIntent cancelIntent = PendingIntent.getActivity(this, PI_CANCEL, intent, PendingIntent.FLAG_IMMUTABLE);
- PendingIntent cancelIntent = PendingIntent.getActivity(this, PI_CANCEL, intent, PendingIntent.FLAG_IMMUTABLE);
-
- builder.setCategory(Notification.CATEGORY_PROGRESS)
- .setVibrate(new long[0])
- .setVisibility(Notification.VISIBILITY_PUBLIC)
- .setColor(0x88b0f0)
- .setGroup("org.fox.ttrss")
- .addAction(R.drawable.ic_launcher, getString(R.string.cancel), cancelIntent);
- }
+ builder.setCategory(Notification.CATEGORY_PROGRESS)
+ .setVibrate(new long[0])
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+ .setColor(0x88b0f0)
+ .setGroup("org.fox.ttrss")
+ .addAction(R.drawable.ic_launcher, getString(R.string.cancel), cancelIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CommonActivity.NOTIFICATION_CHANNEL_NORMAL);
@@ -182,7 +179,7 @@ public class OfflineDownloadService extends Service {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder.setCategory(Notification.CATEGORY_MESSAGE)
.setVibrate(new long[0])
- .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setColor(0x88b0f0)
.setGroup("org.fox.ttrss");
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java
index 40674bb8..372728e4 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java
@@ -92,37 +92,36 @@ public class OfflineFeedCategoriesFragment extends BaseFeedlistFragment implemen
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
-
- switch (item.getItemId()) {
- case R.id.browse_headlines:
- if (true) {
- int catId = getCatIdAtPosition(info.position);
- if (catId != -10000) {
- m_activity.onCatSelected(catId, true);
- }
- }
- return true;
- case R.id.browse_feeds:
- if (true) {
- int catId = getCatIdAtPosition(info.position);
- if (catId != -10000) {
- m_activity.onCatSelected(catId, false);
- }
- }
- return true;
- case R.id.catchup_category:
- if (true) {
- int catId = getCatIdAtPosition(info.position);
- if (catId != -10000) {
- m_activity.catchupFeed(catId, true);
- }
- }
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+
+ int itemId = item.getItemId();
+ if (itemId == R.id.browse_headlines) {
+ if (true) {
+ int catId = getCatIdAtPosition(info.position);
+ if (catId != -10000) {
+ m_activity.onCatSelected(catId, true);
+ }
+ }
+ return true;
+ } else if (itemId == R.id.browse_feeds) {
+ if (true) {
+ int catId = getCatIdAtPosition(info.position);
+ if (catId != -10000) {
+ m_activity.onCatSelected(catId, false);
+ }
+ }
+ return true;
+ } else if (itemId == R.id.catchup_category) {
+ if (true) {
+ int catId = getCatIdAtPosition(info.position);
+ if (catId != -10000) {
+ m_activity.catchupFeed(catId, true);
+ }
+ }
+ return true;
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java
index 6dd85a87..c0b63330 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java
@@ -56,26 +56,25 @@ public class OfflineFeedsFragment extends BaseFeedlistFragment implements OnItem
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
- switch (item.getItemId()) {
- case R.id.browse_headlines:
- if (true) {
- int feedId = getFeedIdAtPosition(info.position);
- if (feedId != -10000) {
- m_activity.onFeedSelected(feedId);
- }
- }
- return true;
- case R.id.catchup_feed:
- int feedId = getFeedIdAtPosition(info.position);
- if (feedId != -10000) {
- m_activity.catchupFeed(feedId, false);
- }
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
+ int itemId = item.getItemId();
+ if (itemId == R.id.browse_headlines) {
+ if (true) {
+ int feedId = getFeedIdAtPosition(info.position);
+ if (feedId != -10000) {
+ m_activity.onFeedSelected(feedId);
+ }
+ }
+ return true;
+ } else if (itemId == R.id.catchup_feed) {
+ int feedId = getFeedIdAtPosition(info.position);
+ if (feedId != -10000) {
+ m_activity.catchupFeed(feedId, false);
+ }
+ return true;
+ }
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
index d448117c..7994b576 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
@@ -1,13 +1,12 @@
package org.fox.ttrss.offline;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.res.Resources.Theme;
+import android.content.res.ColorStateList;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
import android.graphics.Paint;
@@ -36,11 +35,11 @@ import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable;
@@ -50,6 +49,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.fox.ttrss.Application;
import org.fox.ttrss.CommonActivity;
@@ -158,79 +159,77 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
}
private boolean onArticleMenuItemSelected(MenuItem item, final int articleId) {
- switch (item.getItemId()) {
- case R.id.headlines_article_unread:
- if (true) {
+ int itemId = item.getItemId();
+ if (itemId == R.id.headlines_article_unread) {
+ if (true) {
- SQLiteStatement stmt = m_activity.getDatabase().compileStatement(
- "UPDATE articles SET modified = 1, unread = not unread " + "WHERE " + BaseColumns._ID
- + " = ?");
-
- stmt.bindLong(1, articleId);
- stmt.execute();
- stmt.close();
-
- refresh();
- }
- return true;
- case R.id.headlines_article_link_copy:
- if (true) {
- Cursor article = m_activity.getArticleById(articleId);
-
- if (article != null) {
- m_activity.copyToClipboard(article.getString(article.getColumnIndex("link")));
- article.close();
- }
- }
- return true;
- case R.id.headlines_article_link_open:
- if (true) {
- Cursor article = m_activity.getArticleById(articleId);
-
- if (article != null) {
- m_activity.openUri(Uri.parse(article.getString(article.getColumnIndex("link"))));
+ SQLiteStatement stmt = m_activity.getDatabase().compileStatement(
+ "UPDATE articles SET modified = 1, unread = not unread " + "WHERE " + BaseColumns._ID
+ + " = ?");
- // TODO: mark article as read, set modified = 1, refresh
+ stmt.bindLong(1, articleId);
+ stmt.execute();
+ stmt.close();
- article.close();
- }
- }
- return true;
- case R.id.headlines_share_article:
- m_activity.shareArticle(articleId);
- return true;
- case R.id.catchup_above:
- if (true) {
- AlertDialog.Builder builder = new AlertDialog.Builder(
- m_activity)
- .setMessage(R.string.confirm_catchup_above)
- .setPositiveButton(R.string.dialog_ok,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- catchupAbove(articleId);
+ refresh();
+ }
+ return true;
+ } else if (itemId == R.id.headlines_article_link_copy) {
+ if (true) {
+ Cursor article = m_activity.getArticleById(articleId);
+
+ if (article != null) {
+ m_activity.copyToClipboard(article.getString(article.getColumnIndex("link")));
+ article.close();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.headlines_article_link_open) {
+ if (true) {
+ Cursor article = m_activity.getArticleById(articleId);
- }
- })
- .setNegativeButton(R.string.dialog_cancel,
- new Dialog.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
+ if (article != null) {
+ m_activity.openUri(Uri.parse(article.getString(article.getColumnIndex("link"))));
- }
- });
+ // TODO: mark article as read, set modified = 1, refresh
- AlertDialog dialog = builder.create();
- dialog.show();
- }
- return true;
- default:
- Log.d(TAG, "onArticleMenuItemSelected, unhandled id=" + item.getItemId());
- return false;
- }
+ article.close();
+ }
+ }
+ return true;
+ } else if (itemId == R.id.headlines_share_article) {
+ m_activity.shareArticle(articleId);
+ return true;
+ } else if (itemId == R.id.catchup_above) {
+ if (true) {
+ 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(articleId);
+
+ }
+ })
+ .setNegativeButton(R.string.dialog_cancel,
+ new Dialog.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ }
+ });
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ return true;
+ }
+ Log.d(TAG, "onArticleMenuItemSelected, unhandled id=" + item.getItemId());
+ return false;
- }
+ }
private void catchupAbove(int articleId) {
SQLiteStatement stmt = null;
@@ -488,14 +487,14 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public TextView titleView;
public TextView feedTitleView;
- public ImageView markedView;
- public ImageView publishedView;
+ public MaterialButton markedView;
+ public MaterialButton publishedView;
public TextView excerptView;
public ImageView flavorImageView;
public TextView authorView;
public TextView dateView;
public CheckBox selectionBoxView;
- public ImageView menuButtonView;
+ public MaterialButton menuButtonView;
public ViewGroup flavorImageHolder;
public ProgressBar flavorImageLoadingBar;
public View headlineFooter;
@@ -504,8 +503,8 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public ImageView flavorVideoKindView;
public View flavorImageOverflow;
public View headlineHeader;
- public ImageView attachmentsView;
- public ImageView scoreView;
+ public MaterialButton attachmentsView;
+ public MaterialButton scoreView;
public ArticleViewHolder(View v) {
@@ -564,7 +563,6 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public static final int VIEW_COUNT = VIEW_LOADMORE+1;
private final Integer[] origTitleColors = new Integer[VIEW_COUNT];
- private final int titleHighScoreUnreadColor;
private ColorGenerator m_colorGenerator = ColorGenerator.DEFAULT;
private TextDrawable.IBuilder m_drawableBuilder = TextDrawable.builder().round();
@@ -576,11 +574,6 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
- Theme theme = context.getTheme();
- TypedValue tv = new TypedValue();
- theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
- titleHighScoreUnreadColor = tv.data;
-
String headlineMode = m_prefs.getString("headline_mode", "HL_DEFAULT");
showFlavorImage = "HL_DEFAULT".equals(headlineMode) || "HL_COMPACT".equals(headlineMode);
@@ -669,8 +662,8 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
final ArticleViewHolder holder;
final int articleId = article.getInt(0);
-
- int headlineFontSize = Integer.parseInt(m_prefs.getString("headlines_font_size_sp", "13"));
+
+ int headlineFontSize = m_prefs.getInt("headlines_font_size_sp_int", 13);
int headlineSmallFontSize = Math.max(10, Math.min(18, headlineFontSize - 2));
if (v == null) {
@@ -681,13 +674,13 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
layoutId = R.layout.headlines_row_loadmore;
break;
case VIEW_UNREAD:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_unread_compact : R.layout.headlines_row_unread;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_unread : R.layout.headlines_row_unread;
break;
case VIEW_SELECTED:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_selected_compact : R.layout.headlines_row;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected : R.layout.headlines_row;
break;
case VIEW_SELECTED_UNREAD:
- layoutId = m_compactLayoutMode ? R.layout.headlines_row_selected_unread_compact : R.layout.headlines_row_unread;
+ layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected_unread : R.layout.headlines_row_unread;
break;
}
@@ -789,8 +782,11 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
holder.feedTitleView.setVisibility(View.GONE);
}
- TypedValue tvAccent = new TypedValue();
- m_activity.getTheme().resolveAttribute(R.attr.colorAccent, tvAccent, true);
+ TypedValue tvTertiary = new TypedValue();
+ m_activity.getTheme().resolveAttribute(R.attr.colorTertiary, tvTertiary, true);
+
+ TypedValue tvPrimary = new TypedValue();
+ m_activity.getTheme().resolveAttribute(R.attr.colorPrimary, tvPrimary, true);
if (holder.attachmentsView != null) {
holder.attachmentsView.setVisibility(View.GONE);
@@ -807,12 +803,12 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
m_activity.getTheme().resolveAttribute(marked ? R.attr.ic_star : R.attr.ic_star_outline, tv, true);
- holder.markedView.setImageResource(tv.resourceId);
+ holder.markedView.setIconResource(tv.resourceId);
if (marked)
- holder.markedView.setColorFilter(tvAccent.data);
+ holder.markedView.setIconTint(ColorStateList.valueOf(tvTertiary.data));
else
- holder.markedView.setColorFilter(null);
+ holder.markedView.setIconTint(ColorStateList.valueOf(tvPrimary.data));
holder.markedView.setOnClickListener(new OnClickListener() {
@@ -838,12 +834,12 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
m_activity.getTheme().resolveAttribute(published ? R.attr.ic_checkbox_marked : R.attr.ic_rss_box, tv, true);
- holder.publishedView.setImageResource(tv.resourceId);
+ holder.publishedView.setIconResource(tv.resourceId);
if (published)
- holder.publishedView.setColorFilter(tvAccent.data);
+ holder.publishedView.setIconTint(ColorStateList.valueOf(tvTertiary.data));
else
- holder.publishedView.setColorFilter(null);
+ holder.publishedView.setIconTint(ColorStateList.valueOf(tvPrimary.data));
holder.publishedView.setOnClickListener(new OnClickListener() {
@@ -935,8 +931,6 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
holder.flavorVideoKindView.setVisibility(View.GONE);
holder.flavorImageOverflow.setVisibility(View.GONE);
- holder.headlineHeader.setBackgroundDrawable(null);
-
// this is needed if our flavor image goes behind base listview element
holder.headlineHeader.setOnClickListener(new OnClickListener() {
@Override
@@ -967,9 +961,8 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
//Log.d(TAG, articleId + " IMG: " + afi.flavorImageUri + " STREAM: " + afi.flavorStreamUri + " H:" + flavorViewHeight);
if (flavorViewHeight > 0) {
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
lp.height = flavorViewHeight;
- holder.flavorImageView.setLayoutParams(lp);
}
final String articleContent = article.getString(article.getColumnIndex("content"));
@@ -1011,24 +1004,8 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
holder.flavorImageView.setVisibility(View.VISIBLE);
-
- //TODO: not implemented
- //holder.flavorImageOverflow.setVisibility(View.VISIBLE);
-
- /*boolean forceDown = article.flavorImage != null && "video".equals(article.flavorImage.tagName().toLowerCase());
-
- maybeRepositionFlavorImage(holder.flavorImageView, resource, holder, forceDown);*/
adjustVideoKindView(holder, afi);
- /* we don't support image embedding in offline */
-
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.flavorImageView.getLayoutParams();
- lp.addRule(RelativeLayout.BELOW, R.id.headline_header);
- lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
- holder.flavorImageView.setLayoutParams(lp);
-
- holder.headlineHeader.setBackgroundDrawable(null);
-
return false;
} else {
@@ -1081,10 +1058,10 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
private void adjustVideoKindView(ArticleViewHolder holder, ArticleFlavorInfo afi) {
if (afi.flavorImageUri != null) {
if (afi.flavorStreamUri != null) {
- holder.flavorVideoKindView.setImageResource(R.drawable.ic_play_circle);
+ holder.flavorVideoKindView.setImageResource(R.drawable.baseline_play_circle_24);
holder.flavorVideoKindView.setVisibility(View.VISIBLE);
} else if (afi.mediaList.size() > 1) {
- holder.flavorVideoKindView.setImageResource(R.drawable.ic_image_album);
+ holder.flavorVideoKindView.setImageResource(R.drawable.baseline_photo_album_24);
holder.flavorVideoKindView.setVisibility(View.VISIBLE);
} else {
holder.flavorVideoKindView.setVisibility(View.INVISIBLE);
@@ -1208,9 +1185,6 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
if (score < -500) {
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- } else if (score > 500) {
- tv.setTextColor(titleHighScoreUnreadColor);
- tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
} else {
tv.setTextColor(origTitleColors[viewType].intValue());
tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java
index efd1ed97..44016124 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java
@@ -25,6 +25,8 @@ import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import java.util.HashMap;
public class OfflineMasterActivity extends OfflineActivity implements OfflineHeadlinesEventListener {
@@ -141,9 +143,7 @@ public class OfflineMasterActivity extends OfflineActivity implements OfflineHea
return true;
}
- switch (item.getItemId()) {
- case R.id.headlines_toggle_sort_order:
- /* SharedPreferences.Editor editor = m_prefs.edit();
+ if (item.getItemId() == R.id.headlines_toggle_sort_order) {/* SharedPreferences.Editor editor = m_prefs.edit();
editor.putBoolean("offline_oldest_first", !m_prefs.getBoolean("offline_oldest_first", false));
editor.commit();
refresh(); */
@@ -152,10 +152,10 @@ public class OfflineMasterActivity extends OfflineActivity implements OfflineHea
int selectedIndex = m_prefs.getBoolean("offline_oldest_first", false) ? 1 : 0;
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.headlines_sort_articles_title))
.setSingleChoiceItems(
- new String[] {
+ new String[]{
getString(R.string.headlines_sort_default),
getString(R.string.headlines_sort_oldest_first)
},
@@ -175,7 +175,7 @@ public class OfflineMasterActivity extends OfflineActivity implements OfflineHea
if (true) {
SharedPreferences.Editor editor = m_prefs.edit();
editor.putBoolean("offline_oldest_first", true);
- editor.apply();
+ editor.apply();
}
break;
}
@@ -194,11 +194,10 @@ public class OfflineMasterActivity extends OfflineActivity implements OfflineHea
invalidateOptionsMenu();
refresh();
return true; */
- default:
- Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ }
+ Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
@Override
public void onSaveInstanceState(Bundle out) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java
index cce355a1..efbeef2c 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java
@@ -68,7 +68,7 @@ public class OfflineUploadService extends IntentService {
.setContentTitle(getString(R.string.notify_uploading_title))
.setContentIntent(contentIntent)
.setWhen(System.currentTimeMillis())
- .setSmallIcon(R.drawable.ic_cloud_upload)
+ .setSmallIcon(R.drawable.baseline_cloud_upload_24)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(),
R.drawable.ic_launcher))
.setOngoing(!isError)
@@ -79,7 +79,7 @@ public class OfflineUploadService extends IntentService {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder.setCategory(Notification.CATEGORY_PROGRESS)
- .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setColor(0x88b0f0)
.setGroup("org.fox.ttrss")
.addAction(R.drawable.ic_launcher, getString(R.string.offline_sync_try_again), contentIntent);
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 b6a989b1..39d6c2ef 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,6 +1,7 @@
package org.fox.ttrss.share;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -11,18 +12,18 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import org.fox.ttrss.ApiRequest;
import org.fox.ttrss.PreferencesActivity;
import org.fox.ttrss.R;
import org.fox.ttrss.util.SimpleLoginManager;
-import icepick.State;
-
public abstract class CommonShareActivity extends CommonActivity {
protected SharedPreferences m_prefs;
- @State protected String m_sessionId;
- @State protected int m_apiLevel = 0;
+ protected String m_sessionId;
+ protected int m_apiLevel = 0;
private final String TAG = this.getClass().getSimpleName();
@@ -31,9 +32,22 @@ public abstract class CommonShareActivity extends CommonActivity {
m_prefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
+ if (savedInstanceState != null) {
+ m_sessionId = savedInstanceState.getString("m_sessionId");
+ m_apiLevel = savedInstanceState.getInt("m_apiLevel");
+ }
+
super.onCreate(savedInstanceState);
}
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putString("m_sessionId", m_sessionId);
+ out.putInt("m_apiLevel", m_apiLevel);
+ }
+
protected abstract void onLoggedIn(int requestId);
protected abstract void onLoggingIn(int requestId);
@@ -42,10 +56,10 @@ public abstract class CommonShareActivity extends CommonActivity {
if (m_prefs.getString("ttrss_url", "").trim().length() == 0) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.dialog_need_configure_prompt)
- .setCancelable(false)
- .setPositiveButton(R.string.dialog_open_preferences, new DialogInterface.OnClickListener() {
+ 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
@@ -54,12 +68,12 @@ public abstract class CommonShareActivity extends CommonActivity {
startActivityForResult(intent, 0);
}
})
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
- AlertDialog alert = builder.create();
+ Dialog alert = builder.create();
alert.show();
} else {
@@ -94,18 +108,16 @@ public abstract class CommonShareActivity extends CommonActivity {
}
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.preferences:
- Intent intent = new Intent(CommonShareActivity.this,
- PreferencesActivity.class);
- startActivityForResult(intent, 0);
- return true;
- default:
- Log.d(TAG,
- "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
+ if (item.getItemId() == R.id.preferences) {
+ Intent intent = new Intent(CommonShareActivity.this,
+ PreferencesActivity.class);
+ startActivityForResult(intent, 0);
+ return true;
+ }
+ Log.d(TAG,
+ "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
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 3b1da2c9..9e391411 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
@@ -22,12 +22,10 @@ public class ShareActivity extends CommonShareActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
- //setTheme(R.style.DarkTheme);
-
super.onCreate(savedInstanceState);
-
- requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ requestWindowFeature(Window.FEATURE_LEFT_ICON);
+
Intent intent = getIntent();
String urlValue = intent.getStringExtra(Intent.EXTRA_TEXT);
@@ -41,9 +39,7 @@ public class ShareActivity extends CommonShareActivity {
}
setContentView(R.layout.activity_share);
-
- getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher);
-
+
setSmallScreen(false);
EditText url = (EditText) findViewById(R.id.url);
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 1463958d..df0c82f9 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
@@ -90,9 +90,7 @@ public class SubscribeActivity extends CommonShareActivity {
setContentView(R.layout.activity_subscribe);
- getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher);
-
- setSmallScreen(false);
+ setSmallScreen(false);
m_progressBar = (ProgressBar) findViewById(R.id.subscribe_progress);
Spinner catList = (Spinner) findViewById(R.id.category_spinner);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/GalleryEntry.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/GalleryEntry.java
index 0eb45074..50e34f78 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/GalleryEntry.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/GalleryEntry.java
@@ -1,14 +1,51 @@
package org.fox.ttrss.types;
+import android.os.Parcel;
+import android.os.Parcelable;
+
import java.io.Serializable;
-public class GalleryEntry implements Serializable {
+public class GalleryEntry implements Serializable, Parcelable {
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public GalleryEntry createFromParcel(Parcel in) {
+ return new GalleryEntry(in);
+ }
+
+ public GalleryEntry[] newArray(int size) {
+ return new GalleryEntry[size];
+ }
+ };
+
public enum GalleryEntryType { TYPE_IMAGE, TYPE_VIDEO }
public String url;
public GalleryEntryType type;
public String coverUrl;
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(url);
+ out.writeString(type.name());
+ out.writeString(coverUrl);
+ }
+
+ public void readFromParcel(Parcel in) {
+ url = in.readString();
+ type = GalleryEntryType.valueOf(in.readString());
+ coverUrl = in.readString();
+ }
+
+ public GalleryEntry(Parcel in) {
+ readFromParcel(in);
+ }
+
public GalleryEntry() {
//
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/FontSizeDialogPreference.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/FontSizeDialogPreference.java
deleted file mode 100644
index 3f3d1a53..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/FontSizeDialogPreference.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.fox.ttrss.util;
-
-// http://www.lukehorvat.com/blog/android-seekbardialogpreference/
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.preference.DialogPreference;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import org.fox.ttrss.R;
-
-/**
- * A {@link DialogPreference} that provides a user with the means to select an
- * integer from a {@link SeekBar}, and persist it.
- *
- * @author lukehorvat
- *
- */
-public class FontSizeDialogPreference extends DialogPreference {
- private static final int DEFAULT_MIN_PROGRESS = 9;
- private static final int DEFAULT_MAX_PROGRESS = 24;
- private static final String DEFAULT_PROGRESS = "0";
-
- private int mMinProgress = DEFAULT_MIN_PROGRESS;
- private int mMaxProgress = DEFAULT_MAX_PROGRESS;
- private int mProgress;
- private CharSequence mProgressTextSuffix;
- private TextView mProgressText;
- private SeekBar mSeekBar;
-
- public FontSizeDialogPreference(Context context) {
- this(context, null);
- }
-
- public FontSizeDialogPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- setProgressTextSuffix(" " + context.getString(R.string.font_size_dialog_suffix));
-
- // set layout
- setDialogLayoutResource(R.layout.settings_select_font_size);
- setPositiveButtonText(android.R.string.ok);
- setNegativeButtonText(android.R.string.cancel);
- setDialogIcon(null);
- }
-
- @Override
- protected void onSetInitialValue(boolean restore, Object defaultValue) {
- setProgress(restore ? Integer.valueOf(getPersistedString(DEFAULT_PROGRESS))
- : Integer.valueOf((String)defaultValue));
- }
-
- @Override
- protected Object onGetDefaultValue(TypedArray a, int index) {
- return a.getString(index);
- }
-
- @Override
- protected void onBindDialogView(View view) {
- super.onBindDialogView(view);
-
- mProgressText = (TextView) view.findViewById(R.id.text_progress);
-
- mSeekBar = (SeekBar) view.findViewById(R.id.seek_bar);
- mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- // update text that displays the current SeekBar progress value
- // note: this does not persist the progress value. that is only
- // ever done in setProgress()
- String progressStr = String.valueOf(progress + mMinProgress);
- mProgressText.setText(mProgressTextSuffix == null ? progressStr
- : progressStr.concat(mProgressTextSuffix.toString()));
- mProgressText.setTextSize(TypedValue.COMPLEX_UNIT_SP, progress + mMinProgress);
- }
- });
-
- mSeekBar.setMax(mMaxProgress - mMinProgress);
- mSeekBar.setProgress(mProgress - mMinProgress);
- }
-
- public int getMinProgress() {
- return mMinProgress;
- }
-
- public void setMinProgress(int minProgress) {
- mMinProgress = minProgress;
- setProgress(Math.max(mProgress, mMinProgress));
- }
-
- public int getMaxProgress() {
- return mMaxProgress;
- }
-
- public void setMaxProgress(int maxProgress) {
- mMaxProgress = maxProgress;
- setProgress(Math.min(mProgress, mMaxProgress));
- }
-
- public int getProgress() {
- return mProgress;
- }
-
- public void setProgress(int progress) {
- progress = Math.max(Math.min(progress, mMaxProgress), mMinProgress);
-
- if (progress != mProgress) {
- mProgress = progress;
- persistString(String.valueOf(progress));
- notifyChanged();
- }
- }
-
- public CharSequence getProgressTextSuffix() {
- return mProgressTextSuffix;
- }
-
- public void setProgressTextSuffix(CharSequence progressTextSuffix) {
- mProgressTextSuffix = progressTextSuffix;
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- super.onDialogClosed(positiveResult);
-
- // when the user selects "OK", persist the new value
- if (positiveResult) {
- int seekBarProgress = mSeekBar.getProgress() + mMinProgress;
- if (callChangeListener(seekBarProgress)) {
- setProgress(seekBarProgress);
- }
- }
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- // save the instance state so that it will survive screen orientation
- // changes and other events that may temporarily destroy it
- final Parcelable superState = super.onSaveInstanceState();
-
- // set the state's value with the class member that holds current
- // setting value
- final SavedState myState = new SavedState(superState);
- myState.minProgress = getMinProgress();
- myState.maxProgress = getMaxProgress();
- myState.progress = getProgress();
-
- return myState;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- // check whether we saved the state in onSaveInstanceState()
- if (state == null || !state.getClass().equals(SavedState.class)) {
- // didn't save the state, so call superclass
- super.onRestoreInstanceState(state);
- return;
- }
-
- // restore the state
- SavedState myState = (SavedState) state;
- setMinProgress(myState.minProgress);
- setMaxProgress(myState.maxProgress);
- setProgress(myState.progress);
-
- super.onRestoreInstanceState(myState.getSuperState());
- }
-
- private static class SavedState extends BaseSavedState {
- int minProgress;
- int maxProgress;
- int progress;
-
- public SavedState(Parcelable superState) {
- super(superState);
- }
-
- public SavedState(Parcel source) {
- super(source);
-
- minProgress = source.readInt();
- maxProgress = source.readInt();
- progress = source.readInt();
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
-
- dest.writeInt(minProgress);
- dest.writeInt(maxProgress);
- dest.writeInt(progress);
- }
-
- @SuppressWarnings("unused")
- public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
- @Override
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- @Override
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
index ae8e7a4c..b2ae08f7 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
@@ -204,7 +204,7 @@ public class ImageCacheService extends IntentService {
.setContentTitle(getString(R.string.notify_downloading_title))
.setContentIntent(contentIntent)
.setWhen(System.currentTimeMillis())
- .setSmallIcon(R.drawable.ic_cloud_download)
+ .setSmallIcon(R.drawable.baseline_cloud_download_24)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(),
R.drawable.ic_launcher))
.setOngoing(true)
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenSwitchPreference.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenSwitchPreference.java
deleted file mode 100644
index df116064..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenSwitchPreference.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.fox.ttrss.util;
-
-// android is shit garbage
-// https://code.google.com/p/android/issues/detail?id=26194
-
-import android.content.Context;
-import android.preference.SwitchPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Switch;
-
-public class LessBrokenSwitchPreference extends SwitchPreference {
-
- /**
- * Construct a new SwitchPreference with the given style options.
- *
- * @param context The Context that will style this preference
- * @param attrs Style attributes that differ from the default
- * @param defStyle Theme attribute defining the default style options
- */
- public LessBrokenSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * Construct a new SwitchPreference with the given style options.
- *
- * @param context The Context that will style this preference
- * @param attrs Style attributes that differ from the default
- */
- public LessBrokenSwitchPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- /**
- * Construct a new SwitchPreference with default style options.
- *
- * @param context The Context that will style this preference
- */
- public LessBrokenSwitchPreference(Context context) {
- super(context, null);
- }
-
- @Override
- protected void onBindView(View view) {
- // Clean listener before invoke SwitchPreference.onBindView
- ViewGroup viewGroup= (ViewGroup)view;
- clearListenerInViewGroup(viewGroup);
- super.onBindView(view);
- }
-
- /**
- * Clear listener in Switch for specify ViewGroup.
- *
- * @param viewGroup The ViewGroup that will need to clear the listener.
- */
- private void clearListenerInViewGroup(ViewGroup viewGroup) {
- if (null == viewGroup) {
- return;
- }
-
- int count = viewGroup.getChildCount();
- for(int n = 0; n < count; ++n) {
- View childView = viewGroup.getChildAt(n);
- if(childView instanceof Switch) {
- final Switch switchView = (Switch) childView;
- switchView.setOnCheckedChangeListener(null);
- return;
- } else if (childView instanceof ViewGroup){
- ViewGroup childGroup = (ViewGroup)childView;
- clearListenerInViewGroup(childGroup);
- }
- }
- }
-
-} \ No newline at end of file
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenWebView.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenWebView.java
deleted file mode 100644
index 4a3ea826..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenWebView.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.fox.ttrss.util;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-
-public class LessBrokenWebView extends WebView {
-
- public LessBrokenWebView(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
-
- public LessBrokenWebView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
-
- public LessBrokenWebView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
-
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- int temp_ScrollY = getScrollY();
- scrollTo(getScrollX(), getScrollY() + 1);
- scrollTo(getScrollX(), temp_ScrollY);
- }
-
- return super.onTouchEvent(event);
- }
-
-}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ScrimInsetsFrameLayout.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ScrimInsetsFrameLayout.java
deleted file mode 100755
index d3a5ab27..00000000
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ScrimInsetsFrameLayout.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.fox.ttrss.util;
-/*
- * Copyright 2014 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-
-import org.fox.ttrss.R;
-
-import androidx.core.view.ViewCompat;
-
-/**
- * A layout that draws something in the insets passed to {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome
- * (status and navigation bars, overlay action bars).
- */
-public class ScrimInsetsFrameLayout extends FrameLayout {
- private Drawable mInsetForeground;
-
- private Rect mInsets;
- private Rect mTempRect = new Rect();
- private OnInsetsCallback mOnInsetsCallback;
-
- public ScrimInsetsFrameLayout(Context context) {
- super(context);
- init(context, null, 0);
- }
-
- public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context, attrs, 0);
- }
-
- public ScrimInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- init(context, attrs, defStyle);
- }
-
- private void init(Context context, AttributeSet attrs, int defStyle) {
- final TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.ScrimInsetsView, defStyle, 0);
- if (a == null) {
- return;
- }
- mInsetForeground = a.getDrawable(R.styleable.ScrimInsetsView_insetForeground);
- a.recycle();
-
- setWillNotDraw(true);
- }
-
- @Override
- protected boolean fitSystemWindows(Rect insets) {
- mInsets = new Rect(insets);
- setWillNotDraw(mInsetForeground == null);
- ViewCompat.postInvalidateOnAnimation(this);
- if (mOnInsetsCallback != null) {
- mOnInsetsCallback.onInsetsChanged(insets);
- }
- return true; // consume insets
- }
-
- @Override
- public void draw(Canvas canvas) {
- super.draw(canvas);
-
- int width = getWidth();
- int height = getHeight();
- if (mInsets != null && mInsetForeground != null) {
- int sc = canvas.save();
- canvas.translate(getScrollX(), getScrollY());
-
- // Top
- mTempRect.set(0, 0, width, mInsets.top);
- mInsetForeground.setBounds(mTempRect);
- mInsetForeground.draw(canvas);
-
- // Bottom
- mTempRect.set(0, height - mInsets.bottom, width, height);
- mInsetForeground.setBounds(mTempRect);
- mInsetForeground.draw(canvas);
-
- // Left
- mTempRect.set(0, mInsets.top, mInsets.left, height - mInsets.bottom);
- mInsetForeground.setBounds(mTempRect);
- mInsetForeground.draw(canvas);
-
- // Right
- mTempRect.set(width - mInsets.right, mInsets.top, width, height - mInsets.bottom);
- mInsetForeground.setBounds(mTempRect);
- mInsetForeground.draw(canvas);
-
- canvas.restoreToCount(sc);
- }
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- if (mInsetForeground != null) {
- mInsetForeground.setCallback(this);
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (mInsetForeground != null) {
- mInsetForeground.setCallback(null);
- }
- }
-
- /**
- * Allows the calling container to specify a callback for custom processing when insets change (i.e. when
- * {@link #fitSystemWindows(Rect)} is called. This is useful for setting padding on UI elements based on
- * UI chrome insets (e.g. a Google Map or a ListView). When using with ListView or GridView, remember to set
- * clipToPadding to false.
- */
- public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) {
- mOnInsetsCallback = onInsetsCallback;
- }
-
- public interface OnInsetsCallback {
- void onInsetsChanged(Rect insets);
- }
-} \ No newline at end of file