From 65afc83b16b7bb1b57be8f9cdb149fc3b27d88cc Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 28 Mar 2017 10:54:41 +1100 Subject: [PATCH] Removed app list fragments from old 3 tab layout. --- .../views/fragments/AppListFragment.java | 240 ----------------- .../fragments/AvailableAppsFragment.java | 253 ------------------ .../fragments/CanUpdateAppsFragment.java | 52 ---- .../fragments/InstalledAppsFragment.java | 52 ---- app/src/main/res/layout-v21/applistitem.xml | 104 ------- app/src/main/res/layout/applistitem.xml | 104 ------- .../main/res/layout/available_app_list.xml | 38 --- .../main/res/layout/can_update_app_list.xml | 14 - .../main/res/layout/installed_app_list.xml | 14 - 9 files changed, 871 deletions(-) delete mode 100644 app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java delete mode 100644 app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java delete mode 100644 app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java delete mode 100644 app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java delete mode 100644 app/src/main/res/layout-v21/applistitem.xml delete mode 100644 app/src/main/res/layout/applistitem.xml delete mode 100644 app/src/main/res/layout/available_app_list.xml delete mode 100644 app/src/main/res/layout/can_update_app_list.xml delete mode 100644 app/src/main/res/layout/installed_app_list.xml diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java deleted file mode 100644 index d156933a3..000000000 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/AppListFragment.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.fdroid.fdroid.views.fragments; - -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.ActivityOptionsCompat; -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.support.v4.util.Pair; -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.AppDetails2; -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.UpdateService; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.Schema.AppMetadataTable; -import org.fdroid.fdroid.views.AppListAdapter; - -public abstract class AppListFragment extends ListFragment implements - AdapterView.OnItemClickListener, - AdapterView.OnItemLongClickListener, - Preferences.ChangeListener, - LoaderManager.LoaderCallbacks { - - private static final String TAG = "AppListFragment"; - - private static final int REQUEST_APPDETAILS = 0; - - private static final String[] APP_PROJECTION = { - AppMetadataTable.Cols._ID, // Required for cursor loader to work. - AppMetadataTable.Cols.Package.PACKAGE_NAME, - AppMetadataTable.Cols.NAME, - AppMetadataTable.Cols.SUMMARY, - AppMetadataTable.Cols.IS_COMPATIBLE, - AppMetadataTable.Cols.LICENSE, - AppMetadataTable.Cols.ICON, - AppMetadataTable.Cols.ICON_URL, - AppMetadataTable.Cols.InstalledApp.VERSION_CODE, - AppMetadataTable.Cols.InstalledApp.VERSION_NAME, - AppMetadataTable.Cols.SuggestedApk.VERSION_NAME, - AppMetadataTable.Cols.SUGGESTED_VERSION_CODE, - AppMetadataTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root. - AppMetadataTable.Cols.ANTI_FEATURES, // Needed for filtering apps that require anti-features. - }; - - private static final String APP_SORT = AppMetadataTable.Cols.NAME; - - private AppListAdapter appAdapter; - - @Nullable private String searchQuery; - - protected abstract AppListAdapter getAppListAdapter(); - - protected abstract String getFromTitle(); - - protected abstract Uri getDataUri(); - - 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 - * that it is searching all apps, not the current category. - * NOTE: This will get called multiple times, every time the user changes the - * search query. - */ - void onSearch() { - // Do nothing by default. - } - - /** - * Alerts the child class that the user is no longer performing a search. - * This is triggered every time the search query is blank. - * - * @see AppListFragment#onSearch() - */ - protected void onSearchStopped() { - // 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); - - // Can't do this in the onCreate view, because "onCreateView" which - // returns the list view is "called between onCreate and - // onActivityCreated" according to the docs. - getListView().setOnItemClickListener(this); - getListView().setOnItemLongClickListener(this); - } - - @Override - public void onResume() { - super.onResume(); - - //Starts a new or restarts an existing Loader in this manager - getLoaderManager().initLoader(0, null, this); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - appAdapter = getAppListAdapter(); - - if (appAdapter.getCount() == 0) { - updateEmptyRepos(); - } - - setListAdapter(appAdapter); - } - - /** - * The first time the app is run, we will have an empty app list. - * If this is the case, we will attempt to update with the default repo. - * However, if we have tried this at least once, then don't try to do - * it automatically again, because the repos or internet connection may - * be bad. - */ - private boolean updateEmptyRepos() { - Preferences prefs = Preferences.get(); - if (!prefs.hasTriedEmptyUpdate()) { - Utils.debugLog(TAG, "Empty app list, and we haven't done an update yet. Forcing repo update."); - prefs.setTriedEmptyUpdate(true); - UpdateService.updateNow(getActivity()); - return true; - } - Utils.debugLog(TAG, "Empty app list, but it looks like we've had an update previously. Will not force repo update."); - return false; - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - showItemDetails(view, position, false); - } - - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - showItemDetails(view, position, true); - return true; - } - - private void showItemDetails(View view, int position, boolean useNewDetailsActivity) { - // Cursor is null in the swap list when touching the first item. - Cursor cursor = (Cursor) getListView().getItemAtPosition(position); - if (cursor != null) { - final App app = new App(cursor); - Intent intent = getAppDetailsIntent(useNewDetailsActivity); - intent.putExtra(AppDetails2.EXTRA_APPID, app.packageName); - intent.putExtra(AppDetails.EXTRA_FROM, getFromTitle()); - if (Build.VERSION.SDK_INT >= 21) { - Pair iconTransitionPair = Pair.create(view.findViewById(R.id.icon), - getString(R.string.transition_app_item_icon)); - Bundle bundle = ActivityOptionsCompat - .makeSceneTransitionAnimation(getActivity(), - iconTransitionPair) - .toBundle(); - startActivityForResult(intent, REQUEST_APPDETAILS, bundle); - } else { - startActivityForResult(intent, REQUEST_APPDETAILS); - } - } - } - - private Intent getAppDetailsIntent(boolean useNewDetailsActivity) { - return new Intent(getActivity(), useNewDetailsActivity ? AppDetails2.class : AppDetails.class); - } - - @Override - public void onPreferenceChange() { - getAppListAdapter().notifyDataSetChanged(); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - appAdapter.swapCursor(data); - } - - @Override - public void onLoaderReset(Loader loader) { - appAdapter.swapCursor(null); - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - Uri uri = updateSearchStatus() ? getDataUri(searchQuery) : getDataUri(); - return new CursorLoader( - getActivity(), uri, APP_PROJECTION, null, null, APP_SORT); - } - - /** - * Notifies the subclass via {@link AppListFragment#onSearch()} and {@link AppListFragment#onSearchStopped()} - * 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; - } - onSearch(); - setEmptyText(getNoSearchResultsMessage()); - return true; - } - - public void updateSearchQuery(@Nullable String query) { - if (!TextUtils.equals(query, searchQuery)) { - searchQuery = query; - if (isAdded()) { - getLoaderManager().restartLoader(0, null, this); - } - } - } -} diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java deleted file mode 100644 index ce495b2e8..000000000 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java +++ /dev/null @@ -1,253 +0,0 @@ -package org.fdroid.fdroid.views.fragments; - -import android.app.Activity; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.database.ContentObserver; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.support.annotation.Nullable; -import android.support.v4.app.LoaderManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Spinner; - -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.compat.ArrayAdapterCompat; -import org.fdroid.fdroid.compat.CursorAdapterCompat; -import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.data.CategoryProvider; -import org.fdroid.fdroid.views.AppListAdapter; -import org.fdroid.fdroid.views.AvailableAppListAdapter; - -import java.util.ArrayList; -import java.util.List; - -public class AvailableAppsFragment extends AppListFragment implements - LoaderManager.LoaderCallbacks { - - private static final String TAG = "AvailableAppsFragment"; - - private static final String PREFERENCES_FILE = "CategorySpinnerPosition"; - private static final String CATEGORY_KEY = "Selection"; - private static String defaultCategory; - - private List categories; - - @Nullable - private View categoryWrapper; - - @Nullable - private Spinner categorySpinner; - private String currentCategory; - private AppListAdapter adapter; - - @Override - protected String getFromTitle() { - return getString(R.string.tab_available_apps); - } - - @Override - protected AppListAdapter getAppListAdapter() { - if (adapter == null) { - final AppListAdapter a = AvailableAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY); - Preferences.get().registerUpdateHistoryListener(new Preferences.ChangeListener() { - @Override - public void onPreferenceChange() { - a.notifyDataSetChanged(); - } - }); - adapter = a; - } - return adapter; - } - - private class CategoryObserver extends ContentObserver { - - private final ArrayAdapter adapter; - - CategoryObserver(ArrayAdapter adapter) { - // Using Looper.getMainLooper() ensures that the onChange method is run on the main thread. - super(new Handler(Looper.getMainLooper())); - this.adapter = adapter; - } - - @Override - public void onChange(boolean selfChange) { - final Activity activity = getActivity(); - if (!isAdded() || adapter == null || activity == null) { - return; - } - - // Because onChange is always invoked on the main thread (see constructor), we want to - // run the database query on a background thread. Afterwards, the UI is updated - // on a foreground thread. - new AsyncTask>() { - @Override - protected List doInBackground(Void... params) { - return CategoryProvider.Helper.categories(activity); - } - - @Override - protected void onPostExecute(List loadedCategories) { - adapter.clear(); - categories = loadedCategories; - ArrayAdapterCompat.addAll(adapter, translateCategories(activity, loadedCategories)); - } - }.execute(); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - onChange(selfChange); - } - } - - /** - * Attempt to translate category names with fallback to default name if no translation available - */ - private static List translateCategories(Context context, List categories) { - List translatedCategories = new ArrayList<>(categories.size()); - Resources res = context.getResources(); - String pkgName = context.getPackageName(); - for (String category : categories) { - String resId = category.replace(" & ", "_").replace(" ", "_").replace("'", ""); - int id = res.getIdentifier("category_" + resId, "string", pkgName); - translatedCategories.add(id == 0 ? category : context.getString(id)); - } - return translatedCategories; - } - - private Spinner setupCategorySpinner(Spinner spinner) { - - categorySpinner = spinner; - categorySpinner.setId(R.id.category_spinner); - - categories = CategoryProvider.Helper.categories(getActivity()); - - ArrayAdapter adapter = new ArrayAdapter<>( - getActivity(), android.R.layout.simple_spinner_item, translateCategories(getActivity(), categories)); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - categorySpinner.setAdapter(adapter); - - getActivity().getContentResolver().registerContentObserver( - AppProvider.getContentUri(), false, new CategoryObserver(adapter)); - - categorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int pos, long id) { - getListView().setSelection(0); - setCurrentCategory(categories.get(pos)); - } - - @Override - public void onNothingSelected(AdapterView parent) { - setCurrentCategory(null); - } - }); - return categorySpinner; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.available_app_list, container, false); - - categoryWrapper = view.findViewById(R.id.category_wrapper); - setupCategorySpinner((Spinner) view.findViewById(R.id.category_spinner)); - defaultCategory = CategoryProvider.Helper.getCategoryWhatsNew(getActivity()); - - return view; - } - - @Override - protected Uri getDataUri() { - if (currentCategory == null || currentCategory.equals(CategoryProvider.Helper.getCategoryAll(getActivity()))) { - return AppProvider.getContentUri(); - } - if (currentCategory.equals(CategoryProvider.Helper.getCategoryRecentlyUpdated(getActivity()))) { - return AppProvider.getRecentlyUpdatedUri(); - } - if (currentCategory.equals(CategoryProvider.Helper.getCategoryWhatsNew(getActivity()))) { - // Removed this feature in the new UI. this fragment will be gone soon so not implementing it again. - // return AppProvider.getNewlyAddedUri(); - return AppProvider.getRecentlyUpdatedUri(); - } - return AppProvider.getCategoryUri(currentCategory); - } - - @Override - protected Uri getDataUri(String query) { - return AppProvider.getSearchUri(query, null); - } - - @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."); - getLoaderManager().restartLoader(0, null, this); - } - - @Override - public void onResume() { - /* restore the saved Category Spinner position */ - Activity activity = getActivity(); - SharedPreferences p = activity.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE); - currentCategory = p.getString(CATEGORY_KEY, defaultCategory); - - if (categorySpinner != null) { - for (int i = 0; i < categorySpinner.getCount(); i++) { - if (currentCategory.equals(categorySpinner.getItemAtPosition(i).toString())) { - categorySpinner.setSelection(i); - break; - } - } - } - - setCurrentCategory(currentCategory); - super.onResume(); - } - - @Override - public void onPause() { - super.onPause(); - /* store the Category Spinner position for when we come back */ - SharedPreferences p = getActivity().getSharedPreferences(PREFERENCES_FILE, - Context.MODE_PRIVATE); - SharedPreferences.Editor e = p.edit(); - e.putString(CATEGORY_KEY, currentCategory); - e.apply(); - } - - @Override - protected void onSearch() { - if (categoryWrapper != null) { - categoryWrapper.setVisibility(View.GONE); - } - } - - @Override - protected void onSearchStopped() { - if (categoryWrapper != null) { - categoryWrapper.setVisibility(View.VISIBLE); - } - } -} diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java deleted file mode 100644 index 80d5ff11d..000000000 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.fdroid.fdroid.views.fragments; - -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.compat.CursorAdapterCompat; -import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.views.AppListAdapter; -import org.fdroid.fdroid.views.CanUpdateAppListAdapter; - -public class CanUpdateAppsFragment extends AppListFragment { - - @Override - protected AppListAdapter getAppListAdapter() { - return CanUpdateAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY); - } - - @Override - protected String getFromTitle() { - return getString(R.string.tab_updates); - } - - @Override - protected Uri getDataUri() { - 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/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java deleted file mode 100644 index 928629e43..000000000 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.fdroid.fdroid.views.fragments; - -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.compat.CursorAdapterCompat; -import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.views.AppListAdapter; -import org.fdroid.fdroid.views.InstalledAppListAdapter; - -public class InstalledAppsFragment extends AppListFragment { - - @Override - protected AppListAdapter getAppListAdapter() { - return InstalledAppListAdapter.create(getActivity(), null, CursorAdapterCompat.FLAG_AUTO_REQUERY); - } - - @Override - protected String getFromTitle() { - return getString(R.string.tab_installed_apps); - } - - @Override - protected Uri getDataUri() { - 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); - } - -} diff --git a/app/src/main/res/layout-v21/applistitem.xml b/app/src/main/res/layout-v21/applistitem.xml deleted file mode 100644 index 9f45beab6..000000000 --- a/app/src/main/res/layout-v21/applistitem.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/applistitem.xml b/app/src/main/res/layout/applistitem.xml deleted file mode 100644 index aed8e85e0..000000000 --- a/app/src/main/res/layout/applistitem.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/available_app_list.xml b/app/src/main/res/layout/available_app_list.xml deleted file mode 100644 index e1b35d157..000000000 --- a/app/src/main/res/layout/available_app_list.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/can_update_app_list.xml b/app/src/main/res/layout/can_update_app_list.xml deleted file mode 100644 index fa7557058..000000000 --- a/app/src/main/res/layout/can_update_app_list.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/installed_app_list.xml b/app/src/main/res/layout/installed_app_list.xml deleted file mode 100644 index 869380928..000000000 --- a/app/src/main/res/layout/installed_app_list.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -