diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-05-09 12:12:03 +0300 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-05-09 12:12:03 +0300 |
| commit | d720a53e0b94ce2872fd4141e3f044ff7ec4baab (patch) | |
| tree | 0e9ba206f2a0fae00373ce6591f36ad55e1f3836 /org.fox.ttrss/src/main/java/org | |
| parent | be2aec246a4d096cf6ee36353ddf84cea59da448 (diff) | |
| parent | 961104e4426ac48aa390915f118be6f6ff0387ce (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')
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 |