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