From ced80be1aea975b59db5a0e6dd14acb054e7910e Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 16 Sep 2012 13:25:28 +0400 Subject: initial --- res/layout/feeds.xml | 27 +++++++++++++++++++++++++++ res/layout/headlines.xml | 27 +++++++++++++++++++++++++++ res/layout/online.xml | 21 +++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 res/layout/feeds.xml create mode 100644 res/layout/headlines.xml create mode 100644 res/layout/online.xml (limited to 'res/layout') diff --git a/res/layout/feeds.xml b/res/layout/feeds.xml new file mode 100644 index 00000000..c3f7be59 --- /dev/null +++ b/res/layout/feeds.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/headlines.xml b/res/layout/headlines.xml new file mode 100644 index 00000000..60c24b91 --- /dev/null +++ b/res/layout/headlines.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/online.xml b/res/layout/online.xml new file mode 100644 index 00000000..d94aa147 --- /dev/null +++ b/res/layout/online.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file -- cgit v1.2.3-54-g00ecf From c52ea94c4418626847c19bb6346a1e81d536e5ec Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 16 Sep 2012 19:25:47 +0400 Subject: more experimental stuff --- res/layout/headlines.xml | 2 +- res/menu/main_menu.xml | 43 ++++++++- res/menu/online_menu.xml | 29 ------ src/org/fox/ttrss/ArticlePager.java | 33 +++++-- src/org/fox/ttrss/FeedsActivity.java | 79 +++++++++++----- src/org/fox/ttrss/HeadlinesActivity.java | 9 +- src/org/fox/ttrss/HeadlinesEventListener.java | 2 +- src/org/fox/ttrss/OnlineActivity.java | 125 +++++++++++++++++++++++++- 8 files changed, 249 insertions(+), 73 deletions(-) delete mode 100644 res/menu/online_menu.xml (limited to 'res/layout') diff --git a/res/layout/headlines.xml b/res/layout/headlines.xml index 60c24b91..c3027217 100644 --- a/res/layout/headlines.xml +++ b/res/layout/headlines.xml @@ -19,7 +19,7 @@ diff --git a/res/menu/main_menu.xml b/res/menu/main_menu.xml index 68625729..4bacf2f9 100644 --- a/res/menu/main_menu.xml +++ b/res/menu/main_menu.xml @@ -2,6 +2,41 @@ + + + + + + + + + + + + + - + android:title="@string/close_feed"/> --> @@ -105,11 +140,11 @@ android:showAsAction="" android:title="@string/article_set_note"/> - + android:title="@string/close_article"/> --> diff --git a/res/menu/online_menu.xml b/res/menu/online_menu.xml deleted file mode 100644 index d299eb6f..00000000 --- a/res/menu/online_menu.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/org/fox/ttrss/ArticlePager.java b/src/org/fox/ttrss/ArticlePager.java index 9818e08c..dcd5adb1 100644 --- a/src/org/fox/ttrss/ArticlePager.java +++ b/src/org/fox/ttrss/ArticlePager.java @@ -1,6 +1,7 @@ package org.fox.ttrss; import org.fox.ttrss.types.Article; +import org.fox.ttrss.types.ArticleList; import android.app.Activity; import android.os.Bundle; @@ -17,8 +18,8 @@ public class ArticlePager extends Fragment { private final String TAG = "ArticlePager"; private PagerAdapter m_adapter; private HeadlinesEventListener m_onlineServices; - private HeadlinesFragment m_hf; private Article m_article; + private ArticleList m_articles; private class PagerAdapter extends FragmentStatePagerAdapter { @@ -28,7 +29,7 @@ public class ArticlePager extends Fragment { @Override public Fragment getItem(int position) { - Article article = m_hf.getArticleAtPosition(position); + Article article = m_articles.get(position); if (article != null) { ArticleFragment af = new ArticleFragment(article); @@ -39,7 +40,7 @@ public class ArticlePager extends Fragment { @Override public int getCount() { - return m_hf.getAllArticles().size(); + return m_articles.size(); } } @@ -48,21 +49,27 @@ public class ArticlePager extends Fragment { super(); } - public ArticlePager(Article article) { + public ArticlePager(Article article, ArticleList articles) { super(); m_article = article; + m_articles = articles; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.article_pager, container, false); + if (savedInstanceState != null) { + m_articles = savedInstanceState.getParcelable("articles"); + m_article = savedInstanceState.getParcelable("article"); + } + m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager()); ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager); - int position = m_hf.getArticlePosition(m_article); + int position = m_articles.indexOf(m_article); pager.setAdapter(m_adapter); pager.setCurrentItem(position); @@ -78,7 +85,7 @@ public class ArticlePager extends Fragment { @Override public void onPageSelected(int position) { - Article article = m_hf.getArticleAtPosition(position); + Article article = m_articles.get(position); if (article != null) { if (article.unread) { @@ -90,7 +97,8 @@ public class ArticlePager extends Fragment { //Log.d(TAG, "Page #" + position + "/" + m_adapter.getCount()); if (position == m_adapter.getCount() - 5) { - m_hf.refresh(true); + // FIXME load more articles somehow + //m_hf.refresh(true); m_adapter.notifyDataSetChanged(); } } @@ -100,12 +108,21 @@ public class ArticlePager extends Fragment { return view; } + @Override + public void onSaveInstanceState(Bundle out) { + super.onSaveInstanceState(out); + + out.putParcelable("articles", m_articles); + out.putParcelable("article", m_article); + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); - m_hf = (HeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentByTag(CommonActivity.FRAG_HEADLINES); m_onlineServices = (HeadlinesEventListener)activity; + ((OnlineActivity)getActivity()).initMenu(); + } } diff --git a/src/org/fox/ttrss/FeedsActivity.java b/src/org/fox/ttrss/FeedsActivity.java index 5cc1d176..0a372aa8 100644 --- a/src/org/fox/ttrss/FeedsActivity.java +++ b/src/org/fox/ttrss/FeedsActivity.java @@ -25,9 +25,6 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe protected SharedPreferences m_prefs; - private boolean m_unreadOnly = true; - private boolean m_unreadArticlesOnly = true; - @Override public void onCreate(Bundle savedInstanceState) { m_prefs = PreferenceManager @@ -55,36 +52,46 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe } ft.commit(); - } else if (isSmallScreen()) { + } /* else if (isSmallScreen()) { Fragment frag = getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); if (frag != null) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.remove(frag); ft.commit(); - } - } - } - - public boolean getUnreadOnly() { - return m_unreadOnly; + } + } */ } @Override protected void initMenu() { super.initMenu(); - if (m_menu != null) { + + Log.d(TAG, "initMenu: " + m_menu); + + if (m_menu != null && m_sessionId != null) { Fragment ff = getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS); Fragment cf = getSupportFragmentManager().findFragmentByTag(FRAG_CATS); Fragment af = getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + + HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + Log.d(TAG, "ff/cf/af/hf " + ff + " " + cf + " " + af + " " + hf); m_menu.setGroupVisible(R.id.menu_group_feeds, ff != null || cf != null); m_menu.setGroupVisible(R.id.menu_group_article, af != null); - HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - m_menu.setGroupVisible(R.id.menu_group_headlines, hf != null && hf.getSelectedArticles().size() == 0); m_menu.setGroupVisible(R.id.menu_group_headlines_selection, hf != null && hf.getSelectedArticles().size() != 0); + + MenuItem item = m_menu.findItem(R.id.show_feeds); + + if (getUnreadOnly()) { + item.setTitle(R.string.menu_all_feeds); + } else { + item.setTitle(R.string.menu_unread_feeds); + } + } } @@ -127,9 +134,37 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe onCatSelected(cat, m_prefs.getBoolean("browse_cats_like_feeds", false)); } + private void refresh() { + FeedCategoriesFragment cf = (FeedCategoriesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_CATS); + + if (cf != null) { + cf.refresh(false); + } + + FeedsFragment ff = (FeedsFragment) getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS); + + if (ff != null) { + ff.refresh(false); + } + + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + if (hf != null) { + hf.refresh(false); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.show_feeds: + m_unreadOnly = !m_unreadOnly; + initMenu(); + refresh(); + return true; + case R.id.update_feeds: + refresh(); + return true; default: Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId()); return super.onOptionsItemSelected(item); @@ -140,7 +175,7 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe protected void loginSuccess() { setLoadingStatus(R.string.blank, false); findViewById(R.id.loading_container).setVisibility(View.GONE); - + initMenu(); } @Override @@ -154,11 +189,6 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe super.onResume(); } - @Override - public boolean getUnreadArticlesOnly() { - return m_unreadArticlesOnly; - } - @Override public void onArticleListSelectionChange(ArticleList m_selectedArticles) { initMenu(); @@ -175,10 +205,11 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); - Fragment frag = new ArticlePager(article); + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + Fragment frag = new ArticlePager(article, hf.getAllArticles()); - ft.hide(getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES)); - ft.add(R.id.feeds_fragment, frag, FRAG_ARTICLE); + ft.replace(R.id.feeds_fragment, frag, FRAG_ARTICLE); ft.addToBackStack(null); ft.commit(); @@ -199,8 +230,8 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe startActivityForResult(intent, 0); } } else { - HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - if (hf != null) hf.setActiveArticle(article); + /* HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + if (hf != null) hf.setActiveArticle(article); */ } } diff --git a/src/org/fox/ttrss/HeadlinesActivity.java b/src/org/fox/ttrss/HeadlinesActivity.java index dd2a5a8c..1b9ead10 100644 --- a/src/org/fox/ttrss/HeadlinesActivity.java +++ b/src/org/fox/ttrss/HeadlinesActivity.java @@ -64,7 +64,7 @@ private final String TAG = this.getClass().getSimpleName(); ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); - ArticlePager af = new ArticlePager(article); + ArticlePager af = new ArticlePager(article, hf.getAllArticles()); ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); } @@ -80,6 +80,7 @@ private final String TAG = this.getClass().getSimpleName(); setLoadingStatus(R.string.blank, false); findViewById(R.id.loading_container).setVisibility(View.GONE); + initMenu(); } @Override @@ -114,7 +115,7 @@ private final String TAG = this.getClass().getSimpleName(); protected void initMenu() { super.initMenu(); - if (m_menu != null) { + if (m_menu != null && m_sessionId != null) { m_menu.setGroupVisible(R.id.menu_group_feeds, false); HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); @@ -145,7 +146,9 @@ private final String TAG = this.getClass().getSimpleName(); FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); - Fragment frag = new ArticlePager(article); + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + Fragment frag = new ArticlePager(article, hf.getAllArticles()); ft.replace(R.id.article_fragment, frag, FRAG_ARTICLE); //ft.addToBackStack(null); diff --git a/src/org/fox/ttrss/HeadlinesEventListener.java b/src/org/fox/ttrss/HeadlinesEventListener.java index 14f0ef92..024fbfad 100644 --- a/src/org/fox/ttrss/HeadlinesEventListener.java +++ b/src/org/fox/ttrss/HeadlinesEventListener.java @@ -9,6 +9,6 @@ public interface HeadlinesEventListener { void onArticleListSelectionChange(ArticleList m_selectedArticles); void onArticleSelected(Article article); void saveArticleUnread(Article article); - void onArticleSelected(Article article, boolean b); + void onArticleSelected(Article article, boolean open); } diff --git a/src/org/fox/ttrss/OnlineActivity.java b/src/org/fox/ttrss/OnlineActivity.java index 71c4a278..9b61b281 100644 --- a/src/org/fox/ttrss/OnlineActivity.java +++ b/src/org/fox/ttrss/OnlineActivity.java @@ -15,6 +15,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.FragmentTransaction; @@ -24,6 +25,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; +import android.widget.EditText; import android.widget.SearchView; public class OnlineActivity extends CommonActivity { @@ -33,6 +35,9 @@ public class OnlineActivity extends CommonActivity { protected SharedPreferences m_prefs; protected int m_apiLevel = 0; protected Menu m_menu; + + protected boolean m_unreadOnly = true; + protected boolean m_unreadArticlesOnly = true; @Override public void onCreate(Bundle savedInstanceState) { @@ -61,6 +66,9 @@ public class OnlineActivity extends CommonActivity { if (savedInstanceState != null) { m_sessionId = savedInstanceState.getString("sessionId"); m_apiLevel = savedInstanceState.getInt("apiLevel"); + + m_unreadOnly = savedInstanceState.getBoolean("unreadOnly"); + m_unreadArticlesOnly = savedInstanceState.getBoolean("unreadArticlesOnly"); } Log.d(TAG, "m_sessionId=" + m_sessionId); @@ -130,6 +138,8 @@ public class OnlineActivity extends CommonActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { + final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + switch (item.getItemId()) { case R.id.logout: logout(); @@ -137,11 +147,113 @@ public class OnlineActivity extends CommonActivity { case R.id.login: login(); return true; + case R.id.go_offline: + // FIXME go offline + return true; case R.id.preferences: Intent intent = new Intent(OnlineActivity.this, PreferencesActivity.class); startActivityForResult(intent, 0); return true; + case R.id.search: + if (hf != null && isCompatMode()) { + Dialog dialog = new Dialog(this); + + final EditText edit = new EditText(this); + + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.search) + .setPositiveButton(getString(R.string.search), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + String query = edit.getText().toString().trim(); + + hf.setSearchQuery(query); + + } + }) + .setNegativeButton(getString(R.string.cancel), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + // + + } + }).setView(edit); + + dialog = builder.create(); + dialog.show(); + } + return true; + case R.id.headlines_mark_as_read: + if (hf != null) { + ArticleList articles = hf.getUnreadArticles(); + + for (Article a : articles) + a.unread = false; + + ApiRequest req = new ApiRequest(getApplicationContext()) { + protected void onPostExecute(JsonElement result) { + hf.refresh(false); + } + }; + + final String articleIds = articlesToIdString(articles); + + @SuppressWarnings("serial") + HashMap map = new HashMap() { + { + put("sid", m_sessionId); + put("op", "updateArticle"); + put("article_ids", articleIds); + put("mode", "0"); + put("field", "2"); + } + }; + req.execute(map); + } + return true; + case R.id.headlines_select: + if (hf != null) { + Dialog dialog = new Dialog(this); + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.headlines_select_dialog) + .setSingleChoiceItems( + new String[] { + getString(R.string.headlines_select_all), + getString(R.string.headlines_select_unread), + getString(R.string.headlines_select_none) }, + 0, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, + int which) { + switch (which) { + case 0: + hf.setSelection(HeadlinesFragment.ArticlesSelection.ALL); + break; + case 1: + hf.setSelection(HeadlinesFragment.ArticlesSelection.UNREAD); + break; + case 2: + hf.setSelection(HeadlinesFragment.ArticlesSelection.NONE); + break; + } + dialog.cancel(); + initMenu(); + } + }); + + dialog = builder.create(); + dialog.show(); + } + return true; default: Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId()); return super.onOptionsItemSelected(item); @@ -161,6 +273,14 @@ public class OnlineActivity extends CommonActivity { m_sessionId = null; initMenu(); } + + public boolean getUnreadArticlesOnly() { + return m_unreadArticlesOnly; + } + + public boolean getUnreadOnly() { + return m_unreadOnly; + } @Override public void onSaveInstanceState(Bundle out) { @@ -168,6 +288,8 @@ public class OnlineActivity extends CommonActivity { out.putString("sessionId", m_sessionId); out.putInt("apiLevel", m_apiLevel); + out.putBoolean("unreadOnly", m_unreadOnly); + out.putBoolean("unreadArticlesOnly", m_unreadArticlesOnly); } @Override @@ -415,9 +537,6 @@ public class OnlineActivity extends CommonActivity { m_menu.findItem(R.id.set_labels).setEnabled(m_apiLevel >= 1); m_menu.findItem(R.id.article_set_note).setEnabled(m_apiLevel >= 1); - - m_menu.findItem(R.id.close_feed).setVisible(!isSmallScreen()); - m_menu.findItem(R.id.close_article).setVisible(!isSmallScreen()); MenuItem search = m_menu.findItem(R.id.search); search.setEnabled(m_apiLevel >= 2); -- cgit v1.2.3-54-g00ecf From 8e3e5add776ddb8bcc9e6b349d4eb470e93d15e0 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 17 Sep 2012 18:44:43 +0400 Subject: implement most of offline menus --- res/layout-sw600dp-port/main.xml | 61 ----------- res/layout-sw600dp/main.xml | 55 ---------- res/layout/login.xml | 21 ++++ res/layout/main.xml | 27 ----- res/layout/online.xml | 21 ---- res/menu/offline_menu.xml | 4 +- res/values-v11/style.xml | 2 +- src/org/fox/ttrss/ArticlePager.java | 2 +- src/org/fox/ttrss/HeadlinesEventListener.java | 4 - src/org/fox/ttrss/HeadlinesFragment.java | 3 +- src/org/fox/ttrss/OnlineActivity.java | 2 +- src/org/fox/ttrss/offline/OfflineActivity.java | 112 +++++++++++++++++++-- src/org/fox/ttrss/offline/OfflineArticlePager.java | 4 +- .../fox/ttrss/offline/OfflineDownloadService.java | 2 +- .../fox/ttrss/offline/OfflineFeedsActivity.java | 2 + .../offline/OfflineHeadlinesEventListener.java | 9 -- .../ttrss/offline/OfflineHeadlinesFragment.java | 101 ++++++++++++++----- 17 files changed, 213 insertions(+), 219 deletions(-) delete mode 100644 res/layout-sw600dp-port/main.xml delete mode 100644 res/layout-sw600dp/main.xml create mode 100644 res/layout/login.xml delete mode 100644 res/layout/main.xml delete mode 100644 res/layout/online.xml (limited to 'res/layout') diff --git a/res/layout-sw600dp-port/main.xml b/res/layout-sw600dp-port/main.xml deleted file mode 100644 index 02732ba4..00000000 --- a/res/layout-sw600dp-port/main.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/layout-sw600dp/main.xml b/res/layout-sw600dp/main.xml deleted file mode 100644 index 9df4e048..00000000 --- a/res/layout-sw600dp/main.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/layout/login.xml b/res/layout/login.xml new file mode 100644 index 00000000..d144df96 --- /dev/null +++ b/res/layout/login.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/main.xml b/res/layout/main.xml deleted file mode 100644 index eb06058c..00000000 --- a/res/layout/main.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/res/layout/online.xml b/res/layout/online.xml deleted file mode 100644 index d94aa147..00000000 --- a/res/layout/online.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/res/menu/offline_menu.xml b/res/menu/offline_menu.xml index ad756aac..069625c5 100644 --- a/res/menu/offline_menu.xml +++ b/res/menu/offline_menu.xml @@ -23,11 +23,11 @@ android:title="@string/menu_all_feeds"/> - + android:visible="false"/> --> @drawable/ics_divider_vertical #303030 @drawable/headlines_dark - @android:color/transparent + @drawable/headlines_dark @android:color/black @drawable/headline_row_selected_dark @color/ics_cyan diff --git a/src/org/fox/ttrss/ArticlePager.java b/src/org/fox/ttrss/ArticlePager.java index a7ecaaa5..a0085989 100644 --- a/src/org/fox/ttrss/ArticlePager.java +++ b/src/org/fox/ttrss/ArticlePager.java @@ -104,7 +104,7 @@ public class ArticlePager extends Fragment { if (article.unread) { article.unread = false; - m_onlineServices.saveArticleUnread(article); + m_activity.saveArticleUnread(article); } m_onlineServices.onArticleSelected(article, false); diff --git a/src/org/fox/ttrss/HeadlinesEventListener.java b/src/org/fox/ttrss/HeadlinesEventListener.java index 024fbfad..d286df17 100644 --- a/src/org/fox/ttrss/HeadlinesEventListener.java +++ b/src/org/fox/ttrss/HeadlinesEventListener.java @@ -4,11 +4,7 @@ import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; public interface HeadlinesEventListener { - - boolean getUnreadArticlesOnly(); void onArticleListSelectionChange(ArticleList m_selectedArticles); void onArticleSelected(Article article); - void saveArticleUnread(Article article); void onArticleSelected(Article article, boolean open); - } diff --git a/src/org/fox/ttrss/HeadlinesFragment.java b/src/org/fox/ttrss/HeadlinesFragment.java index 031321eb..fae19703 100644 --- a/src/org/fox/ttrss/HeadlinesFragment.java +++ b/src/org/fox/ttrss/HeadlinesFragment.java @@ -78,7 +78,6 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, private ArticleList m_articles = TinyApplication.getInstance().m_loadedArticles; private ArticleList m_selectedArticles = new ArticleList(); private HeadlinesEventListener m_listener; - private OnlineActivity m_activity; private ImageGetter m_dummyGetter = new ImageGetter() { @@ -363,7 +362,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, }; final String sessionId = m_activity.getSessionId(); - final boolean showUnread = m_listener.getUnreadArticlesOnly(); + final boolean showUnread = m_activity.getUnreadArticlesOnly(); final boolean isCat = m_feed.is_cat; int skip = 0; diff --git a/src/org/fox/ttrss/OnlineActivity.java b/src/org/fox/ttrss/OnlineActivity.java index 6c65c43b..e6053aa0 100644 --- a/src/org/fox/ttrss/OnlineActivity.java +++ b/src/org/fox/ttrss/OnlineActivity.java @@ -139,7 +139,7 @@ public class OnlineActivity extends CommonActivity { Log.d(TAG, "m_isOffline=" + isOffline); - setContentView(R.layout.online); + setContentView(R.layout.login); if (isOffline) { switchOfflineSuccess(); diff --git a/src/org/fox/ttrss/offline/OfflineActivity.java b/src/org/fox/ttrss/offline/OfflineActivity.java index e2ffdb1e..78aca34b 100644 --- a/src/org/fox/ttrss/offline/OfflineActivity.java +++ b/src/org/fox/ttrss/offline/OfflineActivity.java @@ -1,7 +1,5 @@ package org.fox.ttrss.offline; -import javax.crypto.spec.OAEPParameterSpec; - import org.fox.ttrss.CommonActivity; import org.fox.ttrss.PreferencesActivity; import org.fox.ttrss.R; @@ -10,20 +8,23 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; -import android.content.DialogInterface.OnClickListener; import android.database.Cursor; import android.database.sqlite.SQLiteStatement; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BaseColumns; import android.util.Log; +import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.EditText; +import android.widget.SearchView; +import android.widget.ShareActionProvider; public class OfflineActivity extends CommonActivity { private final String TAG = this.getClass().getSimpleName(); @@ -31,6 +32,38 @@ public class OfflineActivity extends CommonActivity { protected SharedPreferences m_prefs; protected Menu m_menu; protected boolean m_unreadOnly; + + private ActionMode m_headlinesActionMode; + private HeadlinesActionModeCallback m_headlinesActionModeCallback; + + private class HeadlinesActionModeCallback implements ActionMode.Callback { + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + deselectAllArticles(); + m_headlinesActionMode = null; + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.headlines_action_menu, menu); + + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + onOptionsItemSelected(item); + return false; + } + }; @Override public void onCreate(Bundle savedInstanceState) { @@ -45,7 +78,7 @@ public class OfflineActivity extends CommonActivity { super.onCreate(savedInstanceState); - setContentView(R.layout.online); + setContentView(R.layout.login); setLoadingStatus(R.string.blank, false); findViewById(R.id.loading_container).setVisibility(View.GONE); @@ -67,6 +100,11 @@ public class OfflineActivity extends CommonActivity { if (savedInstanceState != null) { m_unreadOnly = savedInstanceState.getBoolean("unreadOnly"); } + + if (!isCompatMode()) { + m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); + } + } @Override @@ -198,7 +236,7 @@ public class OfflineActivity extends CommonActivity { } return true; case R.id.share_article: - if (oap != null && android.os.Build.VERSION.SDK_INT < 14) { + if (android.os.Build.VERSION.SDK_INT < 14 && oap != null && android.os.Build.VERSION.SDK_INT < 14) { int articleId = oap.getSelectedArticleId(); shareArticle(articleId); @@ -326,6 +364,68 @@ public class OfflineActivity extends CommonActivity { m_menu.setGroupVisible(R.id.menu_group_headlines_selection, false); m_menu.setGroupVisible(R.id.menu_group_article, false); m_menu.setGroupVisible(R.id.menu_group_feeds, false); + + if (android.os.Build.VERSION.SDK_INT >= 14) { + ShareActionProvider shareProvider = (ShareActionProvider) m_menu.findItem(R.id.share_article).getActionProvider(); + + OfflineArticlePager af = (OfflineArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + + if (af != null) { + Log.d(TAG, "setting up share provider"); + shareProvider.setShareIntent(getShareIntent(getArticleById(af.getSelectedArticleId()))); + + if (!isSmallScreen()) { + m_menu.findItem(R.id.share_article).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + } + } + } + + if (!isCompatMode()) { + MenuItem search = m_menu.findItem(R.id.search); + + OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + + if (hf != null) { + if (hf.getSelectedArticleCount() > 0 && m_headlinesActionMode == null) { + m_headlinesActionMode = startActionMode(m_headlinesActionModeCallback); + } else if (hf.getSelectedArticleCount() == 0 && m_headlinesActionMode != null) { + m_headlinesActionMode.finish(); + } + } + + SearchView searchView = (SearchView) search.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + private String query = ""; + + @Override + public boolean onQueryTextSubmit(String query) { + OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getSupportFragmentManager() + .findFragmentByTag(FRAG_HEADLINES); + + if (frag != null) { + frag.setSearchQuery(query); + this.query = query; + } + + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (newText.equals("") && !newText.equals(this.query)) { + OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getSupportFragmentManager() + .findFragmentByTag(FRAG_HEADLINES); + + if (frag != null) { + frag.setSearchQuery(newText); + this.query = newText; + } + } + + return false; + } + }); + } } } @@ -398,7 +498,7 @@ public class OfflineActivity extends CommonActivity { Intent intent = getShareIntent(article); startActivity(Intent.createChooser(intent, - getString(R.id.share_article))); + getString(R.string.share_article))); } } diff --git a/src/org/fox/ttrss/offline/OfflineArticlePager.java b/src/org/fox/ttrss/offline/OfflineArticlePager.java index 0516d897..b1e04993 100644 --- a/src/org/fox/ttrss/offline/OfflineArticlePager.java +++ b/src/org/fox/ttrss/offline/OfflineArticlePager.java @@ -38,11 +38,11 @@ public class OfflineArticlePager extends Fragment { } if (m_searchQuery.equals("")) { - return m_listener.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", + return m_activity.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", new String[] { "articles."+BaseColumns._ID, "feeds.title AS feed_title" }, feedClause, new String[] { String.valueOf(m_feedId) }, null, null, "updated DESC"); } else { - return m_listener.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", + return m_activity.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", new String[] { "articles."+BaseColumns._ID }, feedClause + " AND (articles.title LIKE '%' || ? || '%' OR content LIKE '%' || ? || '%')", new String[] { String.valueOf(m_feedId), m_searchQuery, m_searchQuery }, null, null, "updated DESC"); diff --git a/src/org/fox/ttrss/offline/OfflineDownloadService.java b/src/org/fox/ttrss/offline/OfflineDownloadService.java index 28b803e4..bace2709 100644 --- a/src/org/fox/ttrss/offline/OfflineDownloadService.java +++ b/src/org/fox/ttrss/offline/OfflineDownloadService.java @@ -47,7 +47,7 @@ public class OfflineDownloadService extends Service { public static final String INTENT_ACTION_CANCEL = "org.fox.ttrss.intent.action.Cancel"; private static final int OFFLINE_SYNC_SEQ = 40; - private static final int OFFLINE_SYNC_MAX = 120 /*500*/; + private static final int OFFLINE_SYNC_MAX = 500; private SQLiteDatabase m_writableDb; private SQLiteDatabase m_readableDb; diff --git a/src/org/fox/ttrss/offline/OfflineFeedsActivity.java b/src/org/fox/ttrss/offline/OfflineFeedsActivity.java index 61c13710..075c372a 100644 --- a/src/org/fox/ttrss/offline/OfflineFeedsActivity.java +++ b/src/org/fox/ttrss/offline/OfflineFeedsActivity.java @@ -228,6 +228,8 @@ public class OfflineFeedsActivity extends OfflineActivity implements OfflineHead } else { refresh(); } + + initMenu(); } diff --git a/src/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java b/src/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java index 392f59ec..aa1ae46f 100644 --- a/src/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java +++ b/src/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java @@ -3,15 +3,6 @@ package org.fox.ttrss.offline; import android.database.sqlite.SQLiteDatabase; public interface OfflineHeadlinesEventListener { - void onArticleSelected(int articleId, boolean open); void onArticleSelected(int articleId); - - SQLiteDatabase getReadableDb(); - SQLiteDatabase getWritableDb(); - boolean isSmallScreen(); - boolean isPortrait(); - void initMenu(); - - } diff --git a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java index 6621105b..4c0ffca8 100644 --- a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java +++ b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java @@ -59,6 +59,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis private ArticleListAdapter m_adapter; private OfflineHeadlinesEventListener m_listener; + private OfflineActivity m_activity; private ImageGetter m_dummyGetter = new ImageGetter() { @@ -86,7 +87,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis } public int getSelectedArticleCount() { - Cursor c = m_listener.getReadableDb().query("articles", + Cursor c = m_activity.getReadableDb().query("articles", new String[] { "COUNT(*)" }, "selected = 1", null, null, null, null); c.moveToFirst(); int selected = c.getInt(0); @@ -101,38 +102,82 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis .getMenuInfo(); switch (item.getItemId()) { - case R.id.set_labels: - if (true) { - } - return true; - case R.id.article_set_note: - if (true) { - } - return true; - case R.id.article_link_copy: if (true) { + int articleId = getArticleIdAtPosition(info.position); + + Cursor article = m_activity.getArticleById(articleId); + + if (article != null) { + m_activity.copyToClipboard(article.getString(article.getColumnIndex("link"))); + article.close(); + } } return true; case R.id.selection_toggle_marked: - if (true) { + if (getSelectedArticleCount() > 0) { + SQLiteStatement stmt = m_activity.getWritableDb() + .compileStatement( + "UPDATE articles SET marked = NOT marked WHERE selected = 1"); + stmt.execute(); + stmt.close(); + } else { + int articleId = getArticleIdAtPosition(info.position); + + SQLiteStatement stmt = m_activity.getWritableDb().compileStatement( + "UPDATE articles SET marked = NOT marked WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); } + refresh(); return true; case R.id.selection_toggle_published: - if (true) { + if (getSelectedArticleCount() > 0) { + SQLiteStatement stmt = m_activity.getWritableDb() + .compileStatement( + "UPDATE articles SET published = NOT published WHERE selected = 1"); + stmt.execute(); + stmt.close(); + } else { + int articleId = getArticleIdAtPosition(info.position); + + SQLiteStatement stmt = m_activity.getWritableDb().compileStatement( + "UPDATE articles SET published = NOT published WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); } + refresh(); return true; case R.id.selection_toggle_unread: - if (true) { + if (getSelectedArticleCount() > 0) { + SQLiteStatement stmt = m_activity.getWritableDb() + .compileStatement( + "UPDATE articles SET unread = NOT unread WHERE selected = 1"); + stmt.execute(); + stmt.close(); + } else { + int articleId = getArticleIdAtPosition(info.position); + + SQLiteStatement stmt = m_activity.getWritableDb().compileStatement( + "UPDATE articles SET unread = NOT unread WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); } + refresh(); return true; case R.id.share_article: if (true) { + int articleId = getArticleIdAtPosition(info.position); + m_activity.shareArticle(articleId); } return true; - case R.id.catchup_above: - if (true) { - } + case R.id.catchup_above: return true; default: Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); @@ -155,6 +200,9 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis menu.setHeaderTitle(c.getString(c.getColumnIndex("title"))); //c.close(); menu.setGroupVisible(R.id.menu_group_single_article, true); + + menu.findItem(R.id.set_labels).setVisible(false); + menu.findItem(R.id.article_set_note).setVisible(false); } super.onCreateContextMenu(menu, v, menuInfo); @@ -189,7 +237,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis m_searchQuery = (String) savedInstanceState.getCharSequence("searchQuery"); m_feedIsCat = savedInstanceState.getBoolean("feedIsCat"); } else { - m_listener.getWritableDb().execSQL("UPDATE articles SET selected = 0 "); + m_activity.getWritableDb().execSQL("UPDATE articles SET selected = 0 "); } View view = inflater.inflate(R.layout.headlines_fragment, container, false); @@ -205,7 +253,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis list.setEmptyView(view.findViewById(R.id.no_headlines)); registerForContextMenu(list); - if (m_listener.isSmallScreen() || m_listener.isPortrait()) + if (m_activity.isSmallScreen() || m_activity.isPortrait()) view.findViewById(R.id.headlines_fragment).setPadding(0, 0, 0, 0); getActivity().setProgressBarIndeterminateVisibility(false); @@ -223,11 +271,11 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis } if (m_searchQuery.equals("")) { - return m_listener.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", + return m_activity.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", new String[] { "articles.*", "feeds.title AS feed_title" }, feedClause, new String[] { String.valueOf(m_feedId) }, null, null, "updated DESC"); } else { - return m_listener.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", + return m_activity.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")", new String[] { "articles.*", "feeds.title AS feed_title" }, feedClause + " AND (articles.title LIKE '%' || ? || '%' OR content LIKE '%' || ? || '%')", new String[] { String.valueOf(m_feedId), m_searchQuery, m_searchQuery }, null, null, "updated DESC"); @@ -237,7 +285,8 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis @Override public void onAttach(Activity activity) { super.onAttach(activity); - m_listener = (OfflineHeadlinesEventListener)activity; + m_listener = (OfflineHeadlinesEventListener) activity; + m_activity = (OfflineActivity) activity; m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); m_combinedMode = m_prefs.getBoolean("combined_mode", false); @@ -254,7 +303,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis int articleId = cursor.getInt(0); - if (!m_listener.isSmallScreen()) { + if (!m_activity.isSmallScreen()) { m_activeArticleId = articleId; } @@ -391,7 +440,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis @Override public void onClick(View v) { - SQLiteStatement stmtUpdate = m_listener.getWritableDb().compileStatement("UPDATE articles SET marked = NOT marked " + + SQLiteStatement stmtUpdate = m_activity.getWritableDb().compileStatement("UPDATE articles SET marked = NOT marked " + "WHERE " + BaseColumns._ID + " = ?"); stmtUpdate.bindLong(1, articleId); @@ -412,7 +461,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis @Override public void onClick(View v) { - SQLiteStatement stmtUpdate = m_listener.getWritableDb().compileStatement("UPDATE articles SET published = NOT published " + + SQLiteStatement stmtUpdate = m_activity.getWritableDb().compileStatement("UPDATE articles SET published = NOT published " + "WHERE " + BaseColumns._ID + " = ?"); stmtUpdate.bindLong(1, articleId); @@ -490,7 +539,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis public void onClick(View view) { CheckBox cb = (CheckBox)view; - SQLiteStatement stmtUpdate = m_listener.getWritableDb().compileStatement("UPDATE articles SET selected = ? " + + SQLiteStatement stmtUpdate = m_activity.getWritableDb().compileStatement("UPDATE articles SET selected = ? " + "WHERE " + BaseColumns._ID + " = ?"); stmtUpdate.bindLong(1, cb.isChecked() ? 1 : 0); @@ -500,7 +549,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis refresh(); - m_listener.initMenu(); + m_activity.initMenu(); } }); -- cgit v1.2.3-54-g00ecf From c9c3aa3d36064fde040ed56cf438da69f098ae2b Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 18 Sep 2012 18:36:11 +0400 Subject: several android lint fixes --- AndroidManifest.xml | 5 +++++ res/layout-port/headlines_row.xml | 12 +++--------- res/layout-port/headlines_row_selected.xml | 6 ------ res/layout-port/headlines_row_unread.xml | 6 ------ res/layout/article_fragment.xml | 16 +++------------- res/layout/headlines_row_loadmore.xml | 13 ++----------- res/layout/login.xml | 11 ++--------- 7 files changed, 15 insertions(+), 54 deletions(-) (limited to 'res/layout') diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8b178bac..1f72589d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -43,6 +43,11 @@ android:label="@string/app_name" > + + + diff --git a/res/layout-port/headlines_row.xml b/res/layout-port/headlines_row.xml index 8f65f7ec..568078a6 100644 --- a/res/layout-port/headlines_row.xml +++ b/res/layout-port/headlines_row.xml @@ -7,15 +7,10 @@ android:gravity="center_vertical" android:orientation="vertical" > - - @@ -39,7 +34,7 @@ @@ -100,7 +95,6 @@ android:src="@drawable/ic_rss_bw" /> - - - - - - - - - + android:orientation="vertical" > - - + \ No newline at end of file diff --git a/res/layout/headlines_row_loadmore.xml b/res/layout/headlines_row_loadmore.xml index d2eda7a6..ab7adc87 100644 --- a/res/layout/headlines_row_loadmore.xml +++ b/res/layout/headlines_row_loadmore.xml @@ -4,18 +4,10 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?headlineNormalBackground" - android:gravity="center_vertical" + android:gravity="center" + android:padding="5dp" android:orientation="horizontal" > - - - \ No newline at end of file diff --git a/res/layout/login.xml b/res/layout/login.xml index d144df96..1ed26afa 100644 --- a/res/layout/login.xml +++ b/res/layout/login.xml @@ -1,21 +1,14 @@ - - - \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 8f88419419f9e12c5c1ad1aeaff10e3c3457f07d Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 19 Sep 2012 09:45:03 +0400 Subject: add enclosure url share button --- res/layout/article_fragment.xml | 7 +++++++ res/values/strings.xml | 1 + src/org/fox/ttrss/ApiRequest.java | 18 ++++++++++-------- src/org/fox/ttrss/ArticleFragment.java | 20 +++++++++++++++++++- src/org/fox/ttrss/OnlineActivity.java | 10 ++++++++++ 5 files changed, 47 insertions(+), 9 deletions(-) (limited to 'res/layout') diff --git a/res/layout/article_fragment.xml b/res/layout/article_fragment.xml index e46de546..cbcf672d 100644 --- a/res/layout/article_fragment.xml +++ b/res/layout/article_fragment.xml @@ -82,6 +82,13 @@ android:layout_weight="0" android:text="@string/attachment_view" /> +