PrintSettingsFragment.java revision 0ad40283bb6b811c26874af3fccf25745f63de8d
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 192d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ComponentName; 202d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ContentResolver; 212d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Context; 222d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Intent; 232d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.PackageManager; 242d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.ResolveInfo; 252d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.database.ContentObserver; 262d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.net.Uri; 272d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Bundle; 282d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Handler; 292d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Message; 302d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.Preference; 312d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.PreferenceScreen; 322d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.printservice.PrintServiceInfo; 332d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.provider.Settings; 342d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.text.TextUtils; 352d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.Menu; 362d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuInflater; 372d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuItem; 382d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.View; 392d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.Switch; 402d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.TextView; 412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 422d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.internal.content.PackageMonitor; 432d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.DialogCreatable; 442d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.R; 452d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.SettingsPreferenceFragment; 462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 472d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.List; 482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/** 502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Fragment with the top level print settings. 512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */ 522d531653595344ed7e61c093dca308b9ba7ec185Svetoslavpublic class PrintSettingsFragment extends SettingsPreferenceFragment implements DialogCreatable { 532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final char ENABLED_PRINT_SERVICES_SEPARATOR = ':'; 552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav // Extras passed to sub-fragments. 572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_PREFERENCE_KEY = "preference_key"; 582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_CHECKED = "checked"; 592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_TITLE = "title"; 602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_ENABLE_WARNING_TITLE = "enable_warning_title"; 612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_ENABLE_WARNING_MESSAGE = "enable_warning_message"; 622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_SETTINGS_TITLE = "settings_title"; 632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name"; 642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_ADD_PRINTERS_TITLE = "add_printers_title"; 652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_ADD_PRINTERS_COMPONENT_NAME = "add_printers_component_name"; 662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav static final String EXTRA_SERVICE_COMPONENT_NAME = "service_component_name"; 672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 680ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav private static final String EXTRA_PRINT_SERVICE_COMPONENT_NAME = 690ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav "EXTRA_PRINT_SERVICE_COMPONENT_NAME"; 700ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav 712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final PackageMonitor mSettingsPackageMonitor = new SettingsPackageMonitor(); 722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final Handler mHandler = new Handler() { 742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void dispatchMessage(Message msg) { 762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav }; 792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private final SettingsContentObserver mSettingsContentObserver = 812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new SettingsContentObserver(mHandler) { 822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onChange(boolean selfChange, Uri uri) { 842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav }; 872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private Preference mNoServicesMessagePreference; 892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onCreate(Bundle icicle) { 922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onCreate(icicle); 932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav addPreferencesFromResource(R.xml.print_settings); 942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getActivity().getActionBar().setTitle(R.string.print_settings_title); 952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onResume() { 992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onResume(); 1002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false); 1012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsContentObserver.register(getContentResolver()); 1022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav updateServicesPreferences(); 1030ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav startPrintServiceSettingsIfNeeded(); 1042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav setHasOptionsMenu(true); 1052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPause() { 1092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsPackageMonitor.unregister(); 1102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mSettingsContentObserver.unregister(getContentResolver()); 1112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onPause(); 1122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 1152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onCreateOptionsMenu(menu, inflater); 1172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav inflater.inflate(R.menu.print_settings, menu); 11874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov MenuItem menuItem = menu.findItem(R.id.print_menu_item_add_service); 1192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav menuItem.setIntent(new Intent(Intent.ACTION_VIEW, 1202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav Uri.parse(getString(R.string.download_print_service_query)))); 1212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private void updateServicesPreferences() { 1242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav // Since services category is auto generated we have to do a pass 1252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav // to generate it since services can come and go. 1262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getPreferenceScreen().removeAll(); 1272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav List<ComponentName> enabledServices = SettingsUtils 1292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav .readEnabledPrintServices(getActivity()); 1302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav List<ResolveInfo> installedServices = getActivity().getPackageManager() 1322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav .queryIntentServices( 1332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new Intent(android.printservice.PrintService.SERVICE_INTERFACE), 1342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); 1352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav final int installedServiceCount = installedServices.size(); 1372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav for (int i = 0; i < installedServiceCount; i++) { 1382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav ResolveInfo installedService = installedServices.get(i); 1392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PreferenceScreen preference = getPreferenceManager().createPreferenceScreen( 1412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getActivity()); 1422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String title = installedService.loadLabel(getPackageManager()).toString(); 1442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setTitle(title); 1452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav ComponentName componentName = new ComponentName( 1472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService.serviceInfo.packageName, 1482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService.serviceInfo.name); 1492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setKey(componentName.flattenToString()); 1502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setOrder(i); 1522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setFragment(PrintServiceSettingsFragment.class.getName()); 1532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setPersistent(false); 1542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav final boolean serviceEnabled = enabledServices.contains(componentName); 1562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (serviceEnabled) { 1572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setSummary(getString(R.string.print_feature_state_on)); 1582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } else { 1592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav preference.setSummary(getString(R.string.print_feature_state_off)); 1602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav Bundle extras = preference.getExtras(); 1632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey()); 1642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putBoolean(EXTRA_CHECKED, serviceEnabled); 1652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_TITLE, title); 1662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav PrintServiceInfo printServiceInfo = PrintServiceInfo.create( 1682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav installedService, getActivity()); 1692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav CharSequence applicationLabel = installedService.loadLabel(getPackageManager()); 1712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString( 1732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav R.string.print_service_security_warning_title, applicationLabel)); 1742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString( 1752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav R.string.print_service_security_warning_summary, applicationLabel)); 1762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String settingsClassName = printServiceInfo.getSettingsActivityName(); 1782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (!TextUtils.isEmpty(settingsClassName)) { 1792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SETTINGS_TITLE, 1802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getString(R.string.print_menu_item_settings)); 1812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SETTINGS_COMPONENT_NAME, 1822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new ComponentName(installedService.serviceInfo.packageName, 1832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav settingsClassName).flattenToString()); 1842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String addPrinterClassName = printServiceInfo.getAddPrintersActivityName(); 1872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (!TextUtils.isEmpty(addPrinterClassName)) { 1882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ADD_PRINTERS_TITLE, 1892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getString(R.string.print_menu_item_add_printers)); 1902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_ADD_PRINTERS_COMPONENT_NAME, 1912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav new ComponentName(installedService.serviceInfo.packageName, 1922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav addPrinterClassName).flattenToString()); 1932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString()); 1962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 1972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getPreferenceScreen().addPreference(preference); 1982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 1992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (getPreferenceScreen().getPreferenceCount() == 0) { 2012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (mNoServicesMessagePreference == null) { 2022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mNoServicesMessagePreference = new Preference(getActivity()) { 2032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav protected void onBindView(View view) { 2052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.onBindView(view); 2062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav TextView summaryView = (TextView) view.findViewById(R.id.summary); 2072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav String title = getString(R.string.print_no_services_installed); 2082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav summaryView.setText(title); 2092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav }; 2112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mNoServicesMessagePreference.setPersistent(false); 2122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mNoServicesMessagePreference.setLayoutResource( 2132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav R.layout.text_description_preference); 2142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mNoServicesMessagePreference.setSelectable(false); 2152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav getPreferenceScreen().addPreference(mNoServicesMessagePreference); 2172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2200ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav private void startPrintServiceSettingsIfNeeded() { 2210ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (getArguments() == null) { 2220ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav return; 2230ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 2240ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav String componentName = getArguments().getString(EXTRA_PRINT_SERVICE_COMPONENT_NAME); 2250ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (componentName != null) { 2260ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav getArguments().remove(EXTRA_PRINT_SERVICE_COMPONENT_NAME); 2270ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav Preference prereference = findPreference(componentName); 2280ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav if (prereference != null) { 2290ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav prereference.performClick(getPreferenceScreen()); 2300ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 2310ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 2320ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav } 2330ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav 2342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private class SettingsPackageMonitor extends PackageMonitor { 2352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageAdded(String packageName, int uid) { 2372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 2382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageAppeared(String packageName, int reason) { 2422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 2432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageDisappeared(String packageName, int reason) { 2472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 2482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void onPackageRemoved(String packageName, int uid) { 2522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mHandler.obtainMessage().sendToTarget(); 2532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public static class ToggleSwitch extends Switch { 2572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private OnBeforeCheckedChangeListener mOnBeforeListener; 2592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public static interface OnBeforeCheckedChangeListener { 2612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked); 2622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public ToggleSwitch(Context context) { 2652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super(context); 2662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void setOnBeforeCheckedChangeListener(OnBeforeCheckedChangeListener listener) { 2692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav mOnBeforeListener = listener; 2702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 2732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void setChecked(boolean checked) { 2742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav if (mOnBeforeListener != null 2752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav && mOnBeforeListener.onBeforeCheckedChanged(this, checked)) { 2762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav return; 2772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.setChecked(checked); 2792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void setCheckedInternal(boolean checked) { 2822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super.setChecked(checked); 2832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav private static abstract class SettingsContentObserver extends ContentObserver { 2872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public SettingsContentObserver(Handler handler) { 2892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav super(handler); 2902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void register(ContentResolver contentResolver) { 2932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav contentResolver.registerContentObserver(Settings.Secure.getUriFor( 2942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav Settings.Secure.ENABLED_PRINT_SERVICES), false, this); 2952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 2962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 2972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public void unregister(ContentResolver contentResolver) { 2982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav contentResolver.unregisterContentObserver(this); 2992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav 3012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav @Override 3022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav public abstract void onChange(boolean selfChange, Uri uri); 3032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav } 3042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav} 305