PrintSettingsFragment.java revision 0ec96fe64cea4d27e866fc2dc17b799cf9c265a4
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;
372d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.Preference;
38bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.preference.PreferenceCategory;
392d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.PreferenceScreen;
40bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJob;
41bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobId;
42bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobInfo;
43bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager;
44bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager.PrintJobStateChangeListener;
452d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.printservice.PrintServiceInfo;
46d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport android.provider.SearchIndexableResource;
472d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.provider.Settings;
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);
191bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        getListView().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        }
3050ec96fe64cea4d27e866fc2dc17b799cf9c265a4Makoto Onuki        Preference preference = new Preference(getContext());
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) {
3320ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav                prereference.performClick(getPreferenceScreen());
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