From e6fd2328815465869f11cec6e62a19ccaf9bcd36 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 13 May 2025 10:46:27 +0300 Subject: fix mark button padding --- org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'org.fox.ttrss/src/main/res') diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml index 5721dcb8..f6483350 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml @@ -101,6 +101,7 @@ style="?attr/materialIconButtonStyle" android:layout_width="wrap_content" android:paddingEnd="0dp" + android:layout_gravity="end" android:layout_height="24dp" android:layout_weight="0.5" app:icon="?ic_star_outline" /> -- cgit v1.2.3-54-g00ecf From d260fc8072a8f89e6b31262483a20638fa7936c1 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 14 May 2025 09:14:30 +0300 Subject: switch to recycler listview/submitlist --- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 94 ++++++---------------- .../main/java/org/fox/ttrss/HeadlinesLoader.java | 2 +- .../main/java/org/fox/ttrss/MasterActivity.java | 6 -- .../fox/ttrss/util/HeadlinesDiffItemCallback.java | 23 ++++++ .../fox/ttrss/util/HeadlinesDiffUtilCallback.java | 2 - .../src/main/res/layout/fragment_headlines.xml | 1 - 6 files changed, 48 insertions(+), 80 deletions(-) create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java (limited to 'org.fox.ttrss/src/main/res') 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 9674cf2a..d0f4fa94 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 @@ -52,10 +52,9 @@ import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -76,7 +75,7 @@ import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; import org.fox.ttrss.types.Attachment; import org.fox.ttrss.types.Feed; -import org.fox.ttrss.util.HeadlinesDiffUtilCallback; +import org.fox.ttrss.util.HeadlinesDiffItemCallback; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -89,7 +88,6 @@ import jp.wasabeef.glide.transformations.CropCircleTransformation; public class HeadlinesFragment extends androidx.fragment.app.Fragment implements LoaderManager.LoaderCallbacks { - private ArticleList m_articles = new ArticleList(); private boolean m_isLazyLoading; @NonNull @@ -106,52 +104,30 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements // successful update if (data != null) { + // shared article list contains raw returned data without footers ArticleList sharedArticles = Application.getArticles(); sharedArticles.clear(); sharedArticles.addAll(data); ArticleList tmp = new ArticleList(); - tmp.addAll(data); - - tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp)); - - /* diffResult.dispatchUpdatesTo(new ListUpdateCallback() { - @Override - public void onInserted(int position, int count) { - Log.d(TAG, "[DIFF] onInserted! pos=" + position + " count=" + count); - } - @Override - public void onRemoved(int position, int count) { - Log.d(TAG, "[DIFF] onRemoved! pos=" + position + " count=" + count); - } - - @Override - public void onMoved(int fromPosition, int toPosition) { - Log.d(TAG, "[DIFF] onMoved! from=" + fromPosition + " to=" + toPosition); - } + tmp.addAll(data); - @Override - public void onChanged(int position, int count, @Nullable Object payload) { - Log.d(TAG, "[DIFF] onChanged! pos=" + position + " count=" + count + " payload=" + payload); - } - }); */ + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) + tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - m_articles.clear(); - m_articles.addAll(tmp); + final boolean appended = headlinesLoader.getAppend(); - diffResult.dispatchUpdatesTo(m_adapter); + m_adapter.submitList(tmp, () -> { + if (!appended) + m_list.scrollToPosition(0); + }); if (headlinesLoader.getFirstIdChanged()) Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) .setAction(R.string.reload, v -> refresh(false)).show(); - if (!headlinesLoader.getAppend()) - m_list.scrollToPosition(0); - m_listener.onHeadlinesLoaded(headlinesLoader.getAppend()); } else { @@ -393,7 +369,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements m_list.setLayoutManager(m_layoutManager); m_list.setItemAnimator(new DefaultItemAnimator()); - m_adapter = new ArticleListAdapter(m_articles); + m_adapter = new ArticleListAdapter(); m_list.setAdapter(m_adapter); if (savedInstanceState == null && Application.getArticles().isEmpty()) { @@ -577,16 +553,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements if (!append) { m_activeArticleId = -1; - int size = m_articles.size(); - - m_articles.clear(); - if (m_adapter != null) { - m_adapter.notifyItemRangeRemoved(0, size); - - m_articles.add(new Article(Article.TYPE_AMR_FOOTER)); - - m_adapter.notifyItemRangeInserted(0, m_articles.size()); + ArticleList tmp = new ArticleList(); + m_adapter.submitList(tmp); } } @@ -705,14 +674,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - private class ArticleListAdapter extends RecyclerView.Adapter { - private final ArticleList items; - + private class ArticleListAdapter extends ListAdapter { public static final int VIEW_NORMAL = 0; public static final int VIEW_UNREAD = 1; public static final int VIEW_ACTIVE = 2; public static final int VIEW_ACTIVE_UNREAD = 3; - public static final int VIEW_AMR_FOOTER = 5; + public static final int VIEW_AMR_FOOTER = 4; public static final int VIEW_COUNT = VIEW_AMR_FOOTER + 1; @@ -744,9 +711,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements return false; } - public ArticleListAdapter(ArticleList items) { - super(); - this.items = items; + public ArticleListAdapter() { + super(new HeadlinesDiffItemCallback()); Display display = m_activity.getWindowManager().getDefaultDisplay(); Point size = new Point(); @@ -788,7 +754,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements @Override public void onBindViewHolder(final ArticleViewHolder holder, int position) { - holder.article = items.get(position); + holder.article = getItem(position); int headlineFontSize = m_prefs.getInt("headlines_font_size_sp_int", 13); int headlineSmallFontSize = Math.max(10, Math.min(18, headlineFontSize - 2)); @@ -1318,7 +1284,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements @Override public int getItemViewType(int position) { - Article a = items.get(position); + Article a = getItem(position); if (a.id == Article.TYPE_AMR_FOOTER) { return VIEW_AMR_FOOTER; @@ -1333,11 +1299,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - @Override - public int getItemCount() { - return items.size(); - } - private void updateTextCheckedState(final ArticleViewHolder holder, final Article article) { String tmp = !article.title.isEmpty() ? article.title.substring(0, 1).toUpperCase() : "?"; @@ -1473,10 +1434,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - public void notifyUpdated() { - m_adapter.notifyDataSetChanged(); - } - public void scrollToArticle(Article article) { scrollToArticleId(article.id); } @@ -1562,16 +1519,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements private void syncToSharedArticles() { ArticleList tmp = new ArticleList(); - tmp.addAll(Application.getArticles()); - - tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp)); + tmp.addAll(Application.getArticles()); - m_articles.clear(); - m_articles.addAll(tmp); + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) + tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - diffResult.dispatchUpdatesTo(m_adapter); + m_adapter.submitList(tmp); } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java index a7755f5b..38ae19f4 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java @@ -68,7 +68,7 @@ public class HeadlinesLoader extends AsyncTaskLoader implements Api m_append = true; forceLoad(); } else { - deliverResult(m_articles); + reset(); } } 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 33d949f7..fcca41bb 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 @@ -521,15 +521,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList super.onActivityResult(requestCode, resultCode, data); if (requestCode == HEADLINES_REQUEST) { - // we add back footers stripped when this was passed to DetailActivity - // Application.getArticles().add(new Article(Article.TYPE_AMR_FOOTER)); - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); if (hf != null) { - // articles might've been changed while in detail activity (resync with shared articles is handled in fragment onResume) - //hf.notifyUpdated(); - // data might be null if detailactivity crashed if (data != null) { int activeArticleId = data.getIntExtra("activeArticleId", 0); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java new file mode 100644 index 00000000..b652946a --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java @@ -0,0 +1,23 @@ +package org.fox.ttrss.util; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; + +import org.fox.ttrss.types.Article; + +public class HeadlinesDiffItemCallback extends DiffUtil.ItemCallback
{ + @Override + public boolean areItemsTheSame(@NonNull Article a1, @NonNull Article a2) { + // Log.d(TAG, "[DIFF] areItemsTheSame a1=" + a1.title + " a2=" + a2.title); + + return a1.id == a2.id; + } + + @Override + public boolean areContentsTheSame(@NonNull Article a1, @NonNull Article a2) { + // Log.d(TAG, "[DIFF] areContentsTheSame a1=" + a1.title + " a2=" + a2.title); + + return a1.id == a2.id && a1.unread == a2.unread && a1.marked == a2.marked + && a1.published == a2.published && a1.note.equals(a2.note); + } +} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java index e1292f99..084fb9fc 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java @@ -1,7 +1,5 @@ package org.fox.ttrss.util; -import android.util.Log; - import androidx.recyclerview.widget.DiffUtil; import org.fox.ttrss.types.Article; diff --git a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml index 2783a1e4..647c3ae9 100755 --- a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml +++ b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml @@ -12,7 +12,6 @@ -- cgit v1.2.3-54-g00ecf From 5dac45ba85a786b4a95038d11f5925ce09594898 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 14 May 2025 13:10:27 +0300 Subject: wip implementation of viewmodel/executor/livedata headlines --- .../src/main/java/org/fox/ttrss/ApiCommon.java | 8 +- .../src/main/java/org/fox/ttrss/ApiLoader.java | 2 +- .../src/main/java/org/fox/ttrss/ApiRequest.java | 2 +- .../src/main/java/org/fox/ttrss/Application.java | 11 +- .../src/main/java/org/fox/ttrss/ArticlePager.java | 11 +- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 127 ++++----- .../main/java/org/fox/ttrss/HeadlinesLoader.java | 289 ------------------- .../main/java/org/fox/ttrss/HeadlinesModel.java | 317 +++++++++++++++++++++ .../java/org/fox/ttrss/share/ShareActivity.java | 2 +- .../org/fox/ttrss/share/SubscribeActivity.java | 4 +- org.fox.ttrss/src/main/res/values/strings.xml | 1 + 11 files changed, 401 insertions(+), 373 deletions(-) delete mode 100755 org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesModel.java (limited to 'org.fox.ttrss/src/main/res') diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java index 75963c96..adc0881d 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java @@ -41,13 +41,16 @@ public class ApiCommon { void setLastErrorMessage(String message); } - public enum ApiError { NO_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, + public enum ApiError { + SUCCESS, UNKNOWN_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, HTTP_SERVER_ERROR, HTTP_OTHER_ERROR, SSL_REJECTED, SSL_HOSTNAME_REJECTED, PARSE_ERROR, IO_ERROR, OTHER_ERROR, API_DISABLED, API_UNKNOWN, LOGIN_FAILED, INVALID_URL, API_INCORRECT_USAGE, NETWORK_UNAVAILABLE, API_UNKNOWN_METHOD } public static int getErrorMessage(ApiError error) { switch (error) { - case NO_ERROR: + case SUCCESS: + return R.string.error_success; + case UNKNOWN_ERROR: return R.string.error_unknown; case HTTP_UNAUTHORIZED: return R.string.error_http_unauthorized; @@ -154,6 +157,7 @@ public class ApiCommon { switch (statusCode) { case API_STATUS_OK: + caller.setLastError(ApiError.SUCCESS); return result.getAsJsonObject().get("content"); case API_STATUS_ERR: JsonObject contentObj = resultObj.get("content").getAsJsonObject(); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java index 259d7a28..8d83e7bd 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java @@ -27,7 +27,7 @@ public class ApiLoader extends AsyncTaskLoader implements ApiCommon super(context); m_context = context; - m_lastError = ApiError.NO_ERROR; + m_lastError = ApiError.UNKNOWN_ERROR; m_params = params; } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java index 409047f0..ba8dad20 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java @@ -21,7 +21,7 @@ public class ApiRequest extends AsyncTask, Integer, JsonE public ApiRequest(Context context) { m_context = context; - m_lastError = ApiError.NO_ERROR; + m_lastError = ApiError.UNKNOWN_ERROR; } @SuppressLint("NewApi") 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 81ae7bdf..08beaa99 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 @@ -19,19 +19,24 @@ public class Application extends android.app.Application { // this is the only instance of a (large) object which contains all currently loaded articles and is // used by all fragments and activities concurrently - private final ArticleList m_articles = new ArticleList(); + // private final ArticleList m_articles = new ArticleList(); private String m_sessionId; private int m_apiLevel; public LinkedHashMap m_customSortModes = new LinkedHashMap<>(); ConnectivityManager m_cmgr; + HeadlinesModel m_headlinesModel; public static Application getInstance(){ return m_singleton; } public static ArticleList getArticles() { - return getInstance().m_articles; + return getInstance().m_headlinesModel.getArticles(); + } + + public HeadlinesModel getHeadlinesModel() { + return getInstance().m_headlinesModel; } @Override @@ -40,6 +45,7 @@ public class Application extends android.app.Application { m_singleton = this; m_cmgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + m_headlinesModel = new HeadlinesModel(this); } public String getSessionId() { @@ -87,5 +93,4 @@ public class Application extends android.app.Application { return false; } - } 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 f1ff8384..72b873a2 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 @@ -35,8 +35,6 @@ public class ArticlePager extends androidx.fragment.app.Fragment { public PagerAdapter(@NonNull Fragment fragment) { super(fragment, new HeadlinesDiffItemCallback()); - - syncToSharedArticles(); } private void syncToSharedArticles() { @@ -88,6 +86,15 @@ public class ArticlePager extends androidx.fragment.app.Fragment { View view = inflater.inflate(R.layout.fragment_article_pager, container, false); m_adapter = new PagerAdapter(this); + m_adapter.submitList(Application.getArticles()); + + HeadlinesModel model = Application.getInstance().getHeadlinesModel(); + + // deal with further updates + model.getLiveData().observe(getActivity(), articles -> { + Log.d(TAG, "observed article list size=" + articles.size()); + m_adapter.submitList(articles); + }); m_pager = view.findViewById(R.id.article_pager); 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 a3a1bb46..6ca33b60 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 @@ -48,7 +48,6 @@ import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; import androidx.core.view.ViewCompat; -import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DefaultItemAnimator; @@ -86,74 +85,10 @@ import java.util.TimeZone; import jp.wasabeef.glide.transformations.CropCircleTransformation; -public class HeadlinesFragment extends androidx.fragment.app.Fragment implements LoaderManager.LoaderCallbacks { +public class HeadlinesFragment extends androidx.fragment.app.Fragment { private boolean m_isLazyLoading; - @NonNull - @Override - public Loader onCreateLoader(int id, @Nullable Bundle args) { - return new HeadlinesLoader(getContext(), m_feed, m_activity.getResizeWidth(), Application.getArticles()); - } - - @Override - public void onLoadFinished(@NonNull Loader loader, ArticleList data) { - Log.d(TAG, "onLoadFinished loader=" + loader + " size=" + (data != null ? data.size() : "N/A (null)")); - - HeadlinesLoader headlinesLoader = (HeadlinesLoader) loader; - - // successful update - if (data != null) { - - // shared article list contains raw returned data without footers - ArticleList sharedArticles = Application.getArticles(); - sharedArticles.clear(); - sharedArticles.addAll(data); - - ArticleList tmp = new ArticleList(); - - tmp.addAll(data); - - if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) - tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - - final boolean appended = headlinesLoader.getAppend(); - - m_adapter.submitList(tmp, () -> { - if (!appended) - m_list.scrollToPosition(0); - }); - - if (headlinesLoader.getFirstIdChanged()) - Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) - .setAction(R.string.reload, v -> refresh(false)).show(); - - m_listener.onHeadlinesLoaded(headlinesLoader.getAppend()); - - } else { - if (headlinesLoader.getLastError() == ApiCommon.ApiError.LOGIN_FAILED) { - m_activity.login(); - } else { - if (headlinesLoader.getLastErrorMessage() != null) { - m_activity.toast(m_activity.getString(headlinesLoader.getErrorMessage()) + "\n" + headlinesLoader.getLastErrorMessage()); - } else { - m_activity.toast(headlinesLoader.getErrorMessage()); - } - } - } - - if (m_swipeLayout != null) - m_swipeLayout.setRefreshing(false); - - m_isLazyLoading = false; - } - - @Override - public void onLoaderReset(@NonNull Loader loader) { - if (m_swipeLayout != null) - m_swipeLayout.setRefreshing(false); - } - public void notifyItemChanged(int position) { if (m_adapter != null) m_adapter.notifyItemChanged(position); @@ -169,7 +104,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements private Feed m_feed; private int m_activeArticleId; private String m_searchQuery = ""; - private HeadlinesLoader m_loader; + //private HeadlinesLoader m_loader; private SharedPreferences m_prefs; @@ -502,7 +437,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - if (dy > 0 && !m_isLazyLoading && (m_loader == null || m_loader.lazyLoadEnabled()) && + HeadlinesModel model = Application.getInstance().getHeadlinesModel(); + + if (dy > 0 && !m_isLazyLoading && model.lazyLoadEnabled() && lastVisibleItem >= Application.getArticles().size() - 5) { m_isLazyLoading = true; @@ -519,6 +456,47 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements m_activity.setTitle(m_feed.title); } + HeadlinesModel model = Application.getInstance().getHeadlinesModel(); + + model.getLiveData().observe(getActivity(), articles -> { + Log.d(TAG, "observed article list size=" + articles.size()); + + ArticleList tmp = new ArticleList(); + + tmp.addAll(articles); + + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) + tmp.add(new Article(Article.TYPE_AMR_FOOTER)); + + final boolean appended = model.getAppend(); + + m_adapter.submitList(tmp, () -> { + if (!appended) + m_list.scrollToPosition(0); + }); + + if (model.getFirstIdChanged()) + Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) + .setAction(R.string.reload, v -> refresh(false)).show(); + + if (m_swipeLayout != null) + m_swipeLayout.setRefreshing(false); + + m_isLazyLoading = false; + + if (model.getLastError() == ApiCommon.ApiError.LOGIN_FAILED) { + m_activity.login(); + } else if (model.getLastError() != null && model.getLastError() != ApiCommon.ApiError.SUCCESS) { + if (model.getLastErrorMessage() != null) { + m_activity.toast(m_activity.getString(model.getErrorMessage()) + "\n" + model.getLastErrorMessage()); + } else { + m_activity.toast(model.getErrorMessage()); + } + } + + m_listener.onHeadlinesLoaded(appended); + }); + return view; } @@ -561,17 +539,22 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements // if we try to initLoader() all the time, onLoadFinished() might be sent twice // https://stackoverflow.com/questions/11293441/android-loadercallbacks-onloadfinished-called-twice - if (m_loader == null) { + /* if (m_loader == null) { m_loader = (HeadlinesLoader) LoaderManager.getInstance(this). initLoader(Application.LOADER_HEADLINES, null, this); - } + } */ if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true); - m_loader.setSearchQuery(getSearchQuery()); - m_loader.startLoading(append); + HeadlinesModel model = Application.getInstance().getHeadlinesModel(); + + model.setSearchQuery(getSearchQuery()); + model.startLoading(append, m_feed, m_activity.getResizeWidth()); + + //m_loader.setSearchQuery(getSearchQuery()); + //m_loader.startLoading(append); } static class ArticleViewHolder extends RecyclerView.ViewHolder { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java deleted file mode 100755 index 812a745e..00000000 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.fox.ttrss; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; - -import androidx.loader.content.AsyncTaskLoader; -import androidx.preference.PreferenceManager; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -import org.fox.ttrss.ApiCommon.ApiError; -import org.fox.ttrss.types.Article; -import org.fox.ttrss.types.ArticleList; -import org.fox.ttrss.types.Feed; - -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.List; - -public class HeadlinesLoader extends AsyncTaskLoader implements ApiCommon.ApiCaller { - private final String TAG = this.getClass().getSimpleName(); - - private final int m_responseCode = 0; - protected String m_responseMessage; - private int m_apiStatusCode = 0; - - private Context m_context; - private String m_lastErrorMessage; - private ApiError m_lastError; - private ArticleList m_articles; - private Feed m_feed; - private SharedPreferences m_prefs; - private int m_firstId; - private String m_searchQuery = ""; - private boolean m_firstIdChanged; - private int m_offset; - private int m_amountLoaded; - private int m_resizeWidth; - private boolean m_append; - private boolean m_lazyLoadEnabled = true; - private boolean m_loadingInProgress; - - HeadlinesLoader(Context context, Feed feed, int resizeWidth, ArticleList articles) { - super(context); - - Log.d(TAG, "HeadlinesLoader created!"); - - m_context = context; - m_lastError = ApiError.NO_ERROR; - m_feed = feed; - m_articles = new ArticleList(); - - m_articles.addAll(articles); - - m_resizeWidth = resizeWidth; - m_prefs = PreferenceManager.getDefaultSharedPreferences(context); - } - - protected void startLoading(boolean append) { - Log.d(TAG, this + " startLoading append=" + append + " inProgress=" + m_loadingInProgress + " lazyLoadEnabled=" + m_lazyLoadEnabled + "localSize="+ m_articles.size()); - - if (!append) { - m_append = false; - m_lazyLoadEnabled = true; - - forceLoad(); - } else if (m_lazyLoadEnabled && !m_loadingInProgress) { - m_append = true; - forceLoad(); - } else { - deliverResult(m_articles); - } - } - - @Override - public void deliverResult(ArticleList data) { - super.deliverResult(data); - } - - public int getErrorMessage() { - return ApiCommon.getErrorMessage(m_lastError); - } - - ApiError getLastError() { - return m_lastError; - } - - String getLastErrorMessage() { - return m_lastErrorMessage; - } - - public boolean lazyLoadEnabled() { - return m_lazyLoadEnabled; - } - - @Override - public ArticleList loadInBackground() { - Log.d(TAG, this + " loadInBackground append=" + m_append + " offset=" + m_offset); - - m_loadingInProgress = true; - - final int skip = getSkip(m_append); - final boolean allowForceUpdate = Application.getInstance().getApiLevel() >= 9 && - !m_feed.is_cat && m_feed.id > 0 && !m_append && skip == 0; - - HashMap params = new HashMap<>(); - - params.put("op", "getHeadlines"); - params.put("sid", Application.getInstance().getSessionId()); - params.put("feed_id", String.valueOf(m_feed.id)); - params.put("show_excerpt", "true"); - params.put("excerpt_length", String.valueOf(CommonActivity.EXCERPT_MAX_LENGTH)); - params.put("show_content", "true"); - params.put("include_attachments", "true"); - params.put("view_mode", m_prefs.getString("view_mode", "adaptive")); - params.put("limit", m_prefs.getString("headlines_request_size", "15")); - params.put("skip", String.valueOf(skip)); - params.put("include_nested", "true"); - params.put("has_sandbox", "true"); - params.put("order_by", m_prefs.getString("headlines_sort_mode", "default")); - - if (m_prefs.getBoolean("enable_image_downsampling", false)) { - if (m_prefs.getBoolean("always_downsample_images", false) || !Application.getInstance().isWifiConnected()) { - params.put("resize_width", String.valueOf(m_resizeWidth)); - } - } - - if (m_feed.is_cat) - params.put("is_cat", "true"); - - if (allowForceUpdate) { - params.put("force_update", "true"); - } - - if (m_searchQuery != null && !m_searchQuery.isEmpty()) { - params.put("search", m_searchQuery); - params.put("search_mode", ""); - params.put("match_on", "both"); - } - - if (m_firstId > 0) - params.put("check_first_id", String.valueOf(m_firstId)); - - if (Application.getInstance().getApiLevel() >= 12) { - params.put("include_header", "true"); - } - - Log.d(TAG, "firstId=" + m_firstId + " append=" + m_append + " skip=" + skip + " localSize=" + m_articles.size()); - - JsonElement result = ApiCommon.performRequest(m_context, params, this); - - Log.d(TAG, "got result=" + result); - - if (result != null) { - try { - JsonArray content = result.getAsJsonArray(); - if (content != null) { - final List
articlesJson; - final JsonObject header; - - if (Application.getInstance().getApiLevel() >= 12) { - header = content.get(0).getAsJsonObject(); - - m_firstIdChanged = header.get("first_id_changed") != null; - - try { - m_firstId = header.get("first_id").getAsInt(); - } catch (NumberFormatException e) { - m_firstId = 0; - } - - Log.d(TAG, this + " firstID=" + m_firstId + " firstIdChanged=" + m_firstIdChanged); - - Type listType = new TypeToken>() {}.getType(); - articlesJson = new Gson().fromJson(content.get(1), listType); - } else { - Type listType = new TypeToken>() {}.getType(); - articlesJson = new Gson().fromJson(content, listType); - } - - if (!m_append) - m_articles.clear(); - - m_amountLoaded = articlesJson.size(); - - for (Article article : articlesJson) - if (!m_articles.containsId(article.id)) { - article.collectMediaInfo(); - article.cleanupExcerpt(); - article.fixNullFields(); - m_articles.add(article); - } - - if (m_firstIdChanged) { - Log.d(TAG, "first id changed, disabling lazy load"); - m_lazyLoadEnabled = false; - } - - if (m_amountLoaded < Integer.parseInt(m_prefs.getString("headlines_request_size", "15"))) { - Log.d(TAG, this + " amount loaded "+m_amountLoaded+" < request size, disabling lazy load"); - m_lazyLoadEnabled = false; - } - - m_offset += m_amountLoaded; - m_loadingInProgress = false; - - Log.d(TAG, this + " loaded headlines=" + m_amountLoaded + " resultingLocalSize=" + m_articles.size()); - - return m_articles; - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - m_loadingInProgress = false; - - return null; - } - - private int getSkip(boolean append) { - int skip = 0; - - if (append) { - // adaptive, all_articles, marked, published, unread - String viewMode = m_prefs.getString("view_mode", "adaptive"); - - int numUnread = Math.toIntExact(m_articles.getUnreadCount()); - int numAll = Math.toIntExact(m_articles.getSizeWithoutFooters()); - - if ("marked".equals(viewMode)) { - skip = numAll; - } else if ("published".equals(viewMode)) { - skip = numAll; - } else if ("unread".equals(viewMode)) { - skip = numUnread; - } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { - skip = numAll; - } else if ("adaptive".equals(viewMode)) { - skip = numUnread > 0 ? numUnread : numAll; - } else { - skip = numAll; - } - } - - return skip; - } - - @Override - public void setStatusCode(int statusCode) { - m_apiStatusCode = statusCode; - } - - @Override - public void setLastError(ApiError lastError) { - m_lastError = lastError; - } - - @Override - public void setLastErrorMessage(String message) { - m_lastErrorMessage = message; - } - - public boolean getFirstIdChanged() { - return m_firstIdChanged; - } - - public boolean getAppend() { - return m_append; - } - - public void setSearchQuery(String searchQuery) { - m_searchQuery = searchQuery; - } - - public String getSearchQuery() { - return m_searchQuery; - } - - public int getOffset() { - return m_offset; - } -} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesModel.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesModel.java new file mode 100644 index 00000000..08adb73b --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesModel.java @@ -0,0 +1,317 @@ +package org.fox.ttrss; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.loader.app.LoaderManager; +import androidx.preference.PreferenceManager; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +import org.fox.ttrss.types.Article; +import org.fox.ttrss.types.ArticleList; +import org.fox.ttrss.types.Feed; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class HeadlinesModel extends AndroidViewModel implements ApiCommon.ApiCaller { + private final String TAG = this.getClass().getSimpleName(); + private final MutableLiveData m_articles = new MutableLiveData<>(new ArticleList()); + private SharedPreferences m_prefs; + private final int m_responseCode = 0; + protected String m_responseMessage; + private int m_apiStatusCode = 0; + + private String m_lastErrorMessage; + private ApiCommon.ApiError m_lastError; + private Feed m_feed; + private int m_firstId; + private String m_searchQuery = ""; + private boolean m_firstIdChanged; + private int m_offset; + private int m_amountLoaded; + private int m_resizeWidth; + private boolean m_append; + private boolean m_lazyLoadEnabled = true; + private boolean m_loadingInProgress; + private ExecutorService m_executor; + private Handler m_mainHandler = new Handler(Looper.getMainLooper()); + + public HeadlinesModel(@NonNull Application application) { + super(application); + + m_prefs = PreferenceManager.getDefaultSharedPreferences(application); + + // do we need concurrency or not? + m_executor = Executors.newSingleThreadExecutor(); + } + + public LiveData getLiveData() { + return m_articles; + + } + + public ArticleList getArticles() { + return m_articles.getValue(); + } + + public void update(ArticleList articles) { + m_articles.postValue(articles); + } + + public void startLoading(boolean append, @NonNull Feed feed, int resizeWidth) { + Log.d(TAG, "startLoading append=" + append); + + m_resizeWidth = resizeWidth; + + if (!append) { + m_append = false; + m_lazyLoadEnabled = true; + m_feed = feed; + + forceLoad(); + } else if (feed != m_feed || m_lazyLoadEnabled && !m_loadingInProgress) { + m_append = true; + m_feed = feed; + forceLoad(); + } else { + ArticleList tmp = new ArticleList(); + tmp.addAll(m_articles.getValue()); + + m_articles.postValue(tmp); + } + } + + public void forceLoad() { + Log.d(TAG, "forceLoad"); + + m_articles.postValue(loadInBackground()); + } + + public ArticleList loadInBackground() { + Log.d(TAG, this + " loadInBackground append=" + m_append + " offset=" + m_offset); + + ArticleList articlesWork = new ArticleList(); + articlesWork.addAll(m_articles.getValue()); + + m_loadingInProgress = true; + + final int skip = getSkip(m_append, articlesWork); + final boolean allowForceUpdate = org.fox.ttrss.Application.getInstance().getApiLevel() >= 9 && + !m_feed.is_cat && m_feed.id > 0 && !m_append && skip == 0; + + HashMap params = new HashMap<>(); + + params.put("op", "getHeadlines"); + params.put("sid", org.fox.ttrss.Application.getInstance().getSessionId()); + params.put("feed_id", String.valueOf(m_feed.id)); + params.put("show_excerpt", "true"); + params.put("excerpt_length", String.valueOf(CommonActivity.EXCERPT_MAX_LENGTH)); + params.put("show_content", "true"); + params.put("include_attachments", "true"); + params.put("view_mode", m_prefs.getString("view_mode", "adaptive")); + params.put("limit", m_prefs.getString("headlines_request_size", "15")); + params.put("skip", String.valueOf(skip)); + params.put("include_nested", "true"); + params.put("has_sandbox", "true"); + params.put("order_by", m_prefs.getString("headlines_sort_mode", "default")); + + if (m_prefs.getBoolean("enable_image_downsampling", false)) { + if (m_prefs.getBoolean("always_downsample_images", false) || !org.fox.ttrss.Application.getInstance().isWifiConnected()) { + params.put("resize_width", String.valueOf(m_resizeWidth)); + } + } + + if (m_feed.is_cat) + params.put("is_cat", "true"); + + if (allowForceUpdate) { + params.put("force_update", "true"); + } + + if (m_searchQuery != null && !m_searchQuery.isEmpty()) { + params.put("search", m_searchQuery); + params.put("search_mode", ""); + params.put("match_on", "both"); + } + + if (m_firstId > 0) + params.put("check_first_id", String.valueOf(m_firstId)); + + if (org.fox.ttrss.Application.getInstance().getApiLevel() >= 12) { + params.put("include_header", "true"); + } + + Log.d(TAG, "firstId=" + m_firstId + " append=" + m_append + " skip=" + skip + " localSize=" + articlesWork.size()); + + m_executor.execute(() -> { + JsonElement result = ApiCommon.performRequest(getApplication(), params, this); + + Log.d(TAG, "got result=" + result); + + if (result != null) { + try { + JsonArray content = result.getAsJsonArray(); + if (content != null) { + final List
articlesJson; + final JsonObject header; + + if (org.fox.ttrss.Application.getInstance().getApiLevel() >= 12) { + header = content.get(0).getAsJsonObject(); + + m_firstIdChanged = header.get("first_id_changed") != null; + + try { + m_firstId = header.get("first_id").getAsInt(); + } catch (NumberFormatException e) { + m_firstId = 0; + } + + Log.d(TAG, this + " firstID=" + m_firstId + " firstIdChanged=" + m_firstIdChanged); + + Type listType = new TypeToken>() {}.getType(); + articlesJson = new Gson().fromJson(content.get(1), listType); + } else { + Type listType = new TypeToken>() {}.getType(); + articlesJson = new Gson().fromJson(content, listType); + } + + if (!m_append) + articlesWork.clear(); + + m_amountLoaded = articlesJson.size(); + + for (Article article : articlesJson) + if (!articlesWork.containsId(article.id)) { + article.collectMediaInfo(); + article.cleanupExcerpt(); + article.fixNullFields(); + articlesWork.add(article); + } + + if (m_firstIdChanged) { + Log.d(TAG, "first id changed, disabling lazy load"); + m_lazyLoadEnabled = false; + } + + if (m_amountLoaded < Integer.parseInt(m_prefs.getString("headlines_request_size", "15"))) { + Log.d(TAG, this + " amount loaded "+m_amountLoaded+" < request size, disabling lazy load"); + m_lazyLoadEnabled = false; + } + + m_offset += m_amountLoaded; + m_loadingInProgress = false; + + Log.d(TAG, this + " loaded headlines=" + m_amountLoaded + " resultingLocalSize=" + articlesWork.size()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + m_mainHandler.post(() -> { + m_articles.postValue(articlesWork); + }); + }); + + m_loadingInProgress = false; + + return articlesWork; + } + + private int getSkip(boolean append, ArticleList articles) { + int skip = 0; + + if (append) { + // adaptive, all_articles, marked, published, unread + String viewMode = m_prefs.getString("view_mode", "adaptive"); + + int numUnread = Math.toIntExact(articles.getUnreadCount()); + int numAll = Math.toIntExact(articles.size()); + + if ("marked".equals(viewMode)) { + skip = numAll; + } else if ("published".equals(viewMode)) { + skip = numAll; + } else if ("unread".equals(viewMode)) { + skip = numUnread; + } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { + skip = numAll; + } else if ("adaptive".equals(viewMode)) { + skip = numUnread > 0 ? numUnread : numAll; + } else { + skip = numAll; + } + } + + return skip; + } + + @Override + public void setStatusCode(int statusCode) { + m_apiStatusCode = statusCode; + } + + @Override + public void setLastError(ApiCommon.ApiError lastError) { + m_lastError = lastError; + } + + @Override + public void setLastErrorMessage(String message) { + m_lastErrorMessage = message; + } + + public boolean getFirstIdChanged() { + return m_firstIdChanged; + } + + public boolean getAppend() { + return m_append; + } + + public void setSearchQuery(String searchQuery) { + m_searchQuery = searchQuery; + } + + public String getSearchQuery() { + return m_searchQuery; + } + + public int getOffset() { + return m_offset; + } + + public boolean lazyLoadEnabled() { + return m_lazyLoadEnabled; + } + + public int getErrorMessage() { + return ApiCommon.getErrorMessage(m_lastError); + } + + ApiCommon.ApiError getLastError() { + return m_lastError; + } + + String getLastErrorMessage() { + return m_lastErrorMessage; + } + +} 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 3a1553b6..66a77aef 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 @@ -86,7 +86,7 @@ public class ShareActivity extends CommonShareActivity { protected void onPostExecute(JsonElement result) { setProgressBarIndeterminateVisibility(false); - if (m_lastError != ApiCommon.ApiError.NO_ERROR) { + if (m_lastError != ApiCommon.ApiError.UNKNOWN_ERROR) { toast(getErrorMessage()); } else { toast(R.string.share_article_posted); 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 e71583d3..82e2d52d 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 @@ -157,7 +157,7 @@ public class SubscribeActivity extends CommonShareActivity { protected void onPostExecute(JsonElement result) { m_progressBar.setVisibility(View.INVISIBLE); - if (m_lastError != ApiCommon.ApiError.NO_ERROR) { + if (m_lastError != ApiCommon.ApiError.UNKNOWN_ERROR) { toast(getErrorMessage()); } else { try { @@ -259,7 +259,7 @@ public class SubscribeActivity extends CommonShareActivity { protected void onPostExecute(JsonElement result) { m_progressBar.setVisibility(View.INVISIBLE); - if (m_lastError != ApiCommon.ApiError.NO_ERROR) { + if (m_lastError != ApiCommon.ApiError.UNKNOWN_ERROR) { toast(getErrorMessage()); } else { JsonArray content = result.getAsJsonArray(); diff --git a/org.fox.ttrss/src/main/res/values/strings.xml b/org.fox.ttrss/src/main/res/values/strings.xml index 6a67013a..fb7e6309 100755 --- a/org.fox.ttrss/src/main/res/values/strings.xml +++ b/org.fox.ttrss/src/main/res/values/strings.xml @@ -303,4 +303,5 @@ Check for updates Nothing Open on startup + Operation completed successfully -- cgit v1.2.3-54-g00ecf From f33eecf0755c271bfbcc7c50ff406f5bf84d713a Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 14 May 2025 14:06:49 +0300 Subject: add variant icon and other fixes for build applicationsuffix --- org.fox.ttrss/build.gradle | 23 ++++++++++-- org.fox.ttrss/src/main/AndroidManifest.xml | 4 +-- .../drawable/ic_launcher_background_variant.xml | 42 ++++++++++++++++++++++ .../res/layout-sw600dp-land/activity_detail.xml | 2 +- .../res/layout-sw600dp-land/activity_master.xml | 2 +- .../src/main/res/layout/layout_detail_phone.xml | 2 +- .../src/main/res/layout/layout_master_phone.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher_variant.xml | 5 +++ 8 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 org.fox.ttrss/src/main/res/drawable/ic_launcher_background_variant.xml create mode 100644 org.fox.ttrss/src/main/res/mipmap-anydpi-v26/ic_launcher_variant.xml (limited to 'org.fox.ttrss/src/main/res') diff --git a/org.fox.ttrss/build.gradle b/org.fox.ttrss/build.gradle index cce34e7d..7ffaf523 100755 --- a/org.fox.ttrss/build.gradle +++ b/org.fox.ttrss/build.gradle @@ -16,6 +16,9 @@ android { versionCode getGitVersionCode() versionName getVersion() vectorDrawables.useSupportLibrary = true + manifestPlaceholders = [ + appIcon: "@mipmap/ic_launcher" + ] } signingConfigs { @@ -36,8 +39,20 @@ android { } buildTypes { + debug { + minifyEnabled false + versionNameSuffix "-debug" + applicationIdSuffix ".debug" + debuggable true + resValue "string", "app_name", "Tiny Tiny RSS (debug)" + manifestPlaceholders = [ + appIcon: "@mipmap/ic_launcher_variant" + ] + } + release { minifyEnabled false + versionNameSuffix "-release-unsigned" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } @@ -46,16 +61,18 @@ android { versionNameSuffix "-signed" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' signingConfig signingConfigs.signed - matchingFallbacks = ['release'] } - signedBranch { + branch { minifyEnabled false versionNameSuffix "-signed-branch" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' signingConfig signingConfigs.signed - matchingFallbacks = ['release'] applicationIdSuffix ".branch" + resValue "string", "app_name", "Tiny Tiny RSS (branch)" + manifestPlaceholders = [ + appIcon: "@mipmap/ic_launcher_variant" + ] } } namespace 'org.fox.ttrss' diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml index feb8a2e1..3388d515 100755 --- a/org.fox.ttrss/src/main/AndroidManifest.xml +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ android:name=".Application" android:allowBackup="true" android:hardwareAccelerated="true" - android:icon="@mipmap/ic_launcher" + android:icon="${appIcon}" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" > @@ -217,7 +217,7 @@ + + + + + + + + diff --git a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml b/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml index 59c1b086..823afb9b 100644 --- a/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml +++ b/org.fox.ttrss/src/main/res/layout-sw600dp-land/activity_detail.xml @@ -54,7 +54,7 @@ + app:layout_behavior="org.fox.ttrss.util.FabAwareScrollingViewBehavior" /> diff --git a/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml b/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml index b4cb6b59..e32d5fbe 100644 --- a/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml +++ b/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml @@ -29,7 +29,7 @@ diff --git a/org.fox.ttrss/src/main/res/mipmap-anydpi-v26/ic_launcher_variant.xml b/org.fox.ttrss/src/main/res/mipmap-anydpi-v26/ic_launcher_variant.xml new file mode 100644 index 00000000..d49922f9 --- /dev/null +++ b/org.fox.ttrss/src/main/res/mipmap-anydpi-v26/ic_launcher_variant.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file -- cgit v1.2.3-54-g00ecf From b735651f0f9dc94687122ad09c9918b4ea477f47 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 14 May 2025 15:45:11 +0300 Subject: enable categories ootb like tt-rss main --- org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java | 2 +- org.fox.ttrss/src/main/res/xml/preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'org.fox.ttrss/src/main/res') 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 e63234cd..458f1f76 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 @@ -164,7 +164,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - if (m_prefs.getBoolean("enable_cats", false)) { + if (m_prefs.getBoolean("enable_cats", true)) { ft.replace(R.id.feeds_fragment, new FeedCategoriesFragment(), FRAG_CATS); } else { ft.replace(R.id.feeds_fragment, new FeedsFragment(), FRAG_FEEDS); diff --git a/org.fox.ttrss/src/main/res/xml/preferences.xml b/org.fox.ttrss/src/main/res/xml/preferences.xml index 81fbd5f1..94cf71db 100755 --- a/org.fox.ttrss/src/main/res/xml/preferences.xml +++ b/org.fox.ttrss/src/main/res/xml/preferences.xml @@ -44,7 +44,7 @@ android:title="@string/sort_feeds_by_unread" /> -- cgit v1.2.3-54-g00ecf From d7ff3136f56d366d44545152f48619c4b0f03ff7 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 14 May 2025 17:16:13 +0300 Subject: fix swipe to dismiss, allow it working with auto catchup --- .../src/main/java/org/fox/ttrss/HeadlinesFragment.java | 17 +++++++++++------ org.fox.ttrss/src/main/res/xml/preferences.xml | 1 - 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'org.fox.ttrss/src/main/res') 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 849eb8c5..8c881924 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 @@ -312,7 +312,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { refresh(false); } - if (m_prefs.getBoolean("headlines_swipe_to_dismiss", true) && !m_prefs.getBoolean("headlines_mark_read_scroll", false) ) { + if (m_prefs.getBoolean("headlines_swipe_to_dismiss", true) /*&& !m_prefs.getBoolean("headlines_mark_read_scroll", false) */) { ItemTouchHelper swipeHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { @@ -357,8 +357,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { wasUnread = false; } - Application.getArticles().remove(adapterPosition); - m_adapter.notifyItemRemoved(adapterPosition); + ArticleList tmpRemove = new ArticleList(); + tmpRemove.addAll(Application.getArticles()); + tmpRemove.remove(adapterPosition); + + Application.getInstance().getHeadlinesModel().update(tmpRemove); Snackbar.make(m_list, R.string.headline_undo_row_prompt, Snackbar.LENGTH_LONG) .setAction(getString(R.string.headline_undo_row_button), v -> { @@ -368,9 +371,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_activity.saveArticleUnread(article); } - Application.getArticles().add(adapterPosition, article); - m_adapter.notifyItemInserted(adapterPosition); - m_adapter.notifyItemRangeChanged(adapterPosition, 1); + ArticleList tmpInsert = new ArticleList(); + tmpInsert.addAll(Application.getArticles()); + tmpInsert.add(adapterPosition, article); + + Application.getInstance().getHeadlinesModel().update(tmpInsert); }).show(); } diff --git a/org.fox.ttrss/src/main/res/xml/preferences.xml b/org.fox.ttrss/src/main/res/xml/preferences.xml index 94cf71db..8d064587 100755 --- a/org.fox.ttrss/src/main/res/xml/preferences.xml +++ b/org.fox.ttrss/src/main/res/xml/preferences.xml @@ -108,7 +108,6 @@ -- cgit v1.2.3-54-g00ecf From 6e1ea990c69f72ac0b3e49f46ce620aa8e873422 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 15 May 2025 08:58:39 +0300 Subject: add rss_box icon --- .../src/main/java/org/fox/ttrss/FeedsFragment.java | 27 +++++++--------------- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 5 +--- .../main/java/org/fox/ttrss/OnlineActivity.java | 2 +- org.fox.ttrss/src/main/res/drawable/rss.xml | 1 + org.fox.ttrss/src/main/res/drawable/rss_box.xml | 1 + org.fox.ttrss/src/main/res/layout/feeds_row.xml | 2 +- .../src/main/res/layout/feeds_row_selected.xml | 2 +- .../src/main/res/layout/feeds_row_toggle.xml | 2 +- .../src/main/res/layout/headlines_row.xml | 2 +- .../src/main/res/layout/headlines_row_unread.xml | 4 ++-- org.fox.ttrss/src/main/res/values-night/themes.xml | 1 - org.fox.ttrss/src/main/res/values/attrs.xml | 1 - org.fox.ttrss/src/main/res/values/themes.xml | 1 - 13 files changed, 18 insertions(+), 33 deletions(-) create mode 100644 org.fox.ttrss/src/main/res/drawable/rss.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/rss_box.xml (limited to 'org.fox.ttrss/src/main/res') 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 f618b5b1..c198343d 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 @@ -462,34 +462,23 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi ImageView icon = v.findViewById(R.id.icon); if (icon != null) { - TypedValue tv = new TypedValue(); - if (feed.id == 0 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_archive, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_archive_24); } else if (feed.id == -1 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_star, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_star_24); } else if (feed.id == -2 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_rss_box, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.rss); } else if (feed.id == -3 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_fresh, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_local_fire_department_24); } else if (feed.id == -4 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_inbox, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_inbox_24); } else if (feed.id == -6 && !feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_restore, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_restore_24); } else if (feed.is_cat) { - m_activity.getTheme().resolveAttribute(R.attr.ic_folder_outline, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_folder_open_24); } else { - m_activity.getTheme().resolveAttribute(R.attr.ic_rss_box, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.rss); } - } TextView tt = v.findViewById(R.id.title); 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 5eebd65f..1e22f711 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 @@ -896,10 +896,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } if (holder.publishedView != null) { - TypedValue tv = new TypedValue(); - m_activity.getTheme().resolveAttribute(R.attr.ic_rss_box, tv, true); - - holder.publishedView.setIconResource(tv.resourceId); + holder.publishedView.setIconResource(article.published ? R.drawable.rss_box : R.drawable.rss); if (article.published) holder.publishedView.setIconTint(ColorStateList.valueOf(tvTertiary.data)); 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 26dab50d..06503dc5 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 @@ -1184,7 +1184,7 @@ article.score = Integer.parseInt(edit.getText().toString()); 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.baseline_check_box_24 : + m_menu.findItem(R.id.toggle_published).setIcon(article.published ? R.drawable.rss_box : R.drawable.baseline_rss_feed_24); } } diff --git a/org.fox.ttrss/src/main/res/drawable/rss.xml b/org.fox.ttrss/src/main/res/drawable/rss.xml new file mode 100644 index 00000000..f97e14a2 --- /dev/null +++ b/org.fox.ttrss/src/main/res/drawable/rss.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/drawable/rss_box.xml b/org.fox.ttrss/src/main/res/drawable/rss_box.xml new file mode 100644 index 00000000..45b40cea --- /dev/null +++ b/org.fox.ttrss/src/main/res/drawable/rss_box.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/feeds_row.xml b/org.fox.ttrss/src/main/res/layout/feeds_row.xml index 32e20c26..0f9c4e54 100755 --- a/org.fox.ttrss/src/main/res/layout/feeds_row.xml +++ b/org.fox.ttrss/src/main/res/layout/feeds_row.xml @@ -23,7 +23,7 @@ android:layout_weight="0" android:scaleType="fitXY" app:tint="?colorOnPrimaryContainer" - android:src="?ic_rss_box" /> + android:src="@drawable/rss" /> + android:src="@drawable/rss" /> + android:src="@drawable/rss_box" /> + app:icon="@drawable/rss" /> + app:icon="@drawable/rss" /> + app:icon="@drawable/baseline_more_vert_24" /> diff --git a/org.fox.ttrss/src/main/res/values-night/themes.xml b/org.fox.ttrss/src/main/res/values-night/themes.xml index 7d54a029..5f32a7b3 100644 --- a/org.fox.ttrss/src/main/res/values-night/themes.xml +++ b/org.fox.ttrss/src/main/res/values-night/themes.xml @@ -3,7 +3,6 @@ true @style/AppPreferenceThemeOverlay - @drawable/baseline_rss_feed_24 @drawable/baseline_check_box_24 @drawable/baseline_star_24 @drawable/baseline_star_outline_24 diff --git a/org.fox.ttrss/src/main/res/values/attrs.xml b/org.fox.ttrss/src/main/res/values/attrs.xml index daf2323c..e33d1c8a 100755 --- a/org.fox.ttrss/src/main/res/values/attrs.xml +++ b/org.fox.ttrss/src/main/res/values/attrs.xml @@ -1,6 +1,5 @@ - diff --git a/org.fox.ttrss/src/main/res/values/themes.xml b/org.fox.ttrss/src/main/res/values/themes.xml index 68a57811..9969617c 100644 --- a/org.fox.ttrss/src/main/res/values/themes.xml +++ b/org.fox.ttrss/src/main/res/values/themes.xml @@ -4,7 +4,6 @@ true @style/AppPreferenceThemeOverlay - @drawable/baseline_rss_feed_24 @drawable/baseline_check_box_24 @drawable/baseline_star_24 @drawable/baseline_star_outline_24 -- cgit v1.2.3-54-g00ecf From 2122a9b494feaddd953b276b06d8b4d0515d0f27 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 15 May 2025 09:05:34 +0300 Subject: drop no longer useful theme attributes in favor of drawable ids --- .../java/org/fox/ttrss/BaseFeedlistFragment.java | 4 +--- .../java/org/fox/ttrss/FeedCategoriesFragment.java | 5 +---- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 17 +++++---------- .../src/main/res/layout/activity_gallery.xml | 2 +- org.fox.ttrss/src/main/res/layout/feeds_goback.xml | 2 +- .../src/main/res/layout/headlines_row.xml | 8 +++---- .../src/main/res/layout/headlines_row_compact.xml | 2 +- .../res/layout/headlines_row_compact_active.xml | 2 +- .../layout/headlines_row_compact_active_unread.xml | 2 +- .../res/layout/headlines_row_compact_unread.xml | 2 +- .../src/main/res/layout/headlines_row_unread.xml | 6 +++--- org.fox.ttrss/src/main/res/values-night/themes.xml | 22 ------------------- org.fox.ttrss/src/main/res/values/attrs.xml | 25 ---------------------- org.fox.ttrss/src/main/res/values/themes.xml | 22 ------------------- 14 files changed, 20 insertions(+), 101 deletions(-) (limited to 'org.fox.ttrss/src/main/res') 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 def61209..b37f7386 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 @@ -62,9 +62,7 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen 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); + icon.setImageResource(R.drawable.baseline_filter_alt_24); final SwitchCompat rowSwitch = rowToggle.findViewById(R.id.row_switch); rowSwitch.setChecked(activity.getUnreadOnly()); 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 1d735490..34127013 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 @@ -376,10 +376,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt ImageView icon = v.findViewById(R.id.icon); if (icon != null) { - TypedValue tv = new TypedValue(); - - m_activity.getTheme().resolveAttribute(R.attr.ic_folder_outline, tv, true); - icon.setImageResource(tv.resourceId); + icon.setImageResource(R.drawable.baseline_folder_open_24); } 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 1e22f711..b0a3d2d3 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 @@ -830,11 +830,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { 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.setIconResource(tv.resourceId); - + holder.markedView.setIconResource(article.marked ? R.drawable.baseline_star_24 : R.drawable.baseline_star_outline_24); if (article.marked) holder.markedView.setIconTint(ColorStateList.valueOf(tvTertiary.data)); @@ -851,17 +847,14 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } if (holder.scoreView != null) { - TypedValue tv = new TypedValue(); - int scoreAttr = R.attr.ic_action_trending_flat; + int scoreDrawable = R.drawable.baseline_trending_flat_24; if (article.score > 0) - scoreAttr = R.attr.ic_action_trending_up; + scoreDrawable = R.drawable.baseline_trending_up_24; else if (article.score < 0) - scoreAttr = R.attr.ic_action_trending_down; - - m_activity.getTheme().resolveAttribute(scoreAttr, tv, true); + scoreDrawable = R.drawable.baseline_trending_down_24; - holder.scoreView.setIconResource(tv.resourceId); + holder.scoreView.setIconResource(scoreDrawable); if (article.score > Article.SCORE_HIGH) holder.scoreView.setIconTint(ColorStateList.valueOf(tvTertiary.data)); diff --git a/org.fox.ttrss/src/main/res/layout/activity_gallery.xml b/org.fox.ttrss/src/main/res/layout/activity_gallery.xml index f44bb74b..b0f67761 100644 --- a/org.fox.ttrss/src/main/res/layout/activity_gallery.xml +++ b/org.fox.ttrss/src/main/res/layout/activity_gallery.xml @@ -17,7 +17,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" - app:icon="?ic_dots_vertical" + app:icon="@drawable/baseline_more_vert_24" android:layout_alignParentRight="true" android:layout_marginTop="48dp" app:iconTint="?colorTertiary" /> diff --git a/org.fox.ttrss/src/main/res/layout/feeds_goback.xml b/org.fox.ttrss/src/main/res/layout/feeds_goback.xml index f4c580a3..75ba8fe1 100755 --- a/org.fox.ttrss/src/main/res/layout/feeds_goback.xml +++ b/org.fox.ttrss/src/main/res/layout/feeds_goback.xml @@ -20,7 +20,7 @@ android:layout_height="21dp" android:layout_weight="0" android:scaleType="fitXY" - android:src="?ic_go_back" + android:src="@drawable/baseline_arrow_back_24" app:tint="?colorTertiary" /> + app:icon="@drawable/baseline_trending_flat_24" /> + app:icon="@drawable/baseline_attachment_24" /> + app:icon="@drawable/baseline_star_outline_24" /> + app:icon="@drawable/baseline_more_vert_24" /> diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact.xml index 352aad91..7090668a 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact.xml @@ -103,6 +103,6 @@ android:layout_gravity="end" android:layout_height="24dp" android:layout_weight="0.5" - app:icon="?ic_star_outline" /> + app:icon="@drawable/baseline_star_outline_24" /> \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml index f6483350..72ae99b8 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml @@ -104,6 +104,6 @@ android:layout_gravity="end" android:layout_height="24dp" android:layout_weight="0.5" - app:icon="?ic_star_outline" /> + app:icon="@drawable/baseline_star_outline_24" /> \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml index 06813e04..b2b3a21e 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml @@ -105,6 +105,6 @@ android:layout_gravity="end" android:layout_height="24dp" android:layout_weight="0.5" - app:icon="?ic_star_outline" /> + app:icon="@drawable/baseline_star_outline_24" /> \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_unread.xml index 6aa1bdcd..2fbbe062 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_unread.xml @@ -105,6 +105,6 @@ android:layout_gravity="end" android:layout_height="24dp" android:layout_weight="0.5" - app:icon="?ic_star_outline" /> + app:icon="@drawable/baseline_star_outline_24" /> \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml index 74f73e14..3365f476 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml @@ -212,7 +212,7 @@ android:layout_weight="0" android:paddingLeft="4dp" android:paddingRight="4dp" - app:icon="?ic_action_trending_flat" /> + app:icon="@drawable/baseline_trending_flat_24" /> + app:icon="@drawable/baseline_attachment_24" /> + app:icon="@drawable/baseline_star_outline_24" /> true @style/AppPreferenceThemeOverlay - @drawable/baseline_check_box_24 - @drawable/baseline_star_24 - @drawable/baseline_star_outline_24 - @drawable/baseline_share_24 - @drawable/baseline_inbox_24 - @drawable/baseline_arrow_back_24 - @drawable/baseline_settings_24 - @drawable/baseline_filter_alt_24 - @drawable/baseline_cloud_download_24 - @drawable/baseline_cloud_upload_24 - @drawable/baseline_archive_24 - @drawable/baseline_local_fire_department_24 - @drawable/baseline_restore_24 - @drawable/baseline_folder_open_24 - @drawable/baseline_more_vert_24 - @drawable/outline_more_24 - @drawable/baseline_attachment_24 - @drawable/baseline_attach_file_24 - @drawable/baseline_trending_up_24 - @drawable/baseline_trending_flat_24 - @drawable/baseline_trending_down_24 - @color/md_theme_primary @color/md_theme_onPrimary @color/md_theme_primaryContainer diff --git a/org.fox.ttrss/src/main/res/values/attrs.xml b/org.fox.ttrss/src/main/res/values/attrs.xml index e33d1c8a..55344e51 100755 --- a/org.fox.ttrss/src/main/res/values/attrs.xml +++ b/org.fox.ttrss/src/main/res/values/attrs.xml @@ -1,28 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.fox.ttrss/src/main/res/values/themes.xml b/org.fox.ttrss/src/main/res/values/themes.xml index 9969617c..15be8c17 100644 --- a/org.fox.ttrss/src/main/res/values/themes.xml +++ b/org.fox.ttrss/src/main/res/values/themes.xml @@ -4,28 +4,6 @@ true @style/AppPreferenceThemeOverlay - @drawable/baseline_check_box_24 - @drawable/baseline_star_24 - @drawable/baseline_star_outline_24 - @drawable/baseline_share_24 - @drawable/baseline_inbox_24 - @drawable/baseline_arrow_back_24 - @drawable/baseline_settings_24 - @drawable/baseline_filter_alt_24 - @drawable/baseline_cloud_download_24 - @drawable/baseline_cloud_upload_24 - @drawable/baseline_archive_24 - @drawable/baseline_local_fire_department_24 - @drawable/baseline_restore_24 - @drawable/baseline_folder_open_24 - @drawable/baseline_more_vert_24 - @drawable/outline_more_24 - @drawable/baseline_attachment_24 - @drawable/baseline_attach_file_24 - @drawable/baseline_trending_up_24 - @drawable/baseline_trending_flat_24 - @drawable/baseline_trending_down_24 - @color/md_theme_primary @color/md_theme_onPrimary @color/md_theme_primaryContainer -- cgit v1.2.3-54-g00ecf