summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-19 13:31:01 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-19 13:31:01 +0300
commit6a7f6770c25e4c499e9f3f9167d3eb37faf009a9 (patch)
tree13b5d5f2053b966a56222a735b47c60e85f70769 /org.fox.ttrss/src
parentb1c65e12d7acb2e4aa3d10624eefa9abae6da48e (diff)
move stuff related to article selection to model, toggle actionmode based on observed list
Diffstat (limited to 'org.fox.ttrss/src')
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java27
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java32
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java1
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java38
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java11
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java161
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java16
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) {