summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2012-01-19 15:33:39 +0300
committerAndrew Dolgov <[email protected]>2012-01-19 15:33:39 +0300
commitdbf59c0b7dba0c4402353ec04f0e8529ecaf795f (patch)
treee75dbc0d127c586e771c3539c1a55bdd798d9c71
parent2f62378980fe821a62728a1a92d9e8b2bcba49e2 (diff)
implement search in offline mode
-rw-r--r--res/menu/offline_menu.xml10
-rw-r--r--src/org/fox/ttrss/OfflineActivity.java109
-rw-r--r--src/org/fox/ttrss/OfflineFeedsFragment.java5
-rw-r--r--src/org/fox/ttrss/OfflineHeadlinesFragment.java20
4 files changed, 136 insertions, 8 deletions
diff --git a/res/menu/offline_menu.xml b/res/menu/offline_menu.xml
index fd5ed0c2..e0b2b18f 100644
--- a/res/menu/offline_menu.xml
+++ b/res/menu/offline_menu.xml
@@ -26,12 +26,18 @@
<item
android:id="@+id/go_online"
- android:icon="@drawable/ic_menu_cloud"
- android:showAsAction="ifRoom|withText"
+ android:icon="@drawable/ic_menu_cloud"
android:title="@string/go_online"
android:visible="false"/>
<item
+ android:id="@+id/search"
+ android:actionViewClass="android.widget.SearchView"
+ android:icon="@android:drawable/ic_menu_search"
+ android:showAsAction="ifRoom"
+ android:title="@string/search"/>
+
+ <item
android:id="@+id/headlines_mark_as_read"
android:icon="@drawable/ic_menu_tick"
android:title="@string/headlines_mark_as_read"/>
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,13 +447,51 @@ 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);
startActivityForResult(intent, 0);
@@ -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();
+ }
+ }
}