PrintSettingsFragment.java revision 39b467482d1bf256a111c757e9b7621c6f523271
12d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/* 22d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Copyright (C) 2013 The Android Open Source Project 32d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * 42d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Licensed under the Apache License, Version 2.0 (the "License"); 52d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * you may not use this file except in compliance with the License. 62d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * You may obtain a copy of the License at 72d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * 82d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * http://www.apache.org/licenses/LICENSE-2.0 92d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * 102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Unless required by applicable law or agreed to in writing, software 112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * distributed under the License is distributed on an "AS IS" BASIS, 122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * See the License for the specific language governing permissions and 142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * limitations under the License. 152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */ 162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 172d531653595344ed7e61c093dca308b9ba7ec185Svetoslavpackage com.android.settings.print; 182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 19bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.app.LoaderManager.LoaderCallbacks; 200ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onukiimport android.content.ActivityNotFoundException; 21bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.content.AsyncTaskLoader; 222d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ComponentName; 232d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ContentResolver; 242d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Context; 252d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Intent; 26bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.content.Loader; 272d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.PackageManager; 282d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.ResolveInfo; 292d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.database.ContentObserver; 300ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onukiimport android.graphics.drawable.Drawable; 312d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.net.Uri; 322d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Bundle; 332d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Handler; 342d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Message; 35fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.os.UserHandle; 36fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.os.UserManager; 37bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJob; 38bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobId; 39bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobInfo; 40bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager; 41bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager.PrintJobStateChangeListener; 422d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.printservice.PrintServiceInfo; 43d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport android.provider.SearchIndexableResource; 442d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.provider.Settings; 4539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 4639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceCategory; 4739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen; 482d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.text.TextUtils; 49bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.text.format.DateUtils; 50bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.util.Log; 512d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.View; 520ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onukiimport android.view.View.OnClickListener; 53bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.view.ViewGroup; 54fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.widget.AdapterView; 552ebc8a01696c4e7dd29863b92a15ae0bbbbb254dJason Monkimport android.widget.AdapterView.OnItemSelectedListener; 560ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onukiimport android.widget.Button; 572ebc8a01696c4e7dd29863b92a15ae0bbbbb254dJason Monkimport android.widget.Spinner; 582d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.TextView; 592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 602d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.internal.content.PackageMonitor; 618a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 622d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.DialogCreatable; 632d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.R; 642d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.SettingsPreferenceFragment; 652ebc8a01696c4e7dd29863b92a15ae0bbbbb254dJason Monkimport com.android.settings.UserAdapter; 6680e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghinaimport com.android.settings.Utils; 67d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport com.android.settings.search.BaseSearchIndexProvider; 687e920da6564032ddcc40db95925083ef59d19e58Fabrice Di Meglioimport com.android.settings.search.Indexable; 69d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport com.android.settings.search.SearchIndexableRaw; 702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 71bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport java.text.DateFormat; 72bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport java.util.ArrayList; 732d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.List; 742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/** 762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Fragment with the top level print settings. 772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */ 78d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavpublic class PrintSettingsFragment extends SettingsPreferenceFragment 790ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki implements DialogCreatable, Indexable, OnItemSelectedListener, OnClickListener { 800ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki public static final String TAG = "PrintSettingsFragment"; 81bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static final int LOADER_ID_PRINT_JOBS_LOADER = 1; 82bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 83bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static final String PRINT_JOBS_CATEGORY = "print_jobs_category"; 84bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static final String PRINT_SERVICES_CATEGORY = "print_services_category"; 85bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav // Extras passed to sub-fragments. 87bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_PREFERENCE_KEY = "EXTRA_PREFERENCE_KEY"; 88bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_CHECKED = "EXTRA_CHECKED"; 89bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_TITLE = "EXTRA_TITLE"; 90bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_ENABLE_WARNING_TITLE = "EXTRA_ENABLE_WARNING_TITLE"; 91bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_ENABLE_WARNING_MESSAGE = "EXTRA_ENABLE_WARNING_MESSAGE"; 92bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_SETTINGS_TITLE = "EXTRA_SETTINGS_TITLE"; 93bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_SETTINGS_COMPONENT_NAME = "EXTRA_SETTINGS_COMPONENT_NAME"; 94bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_ADD_PRINTERS_TITLE = "EXTRA_ADD_PRINTERS_TITLE"; 95bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_ADD_PRINTERS_COMPONENT_NAME = "EXTRA_ADD_PRINTERS_COMPONENT_NAME"; 96bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_SERVICE_COMPONENT_NAME = "EXTRA_SERVICE_COMPONENT_NAME"; 97bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 98bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID"; 992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1000ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav private static final String EXTRA_PRINT_SERVICE_COMPONENT_NAME = 1010ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav "EXTRA_PRINT_SERVICE_COMPONENT_NAME"; 1020ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav 1030ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki private static final int ORDER_LAST = 1000; 1040ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 1052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final PackageMonitor mSettingsPackageMonitor = new SettingsPackageMonitor(); 1062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final Handler mHandler = new Handler() { 1082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void dispatchMessage(Message msg) { 1102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 1112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav }; 1132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final SettingsContentObserver mSettingsContentObserver = 1152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new SettingsContentObserver(mHandler) { 1162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onChange(boolean selfChange, Uri uri) { 1182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 1192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav }; 1212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 122bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private PreferenceCategory mActivePrintJobsCategory; 123bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private PreferenceCategory mPrintServicesCategory; 124bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 125bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private PrintJobsController mPrintJobsController; 1262ebc8a01696c4e7dd29863b92a15ae0bbbbb254dJason Monk private UserAdapter mProfileSpinnerAdapter; 12706cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina private Spinner mSpinner; 1280ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki private Button mAddNewServiceButton; 129fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina 130fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina @Override 1318a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 1328a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.PRINT_SETTINGS; 1338a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 1348a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 1358a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 13623acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk protected int getHelpResource() { 13723acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk return R.string.help_uri_printing; 13823acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk } 13923acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk 14023acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk @Override 1412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onCreate(Bundle icicle) { 1422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onCreate(icicle); 1432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav addPreferencesFromResource(R.xml.print_settings); 144bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 145bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mActivePrintJobsCategory = (PreferenceCategory) findPreference( 146bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov PRINT_JOBS_CATEGORY); 147d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav mPrintServicesCategory = (PreferenceCategory) findPreference( 148bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov PRINT_SERVICES_CATEGORY); 149bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().removePreference(mActivePrintJobsCategory); 150bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 151bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobsController = new PrintJobsController(); 152bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getActivity().getLoaderManager().initLoader(LOADER_ID_PRINT_JOBS_LOADER, 153bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov null, mPrintJobsController); 1542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onResume() { 1582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onResume(); 1592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false); 1602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsContentObserver.register(getContentResolver()); 1612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 1622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav setHasOptionsMenu(true); 163bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov startSubSettingsIfNeeded(); 1642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPause() { 1682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsPackageMonitor.unregister(); 1692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsContentObserver.unregister(getContentResolver()); 1702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onPause(); 1712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 174bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public void onViewCreated(View view, Bundle savedInstanceState) { 175bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov super.onViewCreated(view, savedInstanceState); 176bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov ViewGroup contentRoot = (ViewGroup) getListView().getParent(); 177bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov View emptyView = getActivity().getLayoutInflater().inflate( 178d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav R.layout.empty_print_state, contentRoot, false); 179bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov TextView textView = (TextView) emptyView.findViewById(R.id.message); 180bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov textView.setText(R.string.print_no_services_installed); 1810ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 1820ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final Intent addNewServiceIntent = createAddNewServiceIntentOrNull(); 1830ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (addNewServiceIntent != null) { 1840ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki mAddNewServiceButton = (Button) emptyView.findViewById(R.id.add_new_service); 1850ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki mAddNewServiceButton.setOnClickListener(this); 1860ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki // The empty is used elsewhere too so it's hidden by default. 1870ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki mAddNewServiceButton.setVisibility(View.VISIBLE); 1880ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 1890ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 190bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov contentRoot.addView(emptyView); 19139b467482d1bf256a111c757e9b7621c6f523271Jason Monk setEmptyView(emptyView); 192fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina 193fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE); 19480e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghina mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(um, getActivity()); 19580e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghina if (mProfileSpinnerAdapter != null) { 19628c3f6bb71da1727fdc39bdc622518b1daeb3b0aMaurice Lam mSpinner = (Spinner) setPinnedHeaderView(R.layout.spinner_view); 19706cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina mSpinner.setAdapter(mProfileSpinnerAdapter); 19806cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina mSpinner.setOnItemSelectedListener(this); 199fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina } 200bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 201bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 2022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private void updateServicesPreferences() { 203bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (getPreferenceScreen().findPreference(PRINT_SERVICES_CATEGORY) == null) { 204bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().addPreference(mPrintServicesCategory); 205bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } else { 206bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Since services category is auto generated we have to do a pass 207bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // to generate it since services can come and go. 208bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintServicesCategory.removeAll(); 209bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 2102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 21163609c58a0ae857cc6ec62d28d73e2a0fb8241e9Fabrice Di Meglio List<ComponentName> enabledServices = PrintSettingsUtils 2122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav .readEnabledPrintServices(getActivity()); 2132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2140ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final PackageManager pm = getActivity().getPackageManager(); 2150ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 2160ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki List<ResolveInfo> installedServices = pm 2172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav .queryIntentServices( 2182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new Intent(android.printservice.PrintService.SERVICE_INTERFACE), 2192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); 2202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav final int installedServiceCount = installedServices.size(); 2222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav for (int i = 0; i < installedServiceCount; i++) { 2232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav ResolveInfo installedService = installedServices.get(i); 2242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PreferenceScreen preference = getPreferenceManager().createPreferenceScreen( 2262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getActivity()); 2272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String title = installedService.loadLabel(getPackageManager()).toString(); 2292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setTitle(title); 2302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav ComponentName componentName = new ComponentName( 2322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService.serviceInfo.packageName, 2332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService.serviceInfo.name); 2342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setKey(componentName.flattenToString()); 2352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setOrder(i); 2372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setFragment(PrintServiceSettingsFragment.class.getName()); 2382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setPersistent(false); 2392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav final boolean serviceEnabled = enabledServices.contains(componentName); 2412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (serviceEnabled) { 2422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setSummary(getString(R.string.print_feature_state_on)); 2432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } else { 2442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setSummary(getString(R.string.print_feature_state_off)); 2452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2470ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final Drawable drawable = installedService.loadIcon(pm); 2480ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (drawable != null) { 2490ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setIcon(drawable); 2500ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 2510ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 2522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav Bundle extras = preference.getExtras(); 2532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey()); 2542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putBoolean(EXTRA_CHECKED, serviceEnabled); 2552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_TITLE, title); 2562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PrintServiceInfo printServiceInfo = PrintServiceInfo.create( 2582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService, getActivity()); 2592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav CharSequence applicationLabel = installedService.loadLabel(getPackageManager()); 2612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString( 2632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav R.string.print_service_security_warning_title, applicationLabel)); 2642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString( 2652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav R.string.print_service_security_warning_summary, applicationLabel)); 2662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String settingsClassName = printServiceInfo.getSettingsActivityName(); 2682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (!TextUtils.isEmpty(settingsClassName)) { 2692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SETTINGS_TITLE, 2702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getString(R.string.print_menu_item_settings)); 2712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SETTINGS_COMPONENT_NAME, 2722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new ComponentName(installedService.serviceInfo.packageName, 2732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav settingsClassName).flattenToString()); 2742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String addPrinterClassName = printServiceInfo.getAddPrintersActivityName(); 2772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (!TextUtils.isEmpty(addPrinterClassName)) { 2782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ADD_PRINTERS_TITLE, 2792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getString(R.string.print_menu_item_add_printers)); 2802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ADD_PRINTERS_COMPONENT_NAME, 2812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new ComponentName(installedService.serviceInfo.packageName, 2822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav addPrinterClassName).flattenToString()); 2832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString()); 2862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 287bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintServicesCategory.addPreference(preference); 2882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 290bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (mPrintServicesCategory.getPreferenceCount() == 0) { 291bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().removePreference(mPrintServicesCategory); 2920ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } else { 2930ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final Preference addNewServicePreference = newAddServicePreferenceOrNull(); 2940ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (addNewServicePreference != null) { 2950ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki mPrintServicesCategory.addPreference(addNewServicePreference); 2960ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 2970ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 2980ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 2990ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 3000ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki private Preference newAddServicePreferenceOrNull() { 3010ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final Intent addNewServiceIntent = createAddNewServiceIntentOrNull(); 3020ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (addNewServiceIntent == null) { 3030ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki return null; 3042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 30539b467482d1bf256a111c757e9b7621c6f523271Jason Monk Preference preference = new Preference(getPrefContext()); 3060ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setTitle(R.string.print_menu_item_add_service); 3070ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setIcon(R.drawable.ic_menu_add); 3080ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setOrder(ORDER_LAST); 3090ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setIntent(addNewServiceIntent); 3100ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki preference.setPersistent(false); 3110ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki return preference; 3120ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3130ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 3140ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki private Intent createAddNewServiceIntentOrNull() { 3150ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final String searchUri = Settings.Secure.getString(getContentResolver(), 3160ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki Settings.Secure.PRINT_SERVICE_SEARCH_URI); 3170ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (TextUtils.isEmpty(searchUri)) { 3180ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki return null; 3190ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3200ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki return new Intent(Intent.ACTION_VIEW, Uri.parse(searchUri)); 3212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 323bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private void startSubSettingsIfNeeded() { 3240ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (getArguments() == null) { 3250ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav return; 3260ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 3270ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav String componentName = getArguments().getString(EXTRA_PRINT_SERVICE_COMPONENT_NAME); 3280ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (componentName != null) { 3290ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav getArguments().remove(EXTRA_PRINT_SERVICE_COMPONENT_NAME); 3300ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav Preference prereference = findPreference(componentName); 3310ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (prereference != null) { 33239b467482d1bf256a111c757e9b7621c6f523271Jason Monk prereference.performClick(); 3330ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 3340ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 3350ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 3360ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav 337fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina @Override 338fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 339fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina UserHandle selectedUser = mProfileSpinnerAdapter.getUserHandle(position); 340fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina if (selectedUser.getIdentifier() != UserHandle.myUserId()) { 341fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina Intent intent = new Intent(Settings.ACTION_PRINT_SETTINGS); 342fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 34356645002b2729c1f7696529e530164a031fb7978Alexandra Gherghina intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 34401daaca5475930e394295b06f5a46dc057b44b0fSvetoslav getActivity().startActivityAsUser(intent, selectedUser); 34506cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina // Go back to default selection, which is the first one 34606cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina mSpinner.setSelection(0); 347fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina } 348fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina } 349fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina 350fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina @Override 351fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina public void onNothingSelected(AdapterView<?> parent) { 352fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina // Nothing to do 353fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina } 354fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina 3550ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki @Override 3560ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki public void onClick(View v) { 3570ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (mAddNewServiceButton == v) { 3580ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki final Intent addNewServiceIntent = createAddNewServiceIntentOrNull(); 3590ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki if (addNewServiceIntent != null) { // check again just in case. 3600ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki try { 3610ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki startActivity(addNewServiceIntent); 3620ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } catch (ActivityNotFoundException e) { 3630ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki Log.w(TAG, "Unable to start activity", e); 3640ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3650ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3660ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3670ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki } 3680ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki 3692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private class SettingsPackageMonitor extends PackageMonitor { 3702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 3712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageAdded(String packageName, int uid) { 372d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav mHandler.obtainMessage().sendToTarget(); 3732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 3762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageAppeared(String packageName, int reason) { 3772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 3782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 3812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageDisappeared(String packageName, int reason) { 3822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 3832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 3862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageRemoved(String packageName, int uid) { 3872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 3882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private static abstract class SettingsContentObserver extends ContentObserver { 3922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public SettingsContentObserver(Handler handler) { 3942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super(handler); 3952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void register(ContentResolver contentResolver) { 3982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav contentResolver.registerContentObserver(Settings.Secure.getUriFor( 3992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav Settings.Secure.ENABLED_PRINT_SERVICES), false, this); 4002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 4012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 4022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void unregister(ContentResolver contentResolver) { 4032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav contentResolver.unregisterContentObserver(this); 4042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 4052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 4062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 4072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public abstract void onChange(boolean selfChange, Uri uri); 4082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 409bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 410bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private final class PrintJobsController implements LoaderCallbacks<List<PrintJobInfo>> { 411bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 412bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 413bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public Loader<List<PrintJobInfo>> onCreateLoader(int id, Bundle args) { 414bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (id == LOADER_ID_PRINT_JOBS_LOADER) { 415bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov return new PrintJobsLoader(getActivity()); 416bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 417bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov return null; 418bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 419bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 420bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 421bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public void onLoadFinished(Loader<List<PrintJobInfo>> loader, 422bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov List<PrintJobInfo> printJobs) { 423bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (printJobs == null || printJobs.isEmpty()) { 424bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().removePreference(mActivePrintJobsCategory); 425bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } else { 426bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (getPreferenceScreen().findPreference(PRINT_JOBS_CATEGORY) == null) { 427bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().addPreference(mActivePrintJobsCategory); 428bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 429bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 430bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mActivePrintJobsCategory.removeAll(); 431bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 432bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov final int printJobCount = printJobs.size(); 433bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov for (int i = 0; i < printJobCount; i++) { 434bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov PrintJobInfo printJob = printJobs.get(i); 435bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 436bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov PreferenceScreen preference = getPreferenceManager() 437bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov .createPreferenceScreen(getActivity()); 438bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 439bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov preference.setPersistent(false); 440bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov preference.setFragment(PrintJobSettingsFragment.class.getName()); 441bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov preference.setKey(printJob.getId().flattenToString()); 442bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 443bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov switch (printJob.getState()) { 444bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_QUEUED: 445bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_STARTED: { 44697e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav if (!printJob.isCancelling()) { 44797e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav preference.setTitle(getString( 44897e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav R.string.print_printing_state_title_template, 44997e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav printJob.getLabel())); 45097e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav } else { 45197e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav preference.setTitle(getString( 45297e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav R.string.print_cancelling_state_title_template, 45397e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav printJob.getLabel())); 45497e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav } 455bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } break; 456bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 457bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_FAILED: { 458bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov preference.setTitle(getString( 459bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov R.string.print_failed_state_title_template, 460bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov printJob.getLabel())); 461bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } break; 462bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 463bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_BLOCKED: { 46497e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav if (!printJob.isCancelling()) { 46597e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav preference.setTitle(getString( 46697e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav R.string.print_blocked_state_title_template, 46797e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav printJob.getLabel())); 46897e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav } else { 46997e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav preference.setTitle(getString( 47097e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav R.string.print_cancelling_state_title_template, 47197e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav printJob.getLabel())); 47297e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav } 473bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } break; 474bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 475bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 476bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov preference.setSummary(getString(R.string.print_job_summary, 477bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov printJob.getPrinterName(), DateUtils.formatSameDayTime( 478bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov printJob.getCreationTime(), printJob.getCreationTime(), 479bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov DateFormat.SHORT, DateFormat.SHORT))); 480bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 481bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov switch (printJob.getState()) { 482bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_QUEUED: 483bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_STARTED: { 484031e8b14322ec0a4ec3620de920fd5966290625cSvetoslav preference.setIcon(R.drawable.ic_print); 485bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } break; 486bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 487bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_FAILED: 488bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_BLOCKED: { 489031e8b14322ec0a4ec3620de920fd5966290625cSvetoslav preference.setIcon(R.drawable.ic_print_error); 490bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } break; 491bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 492bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 493bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov Bundle extras = preference.getExtras(); 494d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav extras.putString(EXTRA_PRINT_JOB_ID, printJob.getId().flattenToString()); 495bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 496bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mActivePrintJobsCategory.addPreference(preference); 497bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 498bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 499bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 500bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 501bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 502bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public void onLoaderReset(Loader<List<PrintJobInfo>> loader) { 503bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov getPreferenceScreen().removePreference(mActivePrintJobsCategory); 504bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 505bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 506bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 507bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static final class PrintJobsLoader extends AsyncTaskLoader<List<PrintJobInfo>> { 508bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 509bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static final String LOG_TAG = "PrintJobsLoader"; 510bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 511d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav private static final boolean DEBUG = false; 512bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 513d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav private List<PrintJobInfo> mPrintJobs = new ArrayList<PrintJobInfo>(); 514bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 515bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private final PrintManager mPrintManager; 516bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 517bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private PrintJobStateChangeListener mPrintJobStateChangeListener; 518bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 519bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public PrintJobsLoader(Context context) { 520bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov super(context); 521bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintManager = ((PrintManager) context.getSystemService( 522bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov Context.PRINT_SERVICE)).getGlobalPrintManagerForUser( 5236cfe7996541d608438fa7bec2cbad813ace93a4fSvetoslav context.getUserId()); 524bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 525bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 526bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 527bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public void deliverResult(List<PrintJobInfo> printJobs) { 528bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (isStarted()) { 529bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov super.deliverResult(printJobs); 530bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 531bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 532bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 533bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 534bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov protected void onStartLoading() { 535bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (DEBUG) { 536bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov Log.i(LOG_TAG, "onStartLoading()"); 537bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 538bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // If we already have a result, deliver it immediately. 539bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (!mPrintJobs.isEmpty()) { 540bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov deliverResult(new ArrayList<PrintJobInfo>(mPrintJobs)); 541bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 542bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Start watching for changes. 543bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (mPrintJobStateChangeListener == null) { 544bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobStateChangeListener = new PrintJobStateChangeListener() { 545bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 546d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav public void onPrintJobStateChanged(PrintJobId printJobId) { 547bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov onForceLoad(); 548bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 549bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov }; 550bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintManager.addPrintJobStateChangeListener( 551bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobStateChangeListener); 552bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 553bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // If the data changed or we have no data - load it now. 554bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (mPrintJobs.isEmpty()) { 555bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov onForceLoad(); 556bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 557bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 558bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 559bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 560bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov protected void onStopLoading() { 561bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (DEBUG) { 562bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov Log.i(LOG_TAG, "onStopLoading()"); 563bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 564bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Cancel the load in progress if possible. 565bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov onCancelLoad(); 566bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 567bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 568bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 569bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov protected void onReset() { 570bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (DEBUG) { 571bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov Log.i(LOG_TAG, "onReset()"); 572bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 573bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Stop loading. 574bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov onStopLoading(); 575bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Clear the cached result. 576bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobs.clear(); 577bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov // Stop watching for changes. 578bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (mPrintJobStateChangeListener != null) { 579bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintManager.removePrintJobStateChangeListener( 580bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobStateChangeListener); 581bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov mPrintJobStateChangeListener = null; 582bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 583bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 584bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 585bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov @Override 586bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov public List<PrintJobInfo> loadInBackground() { 587bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov List<PrintJobInfo> printJobInfos = null; 588bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov List<PrintJob> printJobs = mPrintManager.getPrintJobs(); 589bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov final int printJobCount = printJobs.size(); 590bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov for (int i = 0; i < printJobCount; i++) { 591bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov PrintJobInfo printJob = printJobs.get(i).getInfo(); 592bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (shouldShowToUser(printJob)) { 593bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov if (printJobInfos == null) { 594bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov printJobInfos = new ArrayList<PrintJobInfo>(); 595bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 596bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov printJobInfos.add(printJob); 597bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 598bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 599bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov return printJobInfos; 600bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 601bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov 602bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov private static boolean shouldShowToUser(PrintJobInfo printJob) { 603bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov switch (printJob.getState()) { 604bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_QUEUED: 605bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_STARTED: 606bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_BLOCKED: 607bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov case PrintJobInfo.STATE_FAILED: { 608bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov return true; 609bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 610bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 611bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov return false; 612bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 613bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov } 614d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 615d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 616d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav new BaseSearchIndexProvider() { 617d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav @Override 618d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 619d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav List<SearchIndexableRaw> indexables = new ArrayList<SearchIndexableRaw>(); 620d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 621d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav PackageManager packageManager = context.getPackageManager(); 622d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav PrintManager printManager = (PrintManager) context.getSystemService( 623d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav Context.PRINT_SERVICE); 624d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 6257476f5b904f16a0b330a99fc0f7d900a722554eaFabrice Di Meglio String screenTitle = context.getResources().getString(R.string.print_settings); 626d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio SearchIndexableRaw data = new SearchIndexableRaw(context); 627d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.title = screenTitle; 628d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.screenTitle = screenTitle; 629d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio indexables.add(data); 630d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 631d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio // Indexing all services, regardless if enabled. 632d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav List<PrintServiceInfo> services = printManager.getInstalledPrintServices(); 633d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav final int serviceCount = services.size(); 634d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav for (int i = 0; i < serviceCount; i++) { 635d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav PrintServiceInfo service = services.get(i); 636c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio 637c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio ComponentName componentName = new ComponentName( 638c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio service.getResolveInfo().serviceInfo.packageName, 639c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio service.getResolveInfo().serviceInfo.name); 640c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio 641d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data = new SearchIndexableRaw(context); 642d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.key = componentName.flattenToString(); 643d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.title = service.getResolveInfo().loadLabel(packageManager).toString(); 644d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.summaryOn = context.getString(R.string.print_feature_state_on); 645d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.summaryOff = context.getString(R.string.print_feature_state_off); 646d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio data.screenTitle = screenTitle; 647d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio indexables.add(data); 648d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav } 649d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 650d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav return indexables; 651d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav } 652d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav 653d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav @Override 654d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, 655d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav boolean enabled) { 656d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav List<SearchIndexableResource> indexables = new ArrayList<SearchIndexableResource>(); 657d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav SearchIndexableResource indexable = new SearchIndexableResource(context); 658d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav indexable.xmlResId = R.xml.print_settings; 659d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav indexables.add(indexable); 660d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav return indexables; 661d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav } 662d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav }; 663fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina} 664