From 8b89b52d2b966c96f27f3c51c800af5a6e6d9bb5 Mon Sep 17 00:00:00 2001 From: relan Date: Fri, 18 Dec 2015 21:50:54 +0300 Subject: [PATCH] Show appropriate message when search results are empty Closes #512. --- F-Droid/AndroidManifest.xml | 1 + F-Droid/res/values/strings.xml | 3 +++ .../views/fragments/AppListFragment.java | 18 +++++++++++++++++- .../views/fragments/AvailableAppsFragment.java | 10 ++++++++++ .../views/fragments/CanUpdateAppsFragment.java | 11 +++++++++++ .../views/fragments/InstalledAppsFragment.java | 11 +++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/F-Droid/AndroidManifest.xml b/F-Droid/AndroidManifest.xml index ed850a79f..8604f739f 100644 --- a/F-Droid/AndroidManifest.xml +++ b/F-Droid/AndroidManifest.xml @@ -105,6 +105,7 @@ diff --git a/F-Droid/res/values/strings.xml b/F-Droid/res/values/strings.xml index bf5ba4416..982929239 100644 --- a/F-Droid/res/values/strings.xml +++ b/F-Droid/res/values/strings.xml @@ -258,6 +258,9 @@ No apps installed.\n\nThere are apps on your device, but they are not available from F-Droid. This could be because you need to update your repositories, or the repositories genuinely don\'t have your apps available. No apps in this category.\n\nTry selecting a different category or updating your repositories to get a fresh list of apps. All apps up to date.\n\nCongratulations! All of your apps are up to date (or your repositories are out of date). + No matching installed applications. + No matching applications available. + No matching applications for update. Requesting root access… Root access denied 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 b6efa0f14..143684d2d 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java +++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java @@ -14,6 +14,7 @@ import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.View; import android.widget.AdapterView; +import android.widget.TextView; import org.fdroid.fdroid.AppDetails; import org.fdroid.fdroid.Preferences; @@ -64,6 +65,10 @@ public abstract class AppListFragment extends ListFragment implements protected abstract Uri getDataUri(String query); + protected abstract int getEmptyMessage(); + + protected abstract int getNoSearchResultsMessage(); + /** * Subclasses can choose to do different things based on when a user begins searching. * For example, the "Available" tab chooses to hide its category spinner to make it clear @@ -84,6 +89,14 @@ public abstract class AppListFragment extends ListFragment implements // Do nothing by default. } + /** + * Utility function to set empty view text which should be different + * depending on whether search is active or not. + */ + private void setEmptyText(int resId) { + ((TextView) getListView().getEmptyView()).setText(resId); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -177,15 +190,18 @@ public abstract class AppListFragment extends ListFragment implements /** * Notifies the subclass via {@link AppListFragment#onSearch()} and {@link AppListFragment#onSearchStopped()} - * about whether or not a search is taking place. + * about whether or not a search is taking place and changes empty message + * appropriately. * @return True if a user is searching. */ private boolean updateSearchStatus() { if (TextUtils.isEmpty(searchQuery)) { onSearchStopped(); + setEmptyText(getEmptyMessage()); return false; } else { onSearch(); + setEmptyText(getNoSearchResultsMessage()); return true; } } 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 0b7aab7e5..c67665e29 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java +++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java @@ -176,6 +176,16 @@ public class AvailableAppsFragment extends AppListFragment implements return AppProvider.getSearchUri(query); } + @Override + protected int getEmptyMessage() { + return R.string.empty_available_app_list; + } + + @Override + protected int getNoSearchResultsMessage() { + return R.string.empty_search_available_app_list; + } + 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 8b5954609..1267499b8 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java +++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java @@ -28,10 +28,21 @@ public class CanUpdateAppsFragment extends AppListFragment { return AppProvider.getCanUpdateUri(); } + @Override protected Uri getDataUri(String query) { return AppProvider.getSearchCanUpdateUri(query); } + @Override + protected int getEmptyMessage() { + return R.string.empty_can_update_app_list; + } + + @Override + protected int getNoSearchResultsMessage() { + return R.string.empty_search_can_update_app_list; + } + @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 7f7a77c01..b67140e4d 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java +++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java @@ -28,10 +28,21 @@ public class InstalledAppsFragment extends AppListFragment { return AppProvider.getInstalledUri(); } + @Override protected Uri getDataUri(String query) { return AppProvider.getSearchInstalledUri(query); } + @Override + protected int getEmptyMessage() { + return R.string.empty_installed_app_list; + } + + @Override + protected int getNoSearchResultsMessage() { + return R.string.empty_search_installed_app_list; + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.installed_app_list, container, false);