diff --git a/F-Droid/AndroidManifest.xml b/F-Droid/AndroidManifest.xml
index 6deda93e0..0f1036114 100644
--- a/F-Droid/AndroidManifest.xml
+++ b/F-Droid/AndroidManifest.xml
@@ -100,7 +100,7 @@
+ android:value=".FDroid" />
+
+
+
+
+
+
@@ -388,25 +396,6 @@
-
-
-
-
-
-
-
-
-
diff --git a/F-Droid/src/org/fdroid/fdroid/FDroid.java b/F-Droid/src/org/fdroid/fdroid/FDroid.java
index d5eda5c4b..b5750a1e6 100644
--- a/F-Droid/src/org/fdroid/fdroid/FDroid.java
+++ b/F-Droid/src/org/fdroid/fdroid/FDroid.java
@@ -29,10 +29,13 @@ import android.content.res.Configuration;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.view.LayoutInflater;
@@ -48,9 +51,10 @@ import org.fdroid.fdroid.data.NewRepoConfig;
import org.fdroid.fdroid.privileged.install.InstallExtensionDialogActivity;
import org.fdroid.fdroid.views.AppListFragmentPagerAdapter;
import org.fdroid.fdroid.views.ManageReposActivity;
+import org.fdroid.fdroid.views.fragments.AppListFragment;
import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
-public class FDroid extends ActionBarActivity {
+public class FDroid extends AppCompatActivity implements SearchView.OnQueryTextListener {
private static final String TAG = "FDroid";
@@ -66,8 +70,11 @@ public class FDroid extends ActionBarActivity {
private ViewPager viewPager;
+ @Nullable
private TabManager tabManager;
+ private AppListFragmentPagerAdapter adapter;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -248,6 +255,7 @@ public class FDroid extends ActionBarActivity {
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
// LayoutParams.MATCH_PARENT does not work, use a big value instead
searchView.setMaxWidth(1000000);
+ searchView.setOnQueryTextListener(this);
return super.onCreateOptionsMenu(menu);
}
@@ -335,8 +343,8 @@ public class FDroid extends ActionBarActivity {
private void createViews() {
viewPager = (ViewPager) findViewById(R.id.main_pager);
- AppListFragmentPagerAdapter viewPagerAdapter = new AppListFragmentPagerAdapter(this);
- viewPager.setAdapter(viewPagerAdapter);
+ this.adapter = new AppListFragmentPagerAdapter(this);
+ viewPager.setAdapter(this.adapter);
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
@@ -345,6 +353,7 @@ public class FDroid extends ActionBarActivity {
});
}
+ @NonNull
private TabManager getTabManager() {
if (tabManager == null) {
tabManager = new TabManager(this, viewPager);
@@ -363,6 +372,20 @@ public class FDroid extends ActionBarActivity {
nMgr.cancel(id);
}
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ return false;
+ }
+
+ private static final String SEARCH_CHANGED = "fdroid.SearchChanged";
+ private static final String SEARCH_QUERY = "fdroid.SearchQuery";
+
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ this.adapter.updateSearchQuery(newText, getTabManager().getSelectedIndex());
+ return true;
+ }
+
private class AppObserver extends ContentObserver {
AppObserver() {
diff --git a/F-Droid/src/org/fdroid/fdroid/compat/TabManager.java b/F-Droid/src/org/fdroid/fdroid/compat/TabManager.java
index 524f1a2ad..17a65f4d4 100644
--- a/F-Droid/src/org/fdroid/fdroid/compat/TabManager.java
+++ b/F-Droid/src/org/fdroid/fdroid/compat/TabManager.java
@@ -35,6 +35,10 @@ public class TabManager {
this.pager = pager;
}
+ public int getSelectedIndex() {
+ return actionBar != null ? actionBar.getSelectedNavigationIndex() : -1;
+ }
+
protected CharSequence getLabel(int index) {
return pager.getAdapter().getPageTitle(index);
}
diff --git a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
index 79019be56..cc265132b 100644
--- a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
+++ b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
@@ -425,6 +425,8 @@ public class AppProvider extends FDroidProvider {
private static final String PATH_INSTALLED = "installed";
private static final String PATH_CAN_UPDATE = "canUpdate";
private static final String PATH_SEARCH = "search";
+ private static final String PATH_SEARCH_INSTALLED = "seasrchInstalled";
+ private static final String PATH_SEARCH_CAN_UPDATE = "searchCanUpdate";
private static final String PATH_SEARCH_REPO = "searchRepo";
private static final String PATH_NO_APKS = "noApks";
private static final String PATH_APPS = "apps";
@@ -435,18 +437,20 @@ public class AppProvider extends FDroidProvider {
private static final String PATH_CALC_APP_DETAILS_FROM_INDEX = "calcDetailsFromIndex";
private static final String PATH_REPO = "repo";
- private static final int CAN_UPDATE = CODE_SINGLE + 1;
- private static final int INSTALLED = CAN_UPDATE + 1;
- private static final int SEARCH = INSTALLED + 1;
- private static final int NO_APKS = SEARCH + 1;
- private static final int APPS = NO_APKS + 1;
+ private static final int CAN_UPDATE = CODE_SINGLE + 1;
+ private static final int INSTALLED = CAN_UPDATE + 1;
+ private static final int SEARCH = INSTALLED + 1;
+ private static final int NO_APKS = SEARCH + 1;
+ private static final int APPS = NO_APKS + 1;
private static final int RECENTLY_UPDATED = APPS + 1;
- private static final int NEWLY_ADDED = RECENTLY_UPDATED + 1;
- private static final int CATEGORY = NEWLY_ADDED + 1;
- private static final int IGNORED = CATEGORY + 1;
+ private static final int NEWLY_ADDED = RECENTLY_UPDATED + 1;
+ private static final int CATEGORY = NEWLY_ADDED + 1;
+ private static final int IGNORED = CATEGORY + 1;
private static final int CALC_APP_DETAILS_FROM_INDEX = IGNORED + 1;
- private static final int REPO = CALC_APP_DETAILS_FROM_INDEX + 1;
- private static final int SEARCH_REPO = REPO + 1;
+ private static final int REPO = CALC_APP_DETAILS_FROM_INDEX + 1;
+ private static final int SEARCH_REPO = REPO + 1;
+ private static final int SEARCH_INSTALLED = SEARCH_REPO + 1;
+ private static final int SEARCH_CAN_UPDATE = SEARCH_INSTALLED + 1;
static {
matcher.addURI(getAuthority(), null, CODE_LIST);
@@ -456,6 +460,8 @@ public class AppProvider extends FDroidProvider {
matcher.addURI(getAuthority(), PATH_NEWLY_ADDED, NEWLY_ADDED);
matcher.addURI(getAuthority(), PATH_CATEGORY + "/*", CATEGORY);
matcher.addURI(getAuthority(), PATH_SEARCH + "/*", SEARCH);
+ matcher.addURI(getAuthority(), PATH_SEARCH_INSTALLED + "/*", SEARCH_INSTALLED);
+ matcher.addURI(getAuthority(), PATH_SEARCH_CAN_UPDATE + "/*", SEARCH_CAN_UPDATE);
matcher.addURI(getAuthority(), PATH_SEARCH_REPO + "/*/*", SEARCH_REPO);
matcher.addURI(getAuthority(), PATH_REPO + "/#", REPO);
matcher.addURI(getAuthority(), PATH_CAN_UPDATE, CAN_UPDATE);
@@ -540,6 +546,22 @@ public class AppProvider extends FDroidProvider {
.build();
}
+ public static Uri getSearchInstalledUri(String query) {
+ return getContentUri()
+ .buildUpon()
+ .appendPath(PATH_SEARCH_INSTALLED)
+ .appendPath(query)
+ .build();
+ }
+
+ public static Uri getSearchCanUpdateUri(String query) {
+ return getContentUri()
+ .buildUpon()
+ .appendPath(PATH_SEARCH_CAN_UPDATE)
+ .appendPath(query)
+ .build();
+ }
+
public static Uri getSearchUri(Repo repo, String query) {
return getContentUri().buildUpon()
.appendPath(PATH_SEARCH_REPO)
@@ -735,6 +757,16 @@ public class AppProvider extends FDroidProvider {
includeSwap = false;
break;
+ case SEARCH_INSTALLED:
+ selection = querySearch(uri.getLastPathSegment()).add(queryInstalled());
+ includeSwap = false;
+ break;
+
+ case SEARCH_CAN_UPDATE:
+ selection = querySearch(uri.getLastPathSegment()).add(queryCanUpdate());
+ includeSwap = false;
+ break;
+
case SEARCH_REPO:
selection = selection.add(querySearch(uri.getPathSegments().get(2)));
selection = selection.add(queryRepo(Long.parseLong(uri.getPathSegments().get(1))));
diff --git a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java
index 43ac7b81f..f0c48be64 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java
@@ -1,5 +1,7 @@
package org.fdroid.fdroid.views;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
@@ -7,6 +9,7 @@ import org.fdroid.fdroid.FDroid;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.compat.TabManager;
import org.fdroid.fdroid.data.AppProvider;
+import org.fdroid.fdroid.views.fragments.AppListFragment;
import org.fdroid.fdroid.views.fragments.AvailableAppsFragment;
import org.fdroid.fdroid.views.fragments.CanUpdateAppsFragment;
import org.fdroid.fdroid.views.fragments.InstalledAppsFragment;
@@ -17,11 +20,28 @@ import org.fdroid.fdroid.views.fragments.InstalledAppsFragment;
*/
public class AppListFragmentPagerAdapter extends FragmentPagerAdapter {
+ @NonNull
private final FDroid parent;
+ @NonNull
+ private final AppListFragment availableFragment;
+
+ @NonNull
+ private final AppListFragment installedFragment;
+
+ @NonNull
+ private final AppListFragment canUpdateFragment;
+
+ @Nullable
+ private String searchQuery;
+
public AppListFragmentPagerAdapter(FDroid parent) {
super(parent.getSupportFragmentManager());
this.parent = parent;
+
+ availableFragment = new AvailableAppsFragment();
+ installedFragment = new InstalledAppsFragment();
+ canUpdateFragment = new CanUpdateAppsFragment();
}
private String getInstalledTabTitle() {
@@ -34,15 +54,22 @@ public class AppListFragmentPagerAdapter extends FragmentPagerAdapter {
return parent.getString(R.string.tab_updates_count, updateCount);
}
+ public void updateSearchQuery(@Nullable String query, int tabIndex) {
+ searchQuery = query;
+ availableFragment.updateSearchQuery(query);
+ installedFragment.updateSearchQuery(query);
+ canUpdateFragment.updateSearchQuery(query);
+ }
+
@Override
public Fragment getItem(int i) {
switch (i) {
case TabManager.INDEX_AVAILABLE:
- return new AvailableAppsFragment();
+ return availableFragment;
case TabManager.INDEX_INSTALLED:
- return new InstalledAppsFragment();
+ return installedFragment;
default:
- return new CanUpdateAppsFragment();
+ return canUpdateFragment;
}
}
diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java
index 401c14120..985e4e5e9 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java
@@ -6,10 +6,12 @@ import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.support.annotation.Nullable;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
+import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
@@ -52,12 +54,17 @@ public abstract class AppListFragment extends ListFragment implements
protected AppListAdapter appAdapter;
+ @Nullable
+ private String searchQuery;
+
protected abstract AppListAdapter getAppListAdapter();
protected abstract String getFromTitle();
protected abstract Uri getDataUri();
+ protected abstract Uri getDataUri(String query);
+
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
@@ -144,9 +151,15 @@ public abstract class AppListFragment extends ListFragment implements
@Override
public Loader onCreateLoader(int id, Bundle args) {
- Uri uri = getDataUri();
+ Uri uri = TextUtils.isEmpty(searchQuery) ? getDataUri() : getDataUri(searchQuery);
return new CursorLoader(
getActivity(), uri, APP_PROJECTION, null, null, APP_SORT);
}
+ public void updateSearchQuery(@Nullable String query) {
+ this.searchQuery = query;
+ if (isAdded()) {
+ getLoaderManager().restartLoader(0, null, this);
+ }
+ }
}
diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java
index ffb14c4e2..9805f7973 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java
@@ -164,6 +164,10 @@ public class AvailableAppsFragment extends AppListFragment implements
return AppProvider.getCategoryUri(currentCategory);
}
+ protected Uri getDataUri(String query) {
+ return AppProvider.getSearchUri(query);
+ }
+
private void setCurrentCategory(String category) {
currentCategory = category;
Utils.debugLog(TAG, "Category '" + currentCategory + "' selected.");
diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java
index e767077b9..8b5954609 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java
@@ -28,6 +28,10 @@ public class CanUpdateAppsFragment extends AppListFragment {
return AppProvider.getCanUpdateUri();
}
+ protected Uri getDataUri(String query) {
+ return AppProvider.getSearchCanUpdateUri(query);
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.can_update_app_list, container, false);
diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java
index d5078b80f..7f7a77c01 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java
@@ -28,6 +28,10 @@ public class InstalledAppsFragment extends AppListFragment {
return AppProvider.getInstalledUri();
}
+ protected Uri getDataUri(String query) {
+ return AppProvider.getSearchInstalledUri(query);
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.installed_app_list, container, false);