From 43557570cfe72b525701ffed65bd1d8f32df67ce Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 6 Sep 2013 09:28:32 -0700 Subject: [PATCH] Print service settings polish 1. Moved the settings and add printers to the overflow menu. 2. Collapsing the search action view to get proper behavior when selected. 3. Showing the search option only if there are printers. 4. Stop observing for printers if the service is disabled. bug:10652301 Change-Id: I589a3b177c5a58a8b1382d7020fd4b128afd9038 --- res/menu/print_service_settings.xml | 6 +- .../print/PrintServiceSettingsFragment.java | 104 ++++++++++++++---- 2 files changed, 84 insertions(+), 26 deletions(-) diff --git a/res/menu/print_service_settings.xml b/res/menu/print_service_settings.xml index cb9071c4f33..a9a4aeda23d 100644 --- a/res/menu/print_service_settings.xml +++ b/res/menu/print_service_settings.xml @@ -20,17 +20,17 @@ android:title="@string/print_menu_item_search" android:icon="@*android:drawable/ic_menu_search_holo_dark" android:actionViewClass="android.widget.SearchView" - android:showAsAction="ifRoom" + android:showAsAction="ifRoom|collapseActionView" android:imeOptions="actionSearch"> + android:showAsAction="never"> + android:showAsAction="never"> diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java index 73b13cba567..8dae1f081d2 100644 --- a/src/com/android/settings/print/PrintServiceSettingsFragment.java +++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java @@ -30,6 +30,7 @@ import android.content.Loader; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.database.ContentObserver; +import android.database.DataSetObserver; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -79,9 +80,28 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment new SettingsContentObserver(new Handler()) { @Override public void onChange(boolean selfChange, Uri uri) { - List services = SettingsUtils.readEnabledPrintServices(getActivity()); - final boolean enabled = services.contains(mComponentName); - mToggleSwitch.setCheckedInternal(enabled); + updateForServiceEnabledState(); + } + }; + + private final DataSetObserver mDataObserver = new DataSetObserver() { + @Override + public void onChanged() { + invalidateOptionsMenuIfNeeded(); + } + + @Override + public void onInvalidated() { + invalidateOptionsMenuIfNeeded(); + } + + private void invalidateOptionsMenuIfNeeded() { + final int unfilteredItemCount = mPrintersAdapter.getUnfilteredCount(); + if ((mLastUnfilteredItemCount <= 0 && unfilteredItemCount > 0) + || mLastUnfilteredItemCount > 0 && unfilteredItemCount <= 0) { + getActivity().invalidateOptionsMenu(); + } + mLastUnfilteredItemCount = unfilteredItemCount; } }; @@ -100,14 +120,21 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment private ComponentName mComponentName; + private PrintersAdapter mPrintersAdapter; + // TODO: Showing sub-sub fragment does not handle the activity title // so we do it but this is wrong. Do a real fix when there is time. private CharSequence mOldActivityTitle; + private int mLastUnfilteredItemCount; + + private boolean mServiceEnabled; + @Override public void onResume() { mSettingsContentObserver.register(getContentResolver()); super.onResume(); + updateForServiceEnabledState(); } @Override @@ -119,9 +146,12 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - onInstallActionBarToggleSwitch(); + installActionBarToggleSwitch(); processArguments(getArguments()); - getListView().setAdapter(new PrintersAdapter()); + mPrintersAdapter = new PrintersAdapter(); + mPrintersAdapter.registerDataSetObserver(mDataObserver); + getListView().setAdapter(mPrintersAdapter); + updateForServiceEnabledState(); } @Override @@ -188,7 +218,20 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment } } - protected void onInstallActionBarToggleSwitch() { + private void updateForServiceEnabledState() { + List services = SettingsUtils.readEnabledPrintServices(getActivity()); + mServiceEnabled = services.contains(mComponentName); + if (mServiceEnabled) { + mToggleSwitch.setCheckedInternal(true); + mPrintersAdapter.enable(); + } else { + mToggleSwitch.setCheckedInternal(false); + mPrintersAdapter.disable(); + } + getActivity().invalidateOptionsMenu(); + } + + private void installActionBarToggleSwitch() { mToggleSwitch = createAndAddActionBarToggleSwitch(getActivity()); mToggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() { @Override @@ -235,7 +278,6 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment if (!getPackageManager().queryIntentActivities(settingsIntent, 0).isEmpty()) { mSettingsTitle = settingsTitle; mSettingsIntent = settingsIntent; - setHasOptionsMenu(true); } } @@ -251,7 +293,6 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment if (!getPackageManager().queryIntentActivities(addPritnersIntent, 0).isEmpty()) { mAddPrintersTitle = addPrintersTitle; mAddPrintersIntent = addPritnersIntent; - setHasOptionsMenu(true); } } @@ -266,6 +307,8 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment // Component name. mComponentName = ComponentName.unflattenFromString(arguments .getString(PrintSettingsFragment.EXTRA_SERVICE_COMPONENT_NAME)); + + setHasOptionsMenu(true); } @Override @@ -274,33 +317,39 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment inflater.inflate(R.menu.print_service_settings, menu); MenuItem addPrinters = menu.findItem(R.id.print_menu_item_add_printer); - if (!TextUtils.isEmpty(mAddPrintersTitle) && mAddPrintersIntent != null) { + if (mServiceEnabled && !TextUtils.isEmpty(mAddPrintersTitle) + && mAddPrintersIntent != null) { addPrinters.setIntent(mAddPrintersIntent); } else { menu.removeItem(R.id.print_menu_item_add_printer); } MenuItem settings = menu.findItem(R.id.print_menu_item_settings); - if (!TextUtils.isEmpty(mSettingsTitle) && mSettingsIntent != null) { + if (mServiceEnabled && !TextUtils.isEmpty(mSettingsTitle) + && mSettingsIntent != null) { settings.setIntent(mSettingsIntent); } else { menu.removeItem(R.id.print_menu_item_settings); } MenuItem searchItem = menu.findItem(R.id.print_menu_item_search); - SearchView searchView = (SearchView) searchItem.getActionView(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - return true; - } + if (mServiceEnabled && mPrintersAdapter.getUnfilteredCount() > 0) { + SearchView searchView = (SearchView) searchItem.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return true; + } - @Override - public boolean onQueryTextChange(String searchString) { - ((Filterable) getListView().getAdapter()).getFilter().filter(searchString); - return true; - } - }); + @Override + public boolean onQueryTextChange(String searchString) { + ((Filterable) getListView().getAdapter()).getFilter().filter(searchString); + return true; + } + }); + } else { + menu.removeItem(R.id.print_menu_item_search); + } } private ToggleSwitch createAndAddActionBarToggleSwitch(Activity activity) { @@ -347,10 +396,18 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment private CharSequence mLastSearchString; - public PrintersAdapter() { + public void enable() { getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this); } + public void disable() { + getLoaderManager().destroyLoader(LOADER_ID_PRINTERS_LOADER); + } + + public int getUnfilteredCount() { + return mPrinters.size(); + } + @Override public Filter getFilter() { return new Filter() { @@ -480,6 +537,7 @@ public class PrintServiceSettingsFragment extends SettingsPreferenceFragment synchronized (mLock) { mPrinters.clear(); mFilteredPrinters.clear(); + mLastSearchString = null; } notifyDataSetInvalidated(); }