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