diff options
Diffstat (limited to 'org.fox.ttrss')
7 files changed, 122 insertions, 164 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java index b1f99208..0a4862d2 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java @@ -27,10 +27,11 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCaller { private final String TAG = this.getClass().getSimpleName(); - private final MutableLiveData<ArticleList> m_articles = new MutableLiveData<>(new ArticleList()); + @NonNull private final MutableLiveData<ArticleList> m_articles = new MutableLiveData<>(new ArticleList()); private SharedPreferences m_prefs; private final int m_responseCode = 0; protected String m_responseMessage; @@ -77,12 +78,12 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle update(position, article); } - public void update(int position, Article article) { + public void update(int position, @NonNull Article article) { m_articles.getValue().set(position, article); m_articles.postValue(m_articles.getValue()); } - public void update(ArticleList articles) { + public void update(@NonNull ArticleList articles) { m_articles.postValue(articles); } @@ -107,6 +108,24 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle } } + public enum ArticlesSelection { ALL, NONE, UNREAD } + + public void setSelection(@NonNull ArticlesSelection select) { + ArticleList articles = m_articles.getValue(); + + for (int i = 0; i < articles.size(); i++) { + Article articleClone = new Article(articles.get(i)); + + if (select == ArticlesSelection.ALL || select == ArticlesSelection.UNREAD && articleClone.unread) { + articleClone.selected = true; + } else { + articleClone.selected = false; + } + + update(i, articleClone); + } + } + private void loadInBackground() { Log.d(TAG, this + " loadInBackground append=" + m_append + " offset=" + m_offset); @@ -235,7 +254,7 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle }); } - private int getSkip(boolean append, ArticleList articles) { + private int getSkip(boolean append, @NonNull ArticleList articles) { int skip = 0; if (append) { 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 59ff4e66..aa96940f 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 @@ -58,6 +58,10 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (headlines != null) headlines.setVisibility(isPortrait() ? View.GONE : View.VISIBLE); + if (!isPortrait() && !isSmallScreen()) { + enableActionModeObserver(); + } + m_loadingProgress = findViewById(R.id.loading_progress); m_bottomAppBar = findViewById(R.id.detail_bottom_appbar); @@ -236,8 +240,6 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList @Override public void onResume() { super.onResume(); - - m_forceDisableActionMode = isPortrait() || isSmallScreen(); } @Override @@ -260,11 +262,6 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList } @Override - public void onArticleListSelectionChange() { - invalidateOptionsMenu(); - } - - @Override public void onArticleSelected(Article article) { onArticleSelected(article, true); } @@ -303,32 +300,11 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList public void onHeadlinesLoaded(boolean appended) { setLoadingVisible(false); - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); if (ap != null) { ap.syncToSharedArticles(); } - - /* if (hf != null) { - Article article = Application.getArticles().getById(hf.getActiveArticleId()); - - if (article == null && !Application.getArticles().isEmpty()) { - - article = Application.getArticles().get(0); - - hf.setActiveArticleId(article.id); - - FragmentTransaction ft = getSupportFragmentManager() - .beginTransaction(); - - ArticlePager af = new ArticlePager(); - af.initialize(article.id, hf.getFeed()); - - ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); - ft.commitAllowingStateLoss(); - } - } */ } @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java index 8f80094c..91a0fdc9 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java @@ -3,7 +3,6 @@ package org.fox.ttrss; import org.fox.ttrss.types.Article; public interface HeadlinesEventListener { - void onArticleListSelectionChange(); void onArticleSelected(Article article); void onArticleSelected(Article article, boolean open); void onHeadlinesLoaded(boolean appended); 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 e20fbcae..8263af89 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 @@ -98,8 +98,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_adapter.notifyItemChanged(position); } - public enum ArticlesSelection { ALL, NONE, UNREAD } - public static final int FLAVOR_IMG_MIN_SIZE = 128; private final String TAG = this.getClass().getSimpleName(); @@ -126,12 +124,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private MediaPlayer m_mediaPlayer; private TextureView m_activeTexture; - public ArticleList getSelectedArticles() { - return Application.getArticles() - .stream() - .filter(a -> a.selected).collect(Collectors.toCollection(ArticleList::new)); - } - public void initialize(Feed feed) { m_feed = feed; } @@ -514,7 +506,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_isLazyLoading = false; m_listener.onHeadlinesLoaded(appended); - m_listener.onArticleListSelectionChange(); }); if (model.getFirstIdChanged()) @@ -590,8 +581,10 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (m_activity instanceof DetailActivity && !append) return; - if (!append) + if (!append) { setActiveArticleId(-1); + model.setSelection(ArticleModel.ArticlesSelection.NONE); + } model.setSearchQuery(getSearchQuery()); model.startLoading(append, m_feed, m_activity.getResizeWidth()); @@ -932,8 +925,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { article.selected = cb.isChecked(); Application.getArticlesModel().updateById(article); - - m_listener.onArticleListSelectionChange(); } }); } @@ -962,10 +953,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { article.selected = !article.selected; Application.getArticlesModel().updateById(article); - - // updateTextCheckedState(holder, position); - - m_listener.onArticleListSelectionChange(); } }); @@ -1644,25 +1631,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } } - public void setSelection(ArticlesSelection select) { - ArticleList articles = Application.getArticles(); - ArticleList tmp = new ArticleList(); - - for (Article a : articles) { - Article articleClone = new Article(a); - - if (select == ArticlesSelection.ALL || select == ArticlesSelection.UNREAD && a.unread) { - articleClone.selected = true; - } else { - articleClone.selected = false; - } - - tmp.add(articleClone); - } - - Application.getArticlesModel().update(tmp); - } - public String getSearchQuery() { return m_searchQuery; } 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 19cfbe0c..70e41976 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 @@ -72,13 +72,17 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList Application.getInstance().load(savedInstanceState); + enableActionModeObserver(); + m_lastWidgetRefresh = new Date().getTime(); m_loadingProgress = findViewById(R.id.loading_progress); m_drawerLayout = findViewById(R.id.headlines_drawer); - if (m_drawerLayout != null) { + Log.d(TAG, "LPP="+ m_loadingProgress + " DR=" + m_drawerLayout); + + if (m_drawerLayout != null) { m_drawerToggle = new ActionBarDrawerToggle(this, m_drawerLayout, R.string.blank, R.string.blank) { @Override @@ -411,11 +415,6 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList } - @Override - public void onArticleListSelectionChange() { - invalidateOptionsMenu(); - } - public void onArticleSelected(Article article, boolean open) { Article articleClone = new Article(article); 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 3be7c454..a8541d38 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 @@ -57,13 +57,10 @@ public class OnlineActivity extends CommonActivity { protected SharedPreferences m_prefs; protected Menu m_menu; - protected boolean m_forceDisableActionMode = false; - private ActionMode m_headlinesActionMode; private HeadlinesActionModeCallback m_headlinesActionModeCallback; private String m_lastImageHitTestUrl; - private ConnectivityManager m_cmgr; protected LinearProgressIndicator m_loadingProgress; public void catchupDialog(final Feed feed) { @@ -154,13 +151,7 @@ public class OnlineActivity extends CommonActivity { public void onDestroyActionMode(ActionMode mode) { m_headlinesActionMode = null; - if (!m_forceDisableActionMode) { - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - - if (hf != null) { - hf.setSelection(HeadlinesFragment.ArticlesSelection.NONE); - } - } + Application.getArticlesModel().setSelection(ArticleModel.ArticlesSelection.NONE); invalidateOptionsMenu(); } @@ -205,7 +196,6 @@ public class OnlineActivity extends CommonActivity { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - m_cmgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); } @@ -528,33 +518,35 @@ public class OnlineActivity extends CommonActivity { } 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, (dialog, which) -> { - switch (which) { - case 0: - hf.setSelection(HeadlinesFragment.ArticlesSelection.ALL); - break; - case 1: - hf.setSelection(HeadlinesFragment.ArticlesSelection.UNREAD); - break; - case 2: - hf.setSelection(HeadlinesFragment.ArticlesSelection.NONE); - break; - } - dialog.cancel(); - invalidateOptionsMenu(); - }); - Dialog dialog = builder.create(); - dialog.show(); - } + 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, (dialog, which) -> { + + ArticleModel model = Application.getArticlesModel(); + + switch (which) { + case 0: + model.setSelection(ArticleModel.ArticlesSelection.ALL); + break; + case 1: + model.setSelection(ArticleModel.ArticlesSelection.UNREAD); + break; + case 2: + model.setSelection(ArticleModel.ArticlesSelection.NONE); + break; + } + dialog.cancel(); + invalidateOptionsMenu(); + }); + + Dialog dialog = builder.create(); + dialog.show(); return true; } else if (itemId == R.id.share_article) { if (ap != null) { @@ -604,57 +596,51 @@ public class OnlineActivity extends CommonActivity { } return true; } else if (itemId == R.id.selection_toggle_unread) { - if (hf != null) { - ArticleList selected = hf.getSelectedArticles(); - - if (!selected.isEmpty()) { - for (Article a : selected) { - Article articleClone = new Article(a); + ArticleList selected = Application.getArticles().getSelected(); - articleClone.unread = !articleClone.unread; + if (!selected.isEmpty()) { + for (Article a : selected) { + Article articleClone = new Article(a); - Application.getArticlesModel().updateById(articleClone); - } + articleClone.unread = !articleClone.unread; - toggleArticlesUnread(selected); - invalidateOptionsMenu(); + Application.getArticlesModel().updateById(articleClone); } + + toggleArticlesUnread(selected); + invalidateOptionsMenu(); } return true; } else if (itemId == R.id.selection_toggle_marked) { - if (hf != null) { - ArticleList selected = hf.getSelectedArticles(); + ArticleList selected = Application.getArticles().getSelected(); - if (!selected.isEmpty()) { - for (Article a : selected) { - Article articleClone = new Article(a); - - articleClone.marked = !articleClone.marked; + if (!selected.isEmpty()) { + for (Article a : selected) { + Article articleClone = new Article(a); - Application.getArticlesModel().updateById(articleClone); - } + articleClone.marked = !articleClone.marked; - toggleArticlesMarked(selected); - invalidateOptionsMenu(); + Application.getArticlesModel().updateById(articleClone); } + + toggleArticlesMarked(selected); + invalidateOptionsMenu(); } return true; } else if (itemId == R.id.selection_toggle_published) { - if (hf != null) { - ArticleList selected = hf.getSelectedArticles(); - - if (!selected.isEmpty()) { - for (Article a : selected) { - Article articleClone = new Article(a); + ArticleList selected = Application.getArticles().getSelected(); - articleClone.published = !articleClone.published; + if (!selected.isEmpty()) { + for (Article a : selected) { + Article articleClone = new Article(a); - Application.getArticlesModel().updateById(articleClone); - } + articleClone.published = !articleClone.published; - toggleArticlesPublished(selected); - invalidateOptionsMenu(); + Application.getArticlesModel().updateById(articleClone); } + + toggleArticlesPublished(selected); + invalidateOptionsMenu(); } return true; } else if (itemId == R.id.toggle_published) { @@ -1228,22 +1214,6 @@ public class OnlineActivity extends CommonActivity { } } - - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - - if (hf != null && !m_forceDisableActionMode) { - if (!hf.getSelectedArticles().isEmpty()) { - if (m_headlinesActionMode == null) { - m_headlinesActionMode = startSupportActionMode(m_headlinesActionModeCallback); - } - - m_headlinesActionMode.setTitle(String.valueOf(hf.getSelectedArticles().size())); - } else if (hf.getSelectedArticles().isEmpty() && m_headlinesActionMode != null) { - m_headlinesActionMode.finish(); - } - } else if (m_forceDisableActionMode && m_headlinesActionMode != null) { - m_headlinesActionMode.finish(); - } } } @@ -1445,4 +1415,23 @@ public class OnlineActivity extends CommonActivity { m_loadingProgress.setVisibility(visible ? View.VISIBLE : View.GONE); } + public void enableActionModeObserver() { + Application.getArticlesModel().getArticles().observe(this, (articles -> { + int selectedCount = articles.getSelectedCount(); + + Log.d(TAG, "observed selected articles=" + selectedCount); + + if (selectedCount > 0) { + if (m_headlinesActionMode == null) + m_headlinesActionMode = startSupportActionMode(m_headlinesActionModeCallback); + + m_headlinesActionMode.setTitle(String.valueOf(selectedCount)); + } else if (m_headlinesActionMode != null) { + m_headlinesActionMode.finish(); + + // is this needed? + invalidateOptionsMenu(); + } + })); + } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java index 8a8a763f..87749e62 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java @@ -26,12 +26,20 @@ public class ArticleList extends CopyOnWriteArrayList<Article> { this.addAll(clone); } - public ArticleList getWithoutFooters() { - return this.stream().filter(a -> { return a.id > 0; }).collect(Collectors.toCollection(ArticleList::new)); + public int getUnreadCount() { + return getUnread().size(); } - public long getUnreadCount() { - return this.stream().filter(a -> { return a.unread; }).count(); + public ArticleList getUnread() { + return this.stream().filter(a -> { return a.unread; }).collect(Collectors.toCollection(ArticleList::new)); + } + + public ArticleList getSelected() { + return this.stream().filter(a -> { return a.selected; }).collect(Collectors.toCollection(ArticleList::new)); + } + + public int getSelectedCount() { + return getSelected().size(); } public int getPositionById(int id) { |