PrintSettingsFragment.java revision fe47a8dc89fe0393dae16b1c2152c901feab4dcb
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
19fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.app.Activity;
20bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.app.ActivityManager;
21bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.app.LoaderManager.LoaderCallbacks;
22bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.content.AsyncTaskLoader;
232d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ComponentName;
242d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ContentResolver;
252d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Context;
262d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Intent;
27bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.content.Loader;
282d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.PackageManager;
292d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.ResolveInfo;
302d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.database.ContentObserver;
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;
37fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.os.Process;
382d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.Preference;
39bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.preference.PreferenceCategory;
402d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.preference.PreferenceScreen;
41bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJob;
42bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobId;
43bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintJobInfo;
44bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager;
45bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.print.PrintManager.PrintJobStateChangeListener;
462d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.printservice.PrintServiceInfo;
47d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport android.provider.SearchIndexableResource;
482d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.provider.Settings;
492d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.text.TextUtils;
50bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.text.format.DateUtils;
51bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.util.Log;
522d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.Menu;
532d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuInflater;
542d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuItem;
552d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.View;
56bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.view.ViewGroup;
57fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.widget.AdapterView;
582d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.TextView;
592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
602d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.internal.content.PackageMonitor;
61fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport com.android.settings.UserSpinnerAdapter;
62fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport com.android.settings.UserSpinnerAdapter.UserDetails;
632d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.DialogCreatable;
642d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.R;
652d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.SettingsPreferenceFragment;
66d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport com.android.settings.search.BaseSearchIndexProvider;
677e920da6564032ddcc40db95925083ef59d19e58Fabrice Di Meglioimport com.android.settings.search.Indexable;
68d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavimport com.android.settings.search.SearchIndexableRaw;
692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
70bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport java.text.DateFormat;
71bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport java.util.ArrayList;
722d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.List;
732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
74fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.widget.AdapterView.OnItemSelectedListener;
75fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghinaimport android.widget.Spinner;
76fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/**
782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Fragment with the top level print settings.
792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */
80d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslavpublic class PrintSettingsFragment extends SettingsPreferenceFragment
81fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        implements DialogCreatable, Indexable, OnItemSelectedListener {
822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
83bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private static final int LOADER_ID_PRINT_JOBS_LOADER = 1;
84bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
85bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private static final String PRINT_JOBS_CATEGORY = "print_jobs_category";
86bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private static final String PRINT_SERVICES_CATEGORY = "print_services_category";
87bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    // Extras passed to sub-fragments.
89bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_PREFERENCE_KEY = "EXTRA_PREFERENCE_KEY";
90bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_CHECKED = "EXTRA_CHECKED";
91bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_TITLE = "EXTRA_TITLE";
92bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_ENABLE_WARNING_TITLE = "EXTRA_ENABLE_WARNING_TITLE";
93bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_ENABLE_WARNING_MESSAGE = "EXTRA_ENABLE_WARNING_MESSAGE";
94bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_SETTINGS_TITLE = "EXTRA_SETTINGS_TITLE";
95bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_SETTINGS_COMPONENT_NAME = "EXTRA_SETTINGS_COMPONENT_NAME";
96bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_ADD_PRINTERS_TITLE = "EXTRA_ADD_PRINTERS_TITLE";
97bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_ADD_PRINTERS_COMPONENT_NAME = "EXTRA_ADD_PRINTERS_COMPONENT_NAME";
98bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_SERVICE_COMPONENT_NAME = "EXTRA_SERVICE_COMPONENT_NAME";
99bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
100bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";
1012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1020ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav    private static final String EXTRA_PRINT_SERVICE_COMPONENT_NAME =
1030ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            "EXTRA_PRINT_SERVICE_COMPONENT_NAME";
1040ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav
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;
126fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    private Context mContext;
127fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    private UserSpinnerAdapter mProfileSpinnerAdapter;
128fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
129fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    @Override
130fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    public void onAttach(Activity activity) {
131fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        super.onAttach(activity);
132fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        mContext = activity;
133fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    }
134bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
1352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onCreate(Bundle icicle) {
1372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onCreate(icicle);
1382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        addPreferencesFromResource(R.xml.print_settings);
139bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
140bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        mActivePrintJobsCategory = (PreferenceCategory) findPreference(
141bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                PRINT_JOBS_CATEGORY);
142d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        mPrintServicesCategory = (PreferenceCategory) findPreference(
143bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                PRINT_SERVICES_CATEGORY);
144bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        getPreferenceScreen().removePreference(mActivePrintJobsCategory);
145bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
146bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        mPrintJobsController = new PrintJobsController();
147bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        getActivity().getLoaderManager().initLoader(LOADER_ID_PRINT_JOBS_LOADER,
148bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                null, mPrintJobsController);
1492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onResume() {
1532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onResume();
1542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
1552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mSettingsContentObserver.register(getContentResolver());
1562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        updateServicesPreferences();
1572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        setHasOptionsMenu(true);
158bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        startSubSettingsIfNeeded();
1592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onPause() {
1632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mSettingsPackageMonitor.unregister();
1642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mSettingsContentObserver.unregister(getContentResolver());
1652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onPause();
1662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onCreateOptionsMenu(menu, inflater);
1715c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        String searchUri = Settings.Secure.getString(getContentResolver(),
1725c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav                Settings.Secure.PRINT_SERVICE_SEARCH_URI);
1735c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        if (!TextUtils.isEmpty(searchUri)) {
1745c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav            MenuItem menuItem = menu.add(R.string.print_menu_item_add_service);
17511a67c14a2969668d00d30a43d12e0685596884fFabrice Di Meglio            menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER);
176d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            menuItem.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(searchUri)));
1775c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        }
1782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
180bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    @Override
181bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    public void onViewCreated(View view, Bundle savedInstanceState) {
182bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        super.onViewCreated(view, savedInstanceState);
183bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        ViewGroup contentRoot = (ViewGroup) getListView().getParent();
184bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        View emptyView = getActivity().getLayoutInflater().inflate(
185d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav                R.layout.empty_print_state, contentRoot, false);
186bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        TextView textView = (TextView) emptyView.findViewById(R.id.message);
187bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        textView.setText(R.string.print_no_services_installed);
188bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        contentRoot.addView(emptyView);
189bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        getListView().setEmptyView(emptyView);
190fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
191fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
192fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        List<UserHandle> userProfiles = um.getUserProfiles();
193fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        if (userProfiles.size() >= 2) {
194fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            Spinner spinner = (Spinner) getActivity().getLayoutInflater().inflate(
195fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina                    R.layout.spinner_view, null);
196fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
197fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            UserHandle myUserHandle = Process.myUserHandle();
198fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            userProfiles.remove(myUserHandle);
199fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            userProfiles.add(0, myUserHandle);
200fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            ArrayList<UserDetails> userDetails = new ArrayList<UserDetails>(userProfiles.size());
201fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            final int count = userProfiles.size();
202fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            for (int i = 0; i < count; i++) {
203fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina                userDetails.add(new UserDetails(userProfiles.get(i), um, mContext));
204fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            }
205fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
206fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            mProfileSpinnerAdapter = new UserSpinnerAdapter(mContext, userDetails);
207fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            spinner.setAdapter(mProfileSpinnerAdapter);
208fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            spinner.setOnItemSelectedListener(this);
209fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            setPinnedHeaderView(spinner);
210fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        }
211bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    }
212bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
2132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private void updateServicesPreferences() {
214bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        if (getPreferenceScreen().findPreference(PRINT_SERVICES_CATEGORY) == null) {
215bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            getPreferenceScreen().addPreference(mPrintServicesCategory);
216bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        } else {
217bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Since services category is auto generated we have to do a pass
218bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // to generate it since services can come and go.
219bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            mPrintServicesCategory.removeAll();
220bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
2212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
22263609c58a0ae857cc6ec62d28d73e2a0fb8241e9Fabrice Di Meglio        List<ComponentName> enabledServices = PrintSettingsUtils
2232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .readEnabledPrintServices(getActivity());
2242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        List<ResolveInfo> installedServices = getActivity().getPackageManager()
2262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .queryIntentServices(
2272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        new Intent(android.printservice.PrintService.SERVICE_INTERFACE),
2282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        PackageManager.GET_SERVICES | PackageManager.GET_META_DATA);
2292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        final int installedServiceCount = installedServices.size();
2312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        for (int i = 0; i < installedServiceCount; i++) {
2322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            ResolveInfo installedService = installedServices.get(i);
2332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            PreferenceScreen preference = getPreferenceManager().createPreferenceScreen(
2352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    getActivity());
2362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            String title = installedService.loadLabel(getPackageManager()).toString();
2382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            preference.setTitle(title);
2392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            ComponentName componentName = new ComponentName(
2412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    installedService.serviceInfo.packageName,
2422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    installedService.serviceInfo.name);
2432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            preference.setKey(componentName.flattenToString());
2442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            preference.setOrder(i);
2462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            preference.setFragment(PrintServiceSettingsFragment.class.getName());
2472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            preference.setPersistent(false);
2482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            final boolean serviceEnabled = enabledServices.contains(componentName);
2502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (serviceEnabled) {
2512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                preference.setSummary(getString(R.string.print_feature_state_on));
2522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            } else {
2532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                preference.setSummary(getString(R.string.print_feature_state_off));
2542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
2552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            Bundle extras = preference.getExtras();
2572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
2582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
2592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putString(EXTRA_TITLE, title);
2602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            PrintServiceInfo printServiceInfo = PrintServiceInfo.create(
2622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    installedService, getActivity());
2632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            CharSequence applicationLabel = installedService.loadLabel(getPackageManager());
2652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString(
2672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    R.string.print_service_security_warning_title, applicationLabel));
2682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString(
2692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    R.string.print_service_security_warning_summary, applicationLabel));
2702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            String settingsClassName = printServiceInfo.getSettingsActivityName();
2722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (!TextUtils.isEmpty(settingsClassName)) {
2732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                extras.putString(EXTRA_SETTINGS_TITLE,
2742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        getString(R.string.print_menu_item_settings));
2752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                extras.putString(EXTRA_SETTINGS_COMPONENT_NAME,
2762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        new ComponentName(installedService.serviceInfo.packageName,
2772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                                settingsClassName).flattenToString());
2782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
2792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            String addPrinterClassName = printServiceInfo.getAddPrintersActivityName();
2812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (!TextUtils.isEmpty(addPrinterClassName)) {
2822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                extras.putString(EXTRA_ADD_PRINTERS_TITLE,
2832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        getString(R.string.print_menu_item_add_printers));
2842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                extras.putString(EXTRA_ADD_PRINTERS_COMPONENT_NAME,
2852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        new ComponentName(installedService.serviceInfo.packageName,
2862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                                addPrinterClassName).flattenToString());
2872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
2882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString());
2902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
291bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            mPrintServicesCategory.addPreference(preference);
2922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
2932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
294bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        if (mPrintServicesCategory.getPreferenceCount() == 0) {
295bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            getPreferenceScreen().removePreference(mPrintServicesCategory);
2962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
2972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
2982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
299bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private void startSubSettingsIfNeeded() {
3000ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav        if (getArguments() == null) {
3010ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            return;
3020ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav        }
3030ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav        String componentName = getArguments().getString(EXTRA_PRINT_SERVICE_COMPONENT_NAME);
3040ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav        if (componentName != null) {
3050ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            getArguments().remove(EXTRA_PRINT_SERVICE_COMPONENT_NAME);
3060ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            Preference prereference = findPreference(componentName);
3070ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            if (prereference != null) {
3080ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav                prereference.performClick(getPreferenceScreen());
3090ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav            }
3100ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav        }
3110ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav    }
3120ad40283bb6b811c26874af3fccf25745f63de8dSvetoslav
313fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    @Override
314fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
315fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        UserHandle selectedUser = mProfileSpinnerAdapter.getUserHandle(position);
316fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        if (selectedUser.getIdentifier() != UserHandle.myUserId()) {
317fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            Intent intent = new Intent(Settings.ACTION_PRINT_SETTINGS);
318fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
319fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            mContext.startActivityAsUser(intent, selectedUser);
320fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina            getActivity().finish();
321fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        }
322fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    }
323fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
324fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    @Override
325fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    public void onNothingSelected(AdapterView<?> parent) {
326fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina        // Nothing to do
327fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina    }
328fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina
3292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private class SettingsPackageMonitor extends PackageMonitor {
3302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
3312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onPackageAdded(String packageName, int uid) {
332d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            mHandler.obtainMessage().sendToTarget();
3332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
3362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onPackageAppeared(String packageName, int reason) {
3372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            mHandler.obtainMessage().sendToTarget();
3382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
3412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onPackageDisappeared(String packageName, int reason) {
3422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            mHandler.obtainMessage().sendToTarget();
3432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
3462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onPackageRemoved(String packageName, int uid) {
3472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            mHandler.obtainMessage().sendToTarget();
3482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
3502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private static abstract class SettingsContentObserver extends ContentObserver {
3522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public SettingsContentObserver(Handler handler) {
3542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            super(handler);
3552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void register(ContentResolver contentResolver) {
3582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            contentResolver.registerContentObserver(Settings.Secure.getUriFor(
3592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
3602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void unregister(ContentResolver contentResolver) {
3632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            contentResolver.unregisterContentObserver(this);
3642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
3672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public abstract void onChange(boolean selfChange, Uri uri);
3682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
369bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
370bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private final class PrintJobsController implements LoaderCallbacks<List<PrintJobInfo>> {
371bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
372bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
373bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public Loader<List<PrintJobInfo>> onCreateLoader(int id, Bundle args) {
374bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (id == LOADER_ID_PRINT_JOBS_LOADER) {
375bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                return new PrintJobsLoader(getActivity());
376bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
377bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            return null;
378bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
379bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
380bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
381bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public void onLoadFinished(Loader<List<PrintJobInfo>> loader,
382bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                List<PrintJobInfo> printJobs) {
383bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (printJobs == null || printJobs.isEmpty()) {
384bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                getPreferenceScreen().removePreference(mActivePrintJobsCategory);
385bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            } else {
386bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                if (getPreferenceScreen().findPreference(PRINT_JOBS_CATEGORY) == null) {
387bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    getPreferenceScreen().addPreference(mActivePrintJobsCategory);
388bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                }
389bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
390bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                mActivePrintJobsCategory.removeAll();
391bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
392bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                final int printJobCount = printJobs.size();
393bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                for (int i = 0; i < printJobCount; i++) {
394bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    PrintJobInfo printJob = printJobs.get(i);
395bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
396bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    PreferenceScreen preference = getPreferenceManager()
397bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                            .createPreferenceScreen(getActivity());
398bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
399bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    preference.setPersistent(false);
400bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    preference.setFragment(PrintJobSettingsFragment.class.getName());
401bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    preference.setKey(printJob.getId().flattenToString());
402bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
403bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    switch (printJob.getState()) {
404bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_QUEUED:
405bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_STARTED: {
40697e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            if (!printJob.isCancelling()) {
40797e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                preference.setTitle(getString(
40897e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        R.string.print_printing_state_title_template,
40997e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        printJob.getLabel()));
41097e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            } else {
41197e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                preference.setTitle(getString(
41297e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        R.string.print_cancelling_state_title_template,
41397e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        printJob.getLabel()));
41497e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            }
415bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        } break;
416bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
417bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_FAILED: {
418bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                            preference.setTitle(getString(
419bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                                    R.string.print_failed_state_title_template,
420bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                                    printJob.getLabel()));
421bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        } break;
422bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
423bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_BLOCKED: {
42497e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            if (!printJob.isCancelling()) {
42597e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                preference.setTitle(getString(
42697e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        R.string.print_blocked_state_title_template,
42797e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        printJob.getLabel()));
42897e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            } else {
42997e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                preference.setTitle(getString(
43097e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        R.string.print_cancelling_state_title_template,
43197e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                                        printJob.getLabel()));
43297e962cd36e1a2bbadc264ec9ce8627a7decf268Svetoslav                            }
433bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        } break;
434bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    }
435bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
436bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    preference.setSummary(getString(R.string.print_job_summary,
437bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                            printJob.getPrinterName(), DateUtils.formatSameDayTime(
438bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                                    printJob.getCreationTime(), printJob.getCreationTime(),
439bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                                    DateFormat.SHORT, DateFormat.SHORT)));
440bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
441bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    switch (printJob.getState()) {
442bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_QUEUED:
443bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_STARTED: {
444bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                            preference.setIcon(com.android.internal.R.drawable.ic_print);
445bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        } break;
446bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
447bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_FAILED:
448bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        case PrintJobInfo.STATE_BLOCKED: {
449bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                            preference.setIcon(com.android.internal.R.drawable.ic_print_error);
450bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        } break;
451bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    }
452bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
453bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    Bundle extras = preference.getExtras();
454d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav                    extras.putString(EXTRA_PRINT_JOB_ID, printJob.getId().flattenToString());
455bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
456bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    mActivePrintJobsCategory.addPreference(preference);
457bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                }
458bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
459bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
460bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
461bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
462bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public void onLoaderReset(Loader<List<PrintJobInfo>> loader) {
463bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            getPreferenceScreen().removePreference(mActivePrintJobsCategory);
464bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
465bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    }
466bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
467bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private static final class PrintJobsLoader extends AsyncTaskLoader<List<PrintJobInfo>> {
468bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
469bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        private static final String LOG_TAG = "PrintJobsLoader";
470bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
471d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav        private static final boolean DEBUG = false;
472bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
473d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        private List<PrintJobInfo> mPrintJobs = new ArrayList<PrintJobInfo>();
474bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
475bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        private final PrintManager mPrintManager;
476bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
477bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        private PrintJobStateChangeListener mPrintJobStateChangeListener;
478bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
479bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public PrintJobsLoader(Context context) {
480bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            super(context);
481bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            mPrintManager = ((PrintManager) context.getSystemService(
482bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    Context.PRINT_SERVICE)).getGlobalPrintManagerForUser(
483d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav                        ActivityManager.getCurrentUser());
484bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
485bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
486bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
487bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public void deliverResult(List<PrintJobInfo> printJobs) {
488bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (isStarted()) {
489bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                super.deliverResult(printJobs);
490bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
491bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
492bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
493bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
494bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        protected void onStartLoading() {
495bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (DEBUG) {
496bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                Log.i(LOG_TAG, "onStartLoading()");
497bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
498bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // If we already have a result, deliver it immediately.
499bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (!mPrintJobs.isEmpty()) {
500bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                deliverResult(new ArrayList<PrintJobInfo>(mPrintJobs));
501bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
502bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Start watching for changes.
503bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (mPrintJobStateChangeListener == null) {
504bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                mPrintJobStateChangeListener = new PrintJobStateChangeListener() {
505bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    @Override
506d9f156ddf072775c894db1ca3c3fe8989be4dbebSvetoslav                    public void onPrintJobStateChanged(PrintJobId printJobId) {
507bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        onForceLoad();
508bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    }
509bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                };
510bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                mPrintManager.addPrintJobStateChangeListener(
511bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        mPrintJobStateChangeListener);
512bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
513bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // If the data changed or we have no data - load it now.
514bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (mPrintJobs.isEmpty()) {
515bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                onForceLoad();
516bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
517bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
518bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
519bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
520bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        protected void onStopLoading() {
521bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (DEBUG) {
522bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                Log.i(LOG_TAG, "onStopLoading()");
523bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
524bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Cancel the load in progress if possible.
525bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            onCancelLoad();
526bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
527bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
528bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
529bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        protected void onReset() {
530bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (DEBUG) {
531bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                Log.i(LOG_TAG, "onReset()");
532bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
533bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Stop loading.
534bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            onStopLoading();
535bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Clear the cached result.
536bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            mPrintJobs.clear();
537bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            // Stop watching for changes.
538bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (mPrintJobStateChangeListener != null) {
539bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                mPrintManager.removePrintJobStateChangeListener(
540bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        mPrintJobStateChangeListener);
541bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                mPrintJobStateChangeListener = null;
542bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
543bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
544bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
545bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
546bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public List<PrintJobInfo> loadInBackground() {
547bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            List<PrintJobInfo> printJobInfos = null;
548bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            List<PrintJob> printJobs = mPrintManager.getPrintJobs();
549bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            final int printJobCount = printJobs.size();
550bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            for (int i = 0; i < printJobCount; i++) {
551bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                PrintJobInfo printJob = printJobs.get(i).getInfo();
552bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                if (shouldShowToUser(printJob)) {
553bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    if (printJobInfos == null) {
554bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        printJobInfos = new ArrayList<PrintJobInfo>();
555bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    }
556bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    printJobInfos.add(printJob);
557bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                }
558bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
559bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            return printJobInfos;
560bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
561bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
562bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        private static boolean shouldShowToUser(PrintJobInfo printJob) {
563bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            switch (printJob.getState()) {
564bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                case PrintJobInfo.STATE_QUEUED:
565bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                case PrintJobInfo.STATE_STARTED:
566bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                case PrintJobInfo.STATE_BLOCKED:
567bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                case PrintJobInfo.STATE_FAILED: {
568bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    return true;
569bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                }
570bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
571bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            return false;
572bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
573bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    }
574d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
575d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
576d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            new BaseSearchIndexProvider() {
577d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        @Override
578d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
579d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            List<SearchIndexableRaw> indexables = new ArrayList<SearchIndexableRaw>();
580d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
581d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            PackageManager packageManager = context.getPackageManager();
582d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            PrintManager printManager = (PrintManager) context.getSystemService(
583d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav                    Context.PRINT_SERVICE);
584d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
5857476f5b904f16a0b330a99fc0f7d900a722554eaFabrice Di Meglio            String screenTitle = context.getResources().getString(R.string.print_settings);
586d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            SearchIndexableRaw data = new SearchIndexableRaw(context);
587d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            data.title = screenTitle;
588d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            data.screenTitle = screenTitle;
589d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            indexables.add(data);
590d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
591d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            // Indexing all services, regardless if enabled.
592d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            List<PrintServiceInfo> services = printManager.getInstalledPrintServices();
593d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            final int serviceCount = services.size();
594d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            for (int i = 0; i < serviceCount; i++) {
595d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav                PrintServiceInfo service = services.get(i);
596c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio
597c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio                ComponentName componentName = new ComponentName(
598c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio                        service.getResolveInfo().serviceInfo.packageName,
599c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio                        service.getResolveInfo().serviceInfo.name);
600c853a4282d0511d4a6886dfa95000c4dddff6a31Fabrice Di Meglio
601d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data = new SearchIndexableRaw(context);
602d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data.key = componentName.flattenToString();
603d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data.title = service.getResolveInfo().loadLabel(packageManager).toString();
604d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data.summaryOn = context.getString(R.string.print_feature_state_on);
605d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data.summaryOff = context.getString(R.string.print_feature_state_off);
606d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                data.screenTitle = screenTitle;
607d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio                indexables.add(data);
608d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            }
609d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
610d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            return indexables;
611d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        }
612d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav
613d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        @Override
614d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
615d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav                boolean enabled) {
616d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            List<SearchIndexableResource> indexables = new ArrayList<SearchIndexableResource>();
617d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            SearchIndexableResource indexable = new SearchIndexableResource(context);
618d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            indexable.xmlResId = R.xml.print_settings;
619d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            indexables.add(indexable);
620d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav            return indexables;
621d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav        }
622d78d44d32ae76e4eab843504114446dec3b22ed3Svetoslav    };
623fe47a8dc89fe0393dae16b1c2152c901feab4dcbAlexandra Gherghina}
624