From dbf59c0b7dba0c4402353ec04f0e8529ecaf795f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 19 Jan 2012 15:33:39 +0300 Subject: implement search in offline mode --- src/org/fox/ttrss/OfflineActivity.java | 109 +++++++++++++++++++++++- src/org/fox/ttrss/OfflineFeedsFragment.java | 5 ++ src/org/fox/ttrss/OfflineHeadlinesFragment.java | 20 ++++- 3 files changed, 128 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/org/fox/ttrss/OfflineActivity.java b/src/org/fox/ttrss/OfflineActivity.java index df63b198..e8359de2 100644 --- a/src/org/fox/ttrss/OfflineActivity.java +++ b/src/org/fox/ttrss/OfflineActivity.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.DialogInterface.OnClickListener; import android.content.res.Configuration; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; @@ -21,7 +22,6 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.ActionMode; -import android.view.Display; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; @@ -30,7 +30,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.LinearLayout; +import android.widget.EditText; +import android.widget.SearchView; import android.widget.TextView; public class OfflineActivity extends FragmentActivity implements @@ -328,6 +329,14 @@ public class OfflineActivity extends FragmentActivity implements findViewById(R.id.feeds_fragment).setVisibility(View.VISIBLE); // } m_activeFeedId = 0; + + OfflineFeedsFragment ff = (OfflineFeedsFragment) getSupportFragmentManager() + .findFragmentById(R.id.feeds_fragment); + + if (ff != null) { + ff.setSelectedFeedId(0); + } + refreshViews(); initMainMenu(); @@ -341,6 +350,13 @@ public class OfflineActivity extends FragmentActivity implements findViewById(R.id.headlines_fragment).setVisibility(View.INVISIBLE); m_activeFeedId = 0; + OfflineFeedsFragment ff = (OfflineFeedsFragment) getSupportFragmentManager() + .findFragmentById(R.id.feeds_fragment); + + if (ff != null) { + ff.setSelectedFeedId(0); + } + refreshViews(); initMainMenu(); @@ -431,12 +447,50 @@ public class OfflineActivity extends FragmentActivity implements @Override public boolean onOptionsItemSelected(MenuItem item) { - OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() + final OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); switch (item.getItemId()) { case android.R.id.home: goBack(false); + return true; + case R.id.search: + if (ohf != null && m_compatMode) { + 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(); + + ohf.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.preferences: Intent intent = new Intent(this, PreferencesActivity.class); @@ -671,8 +725,46 @@ public class OfflineActivity extends FragmentActivity implements } } else if (m_selectedArticleId != 0) { m_menu.setGroupVisible(R.id.menu_group_article, true); - } else if (m_activeFeedId != 0 /*|| m_activeCategory != null */) { + } else if (m_activeFeedId != 0) { m_menu.setGroupVisible(R.id.menu_group_headlines, true); + + MenuItem search = m_menu.findItem(R.id.search); + + if (!m_compatMode) { + SearchView searchView = (SearchView) search.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + private String query = ""; + + @Override + public boolean onQueryTextSubmit(String query) { + OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getSupportFragmentManager() + .findFragmentById(R.id.headlines_fragment); + + 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() + .findFragmentById(R.id.headlines_fragment); + + if (frag != null) { + frag.setSearchQuery(newText); + this.query = newText; + } + } + + return false; + } + }); + } + } else { m_menu.setGroupVisible(R.id.menu_group_feeds, true); } @@ -977,6 +1069,15 @@ public class OfflineActivity extends FragmentActivity implements deselectAllArticles(); + if (m_menu != null) { + MenuItem search = m_menu.findItem(R.id.search); + + if (search != null && !m_compatMode) { + SearchView sv = (SearchView) search.getActionView(); + sv.setQuery("", false); + } + } + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); OfflineHeadlinesFragment frag = new OfflineHeadlinesFragment(); ft.replace(R.id.headlines_fragment, frag); diff --git a/src/org/fox/ttrss/OfflineFeedsFragment.java b/src/org/fox/ttrss/OfflineFeedsFragment.java index 8b836218..01744efe 100644 --- a/src/org/fox/ttrss/OfflineFeedsFragment.java +++ b/src/org/fox/ttrss/OfflineFeedsFragment.java @@ -283,5 +283,10 @@ public class OfflineFeedsFragment extends Fragment implements OnItemClickListene return 0; } + + public void setSelectedFeedId(int feedId) { + m_selectedFeedId = feedId; + refresh(); + } } diff --git a/src/org/fox/ttrss/OfflineHeadlinesFragment.java b/src/org/fox/ttrss/OfflineHeadlinesFragment.java index fcb55d4f..a614592d 100644 --- a/src/org/fox/ttrss/OfflineHeadlinesFragment.java +++ b/src/org/fox/ttrss/OfflineHeadlinesFragment.java @@ -45,6 +45,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis private int m_feedId; private int m_activeArticleId; private boolean m_combinedMode = true; + private String m_searchQuery = ""; private SharedPreferences m_prefs; @@ -120,6 +121,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis m_activeArticleId = savedInstanceState.getInt("activeArticleId"); //m_selectedArticles = savedInstanceState.getParcelableArrayList("selectedArticles"); m_combinedMode = savedInstanceState.getBoolean("combinedMode"); + m_searchQuery = (String) savedInstanceState.getCharSequence("searchQuery"); } View view = inflater.inflate(R.layout.headlines_fragment, container, false); @@ -141,8 +143,14 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis } public Cursor createCursor() { - return m_offlineServices.getReadableDb().query("articles", - null, "feed_id = ?", new String[] { String.valueOf(m_feedId) }, null, null, "updated DESC"); + if (m_searchQuery.equals("")) { + return m_offlineServices.getReadableDb().query("articles", + null, "feed_id = ?", new String[] { String.valueOf(m_feedId) }, null, null, "updated DESC"); + } else { + return m_offlineServices.getReadableDb().query("articles", + null, "feed_id = ? AND (title LIKE '%' || ? || '%' OR content LIKE '%' || ? || '%')", + new String[] { String.valueOf(m_feedId), m_searchQuery, m_searchQuery }, null, null, "updated DESC"); + } } @Override @@ -189,6 +197,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis out.putInt("activeArticleId", m_activeArticleId); //out.putParcelableArrayList("selectedArticles", m_selectedArticles); out.putBoolean("combinedMode", m_combinedMode); + out.putCharSequence("searchQuery", m_searchQuery); } public void setLoadingStatus(int status, boolean showProgress) { @@ -439,5 +448,12 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis public int getArticleCount() { return m_adapter.getCount(); } + + public void setSearchQuery(String query) { + if (!m_searchQuery.equals(query)) { + m_searchQuery = query; + refresh(); + } + } } -- cgit v1.2.3-54-g00ecf