12d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/*
22d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Copyright (C) 2013 The Android Open Source Project
32d531653595344ed7e61c093dca308b9ba7ec185Svetoslav *
42d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Licensed under the Apache License, Version 2.0 (the "License");
52d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * you may not use this file except in compliance with the License.
62d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * You may obtain a copy of the License at
72d531653595344ed7e61c093dca308b9ba7ec185Svetoslav *
82d531653595344ed7e61c093dca308b9ba7ec185Svetoslav *      http://www.apache.org/licenses/LICENSE-2.0
92d531653595344ed7e61c093dca308b9ba7ec185Svetoslav *
102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Unless required by applicable law or agreed to in writing, software
112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * distributed under the License is distributed on an "AS IS" BASIS,
122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * See the License for the specific language governing permissions and
142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * limitations under the License.
152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */
162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
172d531653595344ed7e61c093dca308b9ba7ec185Svetoslavpackage com.android.settings.print;
182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
192d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.app.Activity;
202d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.app.AlertDialog;
212d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.app.Dialog;
222d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.app.LoaderManager;
232d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ComponentName;
242d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.ContentResolver;
252d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Context;
262d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.DialogInterface;
272d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Intent;
282d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.Loader;
292d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.PackageInfo;
302d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.content.pm.PackageManager.NameNotFoundException;
31bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.content.pm.ResolveInfo;
322d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.database.ContentObserver;
3343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganovimport android.database.DataSetObserver;
34a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslavimport android.graphics.Color;
35a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslavimport android.graphics.drawable.ColorDrawable;
36a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslavimport android.graphics.drawable.Drawable;
372d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.net.Uri;
382d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Bundle;
392d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.os.Handler;
402d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.print.PrintManager;
412d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.print.PrinterDiscoverySession;
422d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.print.PrinterDiscoverySession.OnPrintersChangeListener;
432d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.print.PrinterId;
442d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.print.PrinterInfo;
452d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.text.TextUtils;
462d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.util.Log;
472d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.Menu;
482d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuInflater;
492d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.MenuItem;
502d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.View;
512d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.view.ViewGroup;
5239392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslavimport android.view.accessibility.AccessibilityManager;
532d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.BaseAdapter;
5474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganovimport android.widget.Filter;
5574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganovimport android.widget.Filterable;
56a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslavimport android.widget.ImageView;
57bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganovimport android.widget.ListView;
5874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganovimport android.widget.SearchView;
597ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglioimport android.widget.Switch;
602d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport android.widget.TextView;
612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
628a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
632d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.R;
647ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglioimport com.android.settings.SettingsActivity;
652d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport com.android.settings.SettingsPreferenceFragment;
662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
672d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.ArrayList;
682d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.LinkedHashMap;
692d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.List;
702d531653595344ed7e61c093dca308b9ba7ec185Svetoslavimport java.util.Map;
712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
727ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglioimport com.android.settings.widget.SwitchBar;
737ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglioimport com.android.settings.widget.ToggleSwitch;
747ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio
752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav/**
762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav * Fragment with print service settings.
772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav */
782d531653595344ed7e61c093dca308b9ba7ec185Svetoslavpublic class PrintServiceSettingsFragment extends SettingsPreferenceFragment
797ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio        implements DialogInterface.OnClickListener, SwitchBar.OnSwitchChangeListener {
802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private static final int LOADER_ID_PRINTERS_LOADER = 1;
822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private static final int DIALOG_ID_ENABLE_WARNING = 1;
842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private final SettingsContentObserver mSettingsContentObserver =
862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            new SettingsContentObserver(new Handler()) {
872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onChange(boolean selfChange, Uri uri) {
89bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            updateUiForServiceState();
9043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
9143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    };
9243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
9343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    private final DataSetObserver mDataObserver = new DataSetObserver() {
9443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        @Override
9543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        public void onChanged() {
9643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            invalidateOptionsMenuIfNeeded();
979a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            updateEmptyView();
9843557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
9943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
10043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        @Override
10143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        public void onInvalidated() {
10243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            invalidateOptionsMenuIfNeeded();
10343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
10443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
10543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        private void invalidateOptionsMenuIfNeeded() {
10643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            final int unfilteredItemCount = mPrintersAdapter.getUnfilteredCount();
10743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            if ((mLastUnfilteredItemCount <= 0 && unfilteredItemCount > 0)
10843557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                    || mLastUnfilteredItemCount > 0 && unfilteredItemCount <= 0) {
10943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                getActivity().invalidateOptionsMenu();
11043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            }
11143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            mLastUnfilteredItemCount = unfilteredItemCount;
1122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
1132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    };
1142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1157ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio    private SwitchBar mSwitchBar;
11600b5e6b24741257352da975966ebe6c143b2eff5Fabrice Di Meglio    private ToggleSwitch mToggleSwitch;
1172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
118bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private String mPreferenceKey;
1192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
120bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private CharSequence mSettingsTitle;
121bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private Intent mSettingsIntent;
1222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
123bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private CharSequence mAddPrintersTitle;
124bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private Intent mAddPrintersIntent;
1252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private CharSequence mEnableWarningTitle;
1272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private CharSequence mEnableWarningMessage;
1282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private ComponentName mComponentName;
1302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
13143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    private PrintersAdapter mPrintersAdapter;
13243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
1332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    // TODO: Showing sub-sub fragment does not handle the activity title
1342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    // so we do it but this is wrong. Do a real fix when there is time.
1352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private CharSequence mOldActivityTitle;
1362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
13743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    private int mLastUnfilteredItemCount;
13843557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
13943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    private boolean mServiceEnabled;
14043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
1417468085405348583df7f33ce094dd91dd027bab6Raju Yadav    private SearchView mSearchView;
1427468085405348583df7f33ce094dd91dd027bab6Raju Yadav
1432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1448a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
1458a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.PRINT_SERVICE_SETTINGS;
1468a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
1478a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1488a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
149077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki    public void onCreate(Bundle icicle) {
150077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki        super.onCreate(icicle);
151077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki
152077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki        String title = getArguments().getString(PrintSettingsFragment.EXTRA_TITLE);
153077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki        if (!TextUtils.isEmpty(title)) {
154077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki            getActivity().setTitle(title);
155077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki        }
156077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki    }
157077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki
158077a7173c6605208ac4d24595e906f6e06808770Makoto Onuki    @Override
1592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onResume() {
1602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onResume();
161bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        mSettingsContentObserver.register(getContentResolver());
162bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        updateEmptyView();
163bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        updateUiForServiceState();
1642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onPause() {
1682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mSettingsContentObserver.unregister(getContentResolver());
1697468085405348583df7f33ce094dd91dd027bab6Raju Yadav        if (mSearchView != null) {
1707468085405348583df7f33ce094dd91dd027bab6Raju Yadav            mSearchView.setOnQueryTextListener(null);
1717468085405348583df7f33ce094dd91dd027bab6Raju Yadav        }
1722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onPause();
1732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onViewCreated(View view, Bundle savedInstanceState) {
1772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onViewCreated(view, savedInstanceState);
178bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        initComponents();
179bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        updateUiForArguments();
1802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
1832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onDestroyView() {
1842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        if (mOldActivityTitle != null) {
1852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            getActivity().getActionBar().setTitle(mOldActivityTitle);
1862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
1872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onDestroyView();
188138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.removeOnSwitchChangeListener(this);
189138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.hide();
1902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
1912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
1922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private void onPreferenceToggled(String preferenceKey, boolean enabled) {
1932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        ComponentName service = ComponentName.unflattenFromString(preferenceKey);
19463609c58a0ae857cc6ec62d28d73e2a0fb8241e9Fabrice Di Meglio        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
1952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        if (enabled) {
1962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            services.add(service);
1972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        } else {
1982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            services.remove(service);
1992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
20063609c58a0ae857cc6ec62d28d73e2a0fb8241e9Fabrice Di Meglio        PrintSettingsUtils.writeEnabledPrintServices(getActivity(), services);
2012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
2022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
2042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public Dialog onCreateDialog(int dialogId) {
2052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        CharSequence title = null;
2062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        CharSequence message = null;
2072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        switch (dialogId) {
2082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            case DIALOG_ID_ENABLE_WARNING:
2092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                title = mEnableWarningTitle;
2102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                message = mEnableWarningMessage;
2112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                break;
2122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            default:
2132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                throw new IllegalArgumentException();
2142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
2152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        return new AlertDialog.Builder(getActivity())
2162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .setTitle(title)
2172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .setMessage(message)
2182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .setCancelable(true)
2192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .setPositiveButton(android.R.string.ok, this)
2202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .setNegativeButton(android.R.string.cancel, this)
2212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .create();
2222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
2232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
2242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
2252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onClick(DialogInterface dialog, int which) {
2262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        final boolean checked;
2272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        switch (which) {
2282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            case DialogInterface.BUTTON_POSITIVE:
2292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                checked = true;
230006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio                mSwitchBar.setCheckedInternal(checked);
2312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                getArguments().putBoolean(PrintSettingsFragment.EXTRA_CHECKED, checked);
2322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                onPreferenceToggled(mPreferenceKey, checked);
2332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                break;
2342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            case DialogInterface.BUTTON_NEGATIVE:
2352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                checked = false;
236006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio                mSwitchBar.setCheckedInternal(checked);
2372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                getArguments().putBoolean(PrintSettingsFragment.EXTRA_CHECKED, checked);
2382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                onPreferenceToggled(mPreferenceKey, checked);
2392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                break;
2402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            default:
2412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                throw new IllegalArgumentException();
2422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
2432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
2442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
245bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private void updateEmptyView() {
246bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        ListView listView = getListView();
247bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        ViewGroup contentRoot = (ViewGroup) listView.getParent();
248bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        View emptyView = listView.getEmptyView();
24900b5e6b24741257352da975966ebe6c143b2eff5Fabrice Di Meglio        if (!mToggleSwitch.isChecked()) {
2509a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            if (emptyView != null && emptyView.getId() != R.id.empty_print_state) {
251bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                contentRoot.removeView(emptyView);
252bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                emptyView = null;
253bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
254bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (emptyView == null) {
255bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                emptyView = getActivity().getLayoutInflater().inflate(
256bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        R.layout.empty_print_state, contentRoot, false);
2579a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                ImageView iconView = (ImageView) emptyView.findViewById(R.id.icon);
2589a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                iconView.setContentDescription(getString(R.string.print_service_disabled));
259bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                TextView textView = (TextView) emptyView.findViewById(R.id.message);
260bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                textView.setText(R.string.print_service_disabled);
261bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                contentRoot.addView(emptyView);
262bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                listView.setEmptyView(emptyView);
263bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
264bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        } else if (mPrintersAdapter.getUnfilteredCount() <= 0) {
265bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (emptyView != null
266bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                    && emptyView.getId() != R.id.empty_printers_list_service_enabled) {
267bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                contentRoot.removeView(emptyView);
268bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                emptyView = null;
269bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
270bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            if (emptyView == null) {
271bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                emptyView = getActivity().getLayoutInflater().inflate(
272bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                        R.layout.empty_printers_list_service_enabled, contentRoot, false);
273bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                contentRoot.addView(emptyView);
274bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov                listView.setEmptyView(emptyView);
275bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            }
2769a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav        } else if (mPrintersAdapter.getCount() <= 0) {
2779a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            if (emptyView != null && emptyView.getId() != R.id.empty_print_state) {
2789a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                contentRoot.removeView(emptyView);
2799a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                emptyView = null;
2809a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            }
2819a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            if (emptyView == null) {
2829a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                emptyView = getActivity().getLayoutInflater().inflate(
2839a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                        R.layout.empty_print_state, contentRoot, false);
2849a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                ImageView iconView = (ImageView) emptyView.findViewById(R.id.icon);
2859a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                iconView.setContentDescription(getString(R.string.print_no_printers_found));
2869a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                TextView textView = (TextView) emptyView.findViewById(R.id.message);
2879a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                textView.setText(R.string.print_no_printers_found);
2889a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                contentRoot.addView(emptyView);
2899a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav                listView.setEmptyView(emptyView);
2909a2ace95870b72bdea6c630c5f7b1ce0c8634cbcSvetoslav            }
291bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
292bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    }
293bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
294bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private void updateUiForServiceState() {
29563609c58a0ae857cc6ec62d28d73e2a0fb8241e9Fabrice Di Meglio        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
29643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        mServiceEnabled = services.contains(mComponentName);
29743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        if (mServiceEnabled) {
298006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio            mSwitchBar.setCheckedInternal(true);
29943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            mPrintersAdapter.enable();
30043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        } else {
301006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio            mSwitchBar.setCheckedInternal(false);
30243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            mPrintersAdapter.disable();
30343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
30443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        getActivity().invalidateOptionsMenu();
30543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov    }
30643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
307bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private void initComponents() {
308bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        mPrintersAdapter = new PrintersAdapter();
309bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        mPrintersAdapter.registerDataSetObserver(mDataObserver);
310bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
3117ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio        final SettingsActivity activity = (SettingsActivity) getActivity();
3127ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio
3137ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio        mSwitchBar = activity.getSwitchBar();
314138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.addOnSwitchChangeListener(this);
315138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio        mSwitchBar.show();
31600b5e6b24741257352da975966ebe6c143b2eff5Fabrice Di Meglio
31700b5e6b24741257352da975966ebe6c143b2eff5Fabrice Di Meglio        mToggleSwitch = mSwitchBar.getSwitch();
31800b5e6b24741257352da975966ebe6c143b2eff5Fabrice Di Meglio        mToggleSwitch.setOnBeforeCheckedChangeListener(new ToggleSwitch.OnBeforeCheckedChangeListener() {
3192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            @Override
3202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
3212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                if (checked) {
3222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    if (!TextUtils.isEmpty(mEnableWarningMessage)) {
323006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio                        mSwitchBar.setCheckedInternal(false);
3242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        getArguments().putBoolean(PrintSettingsFragment.EXTRA_CHECKED, false);
3252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        showDialog(DIALOG_ID_ENABLE_WARNING);
3262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        return true;
3272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    }
3282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    onPreferenceToggled(mPreferenceKey, true);
3292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                } else {
3302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    onPreferenceToggled(mPreferenceKey, false);
3312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                }
3322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                return false;
3332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
3342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        });
335bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
336a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav        getListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
337bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        getListView().setAdapter(mPrintersAdapter);
3382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
3392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3407ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio
3417ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio    @Override
3427ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio    public void onSwitchChanged(Switch switchView, boolean isChecked) {
3437ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio        updateEmptyView();
3447ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio    }
3457ba17ab12c90c24cf0baa6644a64c962cb92b699Fabrice Di Meglio
346bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov    private void updateUiForArguments() {
347bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        Bundle arguments = getArguments();
348bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov
3492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Key.
3502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mPreferenceKey = arguments.getString(PrintSettingsFragment.EXTRA_PREFERENCE_KEY);
3512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Enabled.
3532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        final boolean enabled = arguments.getBoolean(PrintSettingsFragment.EXTRA_CHECKED);
354006b2cca1311e61472a8b66fb0c50854fc36d2e7Fabrice Di Meglio        mSwitchBar.setCheckedInternal(enabled);
3552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Settings title and intent.
3572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        String settingsTitle = arguments.getString(PrintSettingsFragment.EXTRA_SETTINGS_TITLE);
3582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        String settingsComponentName = arguments.getString(
3592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PrintSettingsFragment.EXTRA_SETTINGS_COMPONENT_NAME);
3602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        if (!TextUtils.isEmpty(settingsTitle) && !TextUtils.isEmpty(settingsComponentName)) {
3612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            Intent settingsIntent = new Intent(Intent.ACTION_MAIN).setComponent(
3622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    ComponentName.unflattenFromString(settingsComponentName.toString()));
36317e72aa90bfe81b7d25893725f897261f5172673Svetoslav            List<ResolveInfo> resolvedActivities = getPackageManager().queryIntentActivities(
36417e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    settingsIntent, 0);
36517e72aa90bfe81b7d25893725f897261f5172673Svetoslav            if (!resolvedActivities.isEmpty()) {
36617e72aa90bfe81b7d25893725f897261f5172673Svetoslav                // The activity is a component name, therefore it is one or none.
36717e72aa90bfe81b7d25893725f897261f5172673Svetoslav                if (resolvedActivities.get(0).activityInfo.exported) {
36817e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    mSettingsTitle = settingsTitle;
36917e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    mSettingsIntent = settingsIntent;
37017e72aa90bfe81b7d25893725f897261f5172673Svetoslav                }
3712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
3722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Add printers title and intent.
3752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        String addPrintersTitle = arguments.getString(
3762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PrintSettingsFragment.EXTRA_ADD_PRINTERS_TITLE);
3772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        String addPrintersComponentName =
3782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                arguments.getString(PrintSettingsFragment.EXTRA_ADD_PRINTERS_COMPONENT_NAME);
3792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        if (!TextUtils.isEmpty(addPrintersTitle)
3802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                && !TextUtils.isEmpty(addPrintersComponentName)) {
3812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            Intent addPritnersIntent = new Intent(Intent.ACTION_MAIN).setComponent(
3822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    ComponentName.unflattenFromString(addPrintersComponentName.toString()));
38317e72aa90bfe81b7d25893725f897261f5172673Svetoslav            List<ResolveInfo> resolvedActivities = getPackageManager().queryIntentActivities(
38417e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    addPritnersIntent, 0);
38517e72aa90bfe81b7d25893725f897261f5172673Svetoslav            if (!resolvedActivities.isEmpty()) {
38617e72aa90bfe81b7d25893725f897261f5172673Svetoslav                // The activity is a component name, therefore it is one or none.
38717e72aa90bfe81b7d25893725f897261f5172673Svetoslav                if (resolvedActivities.get(0).activityInfo.exported) {
38817e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    mAddPrintersTitle = addPrintersTitle;
38917e72aa90bfe81b7d25893725f897261f5172673Svetoslav                    mAddPrintersIntent = addPritnersIntent;
39017e72aa90bfe81b7d25893725f897261f5172673Svetoslav                }
3912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
3922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
3932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Enable warning title.
3952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mEnableWarningTitle = arguments.getCharSequence(
3962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PrintSettingsFragment.EXTRA_ENABLE_WARNING_TITLE);
3972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
3982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Enable warning message.
3992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mEnableWarningMessage = arguments.getCharSequence(
4002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PrintSettingsFragment.EXTRA_ENABLE_WARNING_MESSAGE);
4012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        // Component name.
4032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        mComponentName = ComponentName.unflattenFromString(arguments
4042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                .getString(PrintSettingsFragment.EXTRA_SERVICE_COMPONENT_NAME));
40543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
40643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        setHasOptionsMenu(true);
4072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
4082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    @Override
4102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        super.onCreateOptionsMenu(menu, inflater);
4122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        inflater.inflate(R.menu.print_service_settings, menu);
4132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        MenuItem addPrinters = menu.findItem(R.id.print_menu_item_add_printer);
41543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        if (mServiceEnabled && !TextUtils.isEmpty(mAddPrintersTitle)
41643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                && mAddPrintersIntent != null) {
4172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            addPrinters.setIntent(mAddPrintersIntent);
4182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        } else {
4192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            menu.removeItem(R.id.print_menu_item_add_printer);
4202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
4212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        MenuItem settings = menu.findItem(R.id.print_menu_item_settings);
42343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        if (mServiceEnabled && !TextUtils.isEmpty(mSettingsTitle)
42443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                && mSettingsIntent != null) {
4252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            settings.setIntent(mSettingsIntent);
4262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        } else {
4272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            menu.removeItem(R.id.print_menu_item_settings);
4282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
4292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
43074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        MenuItem searchItem = menu.findItem(R.id.print_menu_item_search);
43143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        if (mServiceEnabled && mPrintersAdapter.getUnfilteredCount() > 0) {
4327468085405348583df7f33ce094dd91dd027bab6Raju Yadav            mSearchView = (SearchView) searchItem.getActionView();
4337468085405348583df7f33ce094dd91dd027bab6Raju Yadav            mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
43443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                @Override
43543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                public boolean onQueryTextSubmit(String query) {
43643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                    return true;
43743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                }
43874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
43943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                @Override
44043557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                public boolean onQueryTextChange(String searchString) {
44143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                    ((Filterable) getListView().getAdapter()).getFilter().filter(searchString);
44243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                    return true;
44343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                }
44443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            });
4457468085405348583df7f33ce094dd91dd027bab6Raju Yadav            mSearchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
44624e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                @Override
44724e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                public void onViewAttachedToWindow(View view) {
44839392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                    if (AccessibilityManager.getInstance(getActivity()).isEnabled()) {
44939392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                        view.announceForAccessibility(getString(
45039392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                                R.string.print_search_box_shown_utterance));
45139392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                    }
45224e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                }
45324e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                @Override
45424e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                public void onViewDetachedFromWindow(View view) {
45539392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                    Activity activity = getActivity();
45639392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                    if (activity != null && !activity.isFinishing()
45739392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                            && AccessibilityManager.getInstance(activity).isEnabled()) {
45839392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                        view.announceForAccessibility(getString(
45939392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                                R.string.print_search_box_hidden_utterance));
46039392ef9b0434ec704b52178f8dbb3adcfef58f7Svetoslav                    }
46124e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav                }
46224e49f06132dfca6040c27886b1ce0ba895a068cSvetoslav            });
46343557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        } else {
46443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            menu.removeItem(R.id.print_menu_item_search);
46543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
4662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
4672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private static abstract class SettingsContentObserver extends ContentObserver {
4692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
470bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public SettingsContentObserver(Handler handler) {
471bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            super(handler);
472bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
4732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
474bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public void register(ContentResolver contentResolver) {
475263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio            contentResolver.registerContentObserver(android.provider.Settings.Secure.getUriFor(
476263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio                    android.provider.Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
477bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
4782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
479bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public void unregister(ContentResolver contentResolver) {
480bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            contentResolver.unregisterContentObserver(this);
481bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        }
4822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
483bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        @Override
484bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        public abstract void onChange(boolean selfChange, Uri uri);
4852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
4862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
4872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private final class PrintersAdapter extends BaseAdapter
48874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>, Filterable {
48974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        private final Object mLock = new Object();
49074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
4912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>();
4922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
49374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        private final List<PrinterInfo> mFilteredPrinters = new ArrayList<PrinterInfo>();
49474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
49574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        private CharSequence mLastSearchString;
49674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
49743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        public void enable() {
4982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);
4992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
5002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
50143557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        public void disable() {
50243557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            getLoaderManager().destroyLoader(LOADER_ID_PRINTERS_LOADER);
503bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov            mPrinters.clear();
50443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
50543557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
50643557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        public int getUnfilteredCount() {
50743557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov            return mPrinters.size();
50843557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov        }
50943557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov
5102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
51174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        public Filter getFilter() {
51274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            return new Filter() {
51374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                @Override
51474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                protected FilterResults performFiltering(CharSequence constraint) {
51574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    synchronized (mLock) {
51674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        if (TextUtils.isEmpty(constraint)) {
51774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            return null;
51874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        }
51974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        FilterResults results = new FilterResults();
52074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        List<PrinterInfo> filteredPrinters = new ArrayList<PrinterInfo>();
52174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        String constraintLowerCase = constraint.toString().toLowerCase();
52274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        final int printerCount = mPrinters.size();
52374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        for (int i = 0; i < printerCount; i++) {
52474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            PrinterInfo printer = mPrinters.get(i);
52574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            if (printer.getName().toLowerCase().contains(constraintLowerCase)) {
52674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                                filteredPrinters.add(printer);
52774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            }
52874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        }
52974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        results.values = filteredPrinters;
53074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        results.count = filteredPrinters.size();
53174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        return results;
53274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    }
53374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                }
53474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
53574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                @Override
53674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                @SuppressWarnings("unchecked")
53774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                protected void publishResults(CharSequence constraint, FilterResults results) {
53874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    synchronized (mLock) {
53974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        mLastSearchString = constraint;
54074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        mFilteredPrinters.clear();
54174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        if (results == null) {
54274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            mFilteredPrinters.addAll(mPrinters);
54374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        } else {
54474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            List<PrinterInfo> printers = (List<PrinterInfo>) results.values;
54574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                            mFilteredPrinters.addAll(printers);
54674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        }
54774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    }
54874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    notifyDataSetChanged();
54974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                }
55074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            };
55174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        }
55274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov
55374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov        @Override
5542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public int getCount() {
55574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            synchronized (mLock) {
55674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                return mFilteredPrinters.size();
55774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            }
5582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
5592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
5602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
5612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public Object getItem(int position) {
56274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            synchronized (mLock) {
56374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                return mFilteredPrinters.get(position);
56474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            }
5652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
5662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
5672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
5682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public long getItemId(int position) {
5692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            return position;
5702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
5712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
5722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
5732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public View getView(int position, View convertView, ViewGroup parent) {
5742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (convertView == null) {
5752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                convertView = getActivity().getLayoutInflater().inflate(
576a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav                        R.layout.printer_dropdown_item, parent, false);
5772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
5782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
5792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            PrinterInfo printer = (PrinterInfo) getItem(position);
5802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            CharSequence title = printer.getName();
5812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            CharSequence subtitle = null;
582a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            Drawable icon = null;
5832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            try {
5842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PackageInfo packageInfo = getPackageManager().getPackageInfo(
5852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        printer.getId().getServiceName().getPackageName(), 0);
5862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        subtitle = packageInfo.applicationInfo.loadLabel(getPackageManager());
587a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav                        icon = packageInfo.applicationInfo.loadIcon(getPackageManager());
5882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            } catch (NameNotFoundException nnfe) {
5892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                /* ignore */
5902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
5912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
592a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            TextView titleView = (TextView) convertView.findViewById(R.id.title);
5932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            titleView.setText(title);
5942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
595a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            TextView subtitleView = (TextView) convertView.findViewById(R.id.subtitle);
5962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (!TextUtils.isEmpty(subtitle)) {
5972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                subtitleView.setText(subtitle);
5982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                subtitleView.setVisibility(View.VISIBLE);
5992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            } else {
6002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                subtitleView.setText(null);
6012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                subtitleView.setVisibility(View.GONE);
6022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
604a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            ImageView iconView = (ImageView) convertView.findViewById(R.id.icon);
605a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            if (icon != null) {
606a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav                iconView.setImageDrawable(icon);
607a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav                iconView.setVisibility(View.VISIBLE);
608a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            } else {
609a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav                iconView.setVisibility(View.GONE);
610a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav            }
611a749adae03bab347d5bdb53cabb8c7aabf4e7f08Svetoslav
6122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            return convertView;
6132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6169379d935552118e33ccee5aa8383d8f86bdff113Svetoslav        public boolean isEnabled(int position) {
6179379d935552118e33ccee5aa8383d8f86bdff113Svetoslav            return false;
6189379d935552118e33ccee5aa8383d8f86bdff113Svetoslav        }
6199379d935552118e33ccee5aa8383d8f86bdff113Svetoslav
6209379d935552118e33ccee5aa8383d8f86bdff113Svetoslav        @Override
6212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) {
6222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (id == LOADER_ID_PRINTERS_LOADER) {
6232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                return new PrintersLoader(getActivity());
6242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            return null;
6262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onLoadFinished(Loader<List<PrinterInfo>> loader,
6302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                List<PrinterInfo> printers) {
63174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            synchronized (mLock) {
63274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                mPrinters.clear();
63374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                final int printerCount = printers.size();
63474648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                for (int i = 0; i < printerCount; i++) {
63574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    PrinterInfo printer = printers.get(i);
63674648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    if (printer.getId().getServiceName().equals(mComponentName)) {
63774648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                        mPrinters.add(printer);
63874648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    }
63974648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                }
64074648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                mFilteredPrinters.clear();
64174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                mFilteredPrinters.addAll(mPrinters);
64274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                if (!TextUtils.isEmpty(mLastSearchString)) {
64374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                    getFilter().filter(mLastSearchString);
6442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                }
6452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            notifyDataSetChanged();
6472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void onLoaderReset(Loader<List<PrinterInfo>> loader) {
65174648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            synchronized (mLock) {
65274648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                mPrinters.clear();
65374648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov                mFilteredPrinters.clear();
65443557570cfe72b525701ffed65bd1d8f32df67ceSvetoslav Ganov                mLastSearchString = null;
65574648ac808b6a625f6c91035a263822b3765215dSvetoslav Ganov            }
6562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            notifyDataSetInvalidated();
6572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
6592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    private static class PrintersLoader extends Loader<List<PrinterInfo>> {
6612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private static final String LOG_TAG = "PrintersLoader";
6632d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
664bc2c3db8f923b9ee25345f5ebbad9f6c762a1e23Svetoslav Ganov        private static final boolean DEBUG = false;
6652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private final Map<PrinterId, PrinterInfo> mPrinters =
6672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                new LinkedHashMap<PrinterId, PrinterInfo>();
6682d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6692d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private PrinterDiscoverySession mDiscoverySession;
6702d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6712d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public PrintersLoader(Context context) {
6722d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            super(context);
6732d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6742d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6752d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6762d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        public void deliverResult(List<PrinterInfo> printers) {
6772d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (isStarted()) {
6782d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                super.deliverResult(printers);
6792d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6802d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6812d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6822d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6832d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected void onStartLoading() {
6842d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
6852d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onStartLoading()");
6862d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6872d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            // The contract is that if we already have a valid,
6882d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            // result the we have to deliver it immediately.
6892d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (!mPrinters.isEmpty()) {
6902d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                deliverResult(new ArrayList<PrinterInfo>(mPrinters.values()));
6912d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
6922d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            // We want to start discovery at this point.
6932d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            onForceLoad();
6942d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
6952d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
6962d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
6972d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected void onStopLoading() {
6982d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
6992d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onStopLoading()");
7002d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7012d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            onCancelLoad();
7022d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7032d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7042d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
7052d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected void onForceLoad() {
7062d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
7072d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onForceLoad()");
7082d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7092d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            loadInternal();
7102d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7112d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7122d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
7132d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected boolean onCancelLoad() {
7142d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
7152d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onCancelLoad()");
7162d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7172d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            return cancelInternal();
7182d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7192d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7202d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
7212d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected void onReset() {
7222d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
7232d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onReset()");
7242d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7252d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            onStopLoading();
7262d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            mPrinters.clear();
7272d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (mDiscoverySession != null) {
7282d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                mDiscoverySession.destroy();
7292d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                mDiscoverySession = null;
7302d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7312d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7322d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7332d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        @Override
7342d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        protected void onAbandon() {
7352d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (DEBUG) {
7362d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                Log.i(LOG_TAG, "onAbandon()");
7372d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7382d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            onStopLoading();
7392d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7402d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7412d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private boolean cancelInternal() {
7422d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (mDiscoverySession != null
7432d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    && mDiscoverySession.isPrinterDiscoveryStarted()) {
7442d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                mDiscoverySession.stopPrinterDiscovery();
7452d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                return true;
7462d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
7472d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            return false;
7482d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7492d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
7502d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        private void loadInternal() {
7512d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            if (mDiscoverySession == null) {
7522d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                PrintManager printManager = (PrintManager) getContext()
7532d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        .getSystemService(Context.PRINT_SERVICE);
7542d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                mDiscoverySession = printManager.createPrinterDiscoverySession();
7552d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                mDiscoverySession.setOnPrintersChangeListener(new OnPrintersChangeListener() {
7562d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    @Override
7572d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    public void onPrintersChanged() {
7582d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                        deliverResult(new ArrayList<PrinterInfo>(
7592d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                                mDiscoverySession.getPrinters()));
7602d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                    }
7612d531653595344ed7e61c093dca308b9ba7ec185Svetoslav                });
7622d531653595344ed7e61c093dca308b9ba7ec185Svetoslav            }
76324a746b958339e607b0c70c6cb3d30c94d9e8f25<svetoslavganov@google.com>            mDiscoverySession.startPrinterDiscovery(null);
7642d531653595344ed7e61c093dca308b9ba7ec185Svetoslav        }
7652d531653595344ed7e61c093dca308b9ba7ec185Svetoslav    }
7662d531653595344ed7e61c093dca308b9ba7ec185Svetoslav}
7672d531653595344ed7e61c093dca308b9ba7ec185Svetoslav
768