From d8da03554f2c3e1bbbed34758493e5576d9f28ea Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 6 Dec 2011 12:26:19 +0300 Subject: [PATCH] more offline menu-relate stuff --- src/org/fox/ttrss/OfflineActivity.java | 192 ++++++++++++++++-- src/org/fox/ttrss/OfflineFeedsFragment.java | 22 +- .../fox/ttrss/OfflineHeadlinesFragment.java | 44 +++- 3 files changed, 222 insertions(+), 36 deletions(-) diff --git a/src/org/fox/ttrss/OfflineActivity.java b/src/org/fox/ttrss/OfflineActivity.java index 7d9976c8..2edcee85 100644 --- a/src/org/fox/ttrss/OfflineActivity.java +++ b/src/org/fox/ttrss/OfflineActivity.java @@ -35,6 +35,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.LinearLayout; import android.widget.TextView; +import com.google.ads.c; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -58,8 +59,6 @@ public class OfflineActivity extends FragmentActivity { private SQLiteDatabase m_readableDb; private SQLiteDatabase m_writableDb; - /** Called when the activity is first created. */ - public boolean isSmallScreen() { return m_smallScreenMode; } @@ -219,7 +218,7 @@ public class OfflineActivity extends FragmentActivity { public void setUnreadOnly(boolean unread) { m_unreadOnly = unread; - refreshFeeds(); + refreshViews(); /*if (!m_enableCats || m_activeCategory != null ) refreshFeeds(); @@ -295,6 +294,7 @@ public class OfflineActivity extends FragmentActivity { findViewById(R.id.feeds_fragment).setVisibility(View.VISIBLE); //} m_activeFeedId = 0; + refreshViews(); initMainMenu(); } else { @@ -326,20 +326,30 @@ public class OfflineActivity extends FragmentActivity { Cursor article = getArticleById(articleId); - if (article.isFirst()) { + if (article != null) { + shareArticle(article); + article.close(); + } + } + + public void shareArticle(Cursor article) { + + if (article != null) { + String title = article.getString(article.getColumnIndex("title")); + String link = article.getString(article.getColumnIndex("link")); + Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_SUBJECT, article.getString(article.getColumnIndex("title"))); - intent.putExtra(Intent.EXTRA_TEXT, article.getString(article.getColumnIndex("link"))); + intent.putExtra(Intent.EXTRA_SUBJECT, title); + intent.putExtra(Intent.EXTRA_TEXT, link); startActivity(Intent.createChooser(intent, getString(R.id.share_article))); + } - - article.close(); } - - public void updateHeadlines() { + + public void refreshHeadlines() { OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment)getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); if (ohf != null) { @@ -393,7 +403,7 @@ public class OfflineActivity extends FragmentActivity { break; } - updateHeadlines(); + refreshViews(); initMainMenu(); dialog.cancel(); @@ -410,7 +420,7 @@ public class OfflineActivity extends FragmentActivity { stmt.bindLong(1, m_activeFeedId); stmt.execute(); stmt.close(); - updateHeadlines(); + refreshViews(); } return true; case R.id.share_article: @@ -422,13 +432,38 @@ public class OfflineActivity extends FragmentActivity { stmt.bindLong(1, m_selectedArticleId); stmt.execute(); stmt.close(); - updateHeadlines(); + refreshViews(); } return true; case R.id.selection_select_none: + deselectAllArticles(); + return true; case R.id.selection_toggle_unread: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = NOT unread WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + return true; case R.id.selection_toggle_marked: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET marked = NOT marked WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + return true; case R.id.selection_toggle_published: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET published = NOT published WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } return true; case R.id.toggle_published: if (m_selectedArticleId != 0) { @@ -436,12 +471,18 @@ public class OfflineActivity extends FragmentActivity { stmt.bindLong(1, m_selectedArticleId); stmt.execute(); stmt.close(); - updateHeadlines(); + refreshViews(); } return true; case R.id.catchup_above: - if (m_selectedArticleId != 0) { - // + if (m_selectedArticleId != 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = 0 WHERE updated >= " + + "(SELECT updated FROM articles WHERE " + BaseColumns._ID + " = ?) AND feed_id = ?"); + stmt.bindLong(1, m_selectedArticleId); + stmt.bindLong(2, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); } return true; case R.id.set_unread: @@ -450,7 +491,7 @@ public class OfflineActivity extends FragmentActivity { stmt.bindLong(1, m_selectedArticleId); stmt.execute(); stmt.close(); - updateHeadlines(); + refreshViews(); } return true; case R.id.show_feeds: @@ -493,17 +534,17 @@ public class OfflineActivity extends FragmentActivity { m_selectedArticleId = 0; initMainMenu(); - refreshFeeds(); + refreshViews(); } - public int getSelectedArticles() { + public int getSelectedArticleCount() { Cursor c = getReadableDb().query("articles", new String[] { "COUNT(*)" }, "selected = 1", null, null, null, null); c.moveToFirst(); - int unread = c.getInt(0); + int selected = c.getInt(0); c.close(); - return unread; + return selected; } public void initMainMenu() { @@ -531,7 +572,7 @@ public class OfflineActivity extends FragmentActivity { OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment)getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); if (hf != null) { - if (getSelectedArticles() != 0) { + if (getSelectedArticleCount() != 0) { m_menu.setGroupVisible(R.id.menu_group_headlines, false); m_menu.setGroupVisible(R.id.menu_group_headlines_selection, true); } else { @@ -576,11 +617,118 @@ public class OfflineActivity extends FragmentActivity { } + public void refreshViews() { + refreshFeeds(); + refreshHeadlines(); + } + @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment)getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); + OfflineFeedsFragment ff = (OfflineFeedsFragment)getSupportFragmentManager().findFragmentById(R.id.feeds_fragment); + switch (item.getItemId()) { + case R.id.browse_articles: + // TODO cat stuff + return true; + case R.id.browse_feeds: + // TODO cat stuff + return true; + case R.id.catchup_category: + // TODO cat stuff + return true; + case R.id.catchup_feed: + if (ff != null) { + int feedId = ff.getFeedIdAtPosition(info.position); + + if (feedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = 0 WHERE feed_id = ?"); + stmt.bindLong(1, feedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + } + return true; + case R.id.selection_toggle_unread: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = NOT unread WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } else { + int articleId = hf.getArticleIdAtPosition(info.position); + if (articleId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = NOT unread WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + } + return true; + case R.id.selection_toggle_marked: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET marked = NOT marked WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } else { + int articleId = hf.getArticleIdAtPosition(info.position); + if (articleId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET marked = NOT marked WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + } + return true; + case R.id.selection_toggle_published: + if (getSelectedArticleCount() > 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET published = NOT published WHERE selected = 1 AND feed_id = ?"); + stmt.bindLong(1, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } else { + int articleId = hf.getArticleIdAtPosition(info.position); + if (articleId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET published = NOT published WHERE " + + BaseColumns._ID + " = ?"); + stmt.bindLong(1, articleId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + } + return true; + case R.id.share_article: + Cursor article = hf.getArticleAtPosition(info.position); + + if (article != null) { + shareArticle(article); + } + return true; + case R.id.catchup_above: + int articleId = hf.getArticleIdAtPosition(info.position); + + if (articleId != 0 && m_activeFeedId != 0) { + SQLiteStatement stmt = getWritableDb().compileStatement("UPDATE articles SET unread = 0 WHERE updated >= " + + "(SELECT updated FROM articles WHERE " + BaseColumns._ID + " = ?) AND feed_id = ?"); + stmt.bindLong(1, articleId); + stmt.bindLong(2, m_activeFeedId); + stmt.execute(); + stmt.close(); + refreshViews(); + } + return true; default: Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); return super.onContextItemSelected(item); diff --git a/src/org/fox/ttrss/OfflineFeedsFragment.java b/src/org/fox/ttrss/OfflineFeedsFragment.java index d5350e92..9dd8b266 100644 --- a/src/org/fox/ttrss/OfflineFeedsFragment.java +++ b/src/org/fox/ttrss/OfflineFeedsFragment.java @@ -61,12 +61,14 @@ public class OfflineFeedsFragment extends Fragment implements OnItemClickListene } public void refresh() { - if (m_cursor != null) m_cursor.close(); + if (m_cursor != null && !m_cursor.isClosed()) m_cursor.close(); m_cursor = createCursor(); - m_adapter.changeCursor(m_cursor); - m_adapter.notifyDataSetChanged(); + if (m_cursor != null) { + m_adapter.changeCursor(m_cursor); + m_adapter.notifyDataSetChanged(); + } } @Override @@ -101,7 +103,7 @@ public class OfflineFeedsFragment extends Fragment implements OnItemClickListene public void onDestroy() { super.onDestroy(); - m_cursor.close(); + if (m_cursor != null && !m_cursor.isClosed()) m_cursor.close(); } @Override @@ -261,4 +263,16 @@ public class OfflineFeedsFragment extends Fragment implements OnItemClickListene } + public int getFeedIdAtPosition(int position) { + Cursor c = (Cursor)m_adapter.getItem(position); + + if (c != null) { + int feedId = c.getInt(0); + c.close(); + return feedId; + } + + return 0; + } + } diff --git a/src/org/fox/ttrss/OfflineHeadlinesFragment.java b/src/org/fox/ttrss/OfflineHeadlinesFragment.java index c0ec849a..e00b8fda 100644 --- a/src/org/fox/ttrss/OfflineHeadlinesFragment.java +++ b/src/org/fox/ttrss/OfflineHeadlinesFragment.java @@ -66,7 +66,17 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis public void onDestroy() { super.onDestroy(); - m_cursor.close(); + if (m_cursor != null && !m_cursor.isClosed()) m_cursor.close(); + } + + public int getSelectedArticleCount() { + Cursor c = ((OfflineActivity)getActivity()).getReadableDb().query("articles", + new String[] { "COUNT(*)" }, "selected = 1", null, null, null, null); + c.moveToFirst(); + int selected = c.getInt(0); + c.close(); + + return selected; } @Override @@ -75,27 +85,30 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis getActivity().getMenuInflater().inflate(R.menu.headlines_menu, menu); - //if (m_selectedArticles.size() > 0) { - // menu.setHeaderTitle(R.string.headline_context_multiple); - // menu.setGroupVisible(R.id.menu_group_single_article, false); - //} else { + if (getSelectedArticleCount() > 0) { + menu.setHeaderTitle(R.string.headline_context_multiple); + menu.setGroupVisible(R.id.menu_group_single_article, false); + } else { AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo; Cursor c = getArticleAtPosition(info.position); menu.setHeaderTitle(c.getString(c.getColumnIndex("title"))); + //c.close(); menu.setGroupVisible(R.id.menu_group_single_article, true); - //} + } super.onCreateContextMenu(menu, v, menuInfo); } public void refresh() { - if (m_cursor != null) m_cursor.close(); + if (m_cursor != null && !m_cursor.isClosed()) m_cursor.close(); m_cursor = createCursor(); - m_adapter.changeCursor(m_cursor); - m_adapter.notifyDataSetChanged(); + if (m_cursor != null) { + m_adapter.changeCursor(m_cursor); + m_adapter.notifyDataSetChanged(); + } } @Override @@ -393,7 +406,18 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis public Cursor getArticleAtPosition(int position) { return (Cursor) m_adapter.getItem(position); } - + + public int getArticleIdAtPosition(int position) { + Cursor c = getArticleAtPosition(position); + + if (c != null) { + int id = c.getInt(0); + return id; + } + + return 0; + } + public int getActiveArticleId() { return m_activeArticleId; }