From b1be1dffb6c8fb4db7849bdb757c2c8dd4d9ee1e Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 25 Nov 2015 22:54:01 +1100 Subject: [PATCH] Initial move of search logic to FDroid activity from SearchActivity --- F-Droid/AndroidManifest.xml | 29 ++++------- F-Droid/src/org/fdroid/fdroid/FDroid.java | 31 +++++++++-- .../org/fdroid/fdroid/compat/TabManager.java | 4 ++ .../org/fdroid/fdroid/data/AppProvider.java | 52 +++++++++++++++---- .../views/AppListFragmentPagerAdapter.java | 33 ++++++++++-- .../views/fragments/AppListFragment.java | 15 +++++- .../fragments/AvailableAppsFragment.java | 4 ++ .../fragments/CanUpdateAppsFragment.java | 4 ++ .../fragments/InstalledAppsFragment.java | 4 ++ 9 files changed, 138 insertions(+), 38 deletions(-) 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);