Make Print Settings use the new PrintManager.getPrintServices loader
This makes sure that all data always stays up to date. printer_dropdown_item.xml: - Reduce the amount of overriden properties PrintServiceSettingsFragment: - Instead receiving most data from PrintSettingsFragment have own loader and keep data up to date - Also the updating of the print service state now has a dedicated PrintManager call instead of relying of the Settings-ContentObserver to transport this information. No more race-conditions, whohoo! DynamicIndexableContentMonitor: - To not rewrite too much code the update logic has to live here but the reading of the actual data is in PrintSettingsFragment. Change-Id: I60715cda8952565d7f68cb24fb7da61a37085887
This commit is contained in:
@@ -18,20 +18,24 @@ package com.android.settings.search;
|
||||
|
||||
import android.accessibilityservice.AccessibilityService;
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.app.Activity;
|
||||
import android.app.LoaderManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.Loader;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.database.ContentObserver;
|
||||
import android.hardware.input.InputManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.UserHandle;
|
||||
import android.print.PrintManager;
|
||||
import android.printservice.PrintService;
|
||||
import android.print.PrintServicesLoader;
|
||||
import android.printservice.PrintServiceInfo;
|
||||
import android.provider.UserDictionary;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
@@ -47,7 +51,8 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class DynamicIndexableContentMonitor extends PackageMonitor implements
|
||||
InputManager.InputDeviceListener {
|
||||
InputManager.InputDeviceListener,
|
||||
LoaderManager.LoaderCallbacks<List<PrintServiceInfo>> {
|
||||
|
||||
private static final long DELAY_PROCESS_PACKAGE_CHANGE = 2000;
|
||||
|
||||
@@ -55,7 +60,6 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
private static final int MSG_PACKAGE_UNAVAILABLE = 2;
|
||||
|
||||
private final List<String> mAccessibilityServices = new ArrayList<String>();
|
||||
private final List<String> mPrintServices = new ArrayList<String>();
|
||||
private final List<String> mImeServices = new ArrayList<String>();
|
||||
|
||||
private final Handler mHandler = new Handler() {
|
||||
@@ -79,7 +83,6 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
new UserDictionaryContentObserver(mHandler);
|
||||
|
||||
private Context mContext;
|
||||
private boolean mHasFeaturePrinting;
|
||||
private boolean mHasFeatureIme;
|
||||
|
||||
private static Intent getAccessibilityServiceIntent(String packageName) {
|
||||
@@ -88,22 +91,16 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
return intent;
|
||||
}
|
||||
|
||||
private static Intent getPrintServiceIntent(String packageName) {
|
||||
final Intent intent = new Intent(PrintService.SERVICE_INTERFACE);
|
||||
intent.setPackage(packageName);
|
||||
return intent;
|
||||
}
|
||||
|
||||
private static Intent getIMEServiceIntent(String packageName) {
|
||||
final Intent intent = new Intent("android.view.InputMethod");
|
||||
intent.setPackage(packageName);
|
||||
return intent;
|
||||
}
|
||||
|
||||
public void register(Context context) {
|
||||
mContext = context;
|
||||
public void register(Activity activity, int loaderId) {
|
||||
mContext = activity;
|
||||
|
||||
mHasFeaturePrinting = mContext.getPackageManager().hasSystemFeature(
|
||||
boolean hasFeaturePrinting = mContext.getPackageManager().hasSystemFeature(
|
||||
PackageManager.FEATURE_PRINTING);
|
||||
mHasFeatureIme = mContext.getPackageManager().hasSystemFeature(
|
||||
PackageManager.FEATURE_INPUT_METHODS);
|
||||
@@ -123,20 +120,8 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
mAccessibilityServices.add(resolveInfo.serviceInfo.packageName);
|
||||
}
|
||||
|
||||
if (mHasFeaturePrinting) {
|
||||
// Cache print service packages to know when they go away.
|
||||
PrintManager printManager = (PrintManager)
|
||||
mContext.getSystemService(Context.PRINT_SERVICE);
|
||||
List<PrintServiceInfo> printServices = printManager.getInstalledPrintServices();
|
||||
final int serviceCount = printServices.size();
|
||||
for (int i = 0; i < serviceCount; i++) {
|
||||
PrintServiceInfo printService = printServices.get(i);
|
||||
ResolveInfo resolveInfo = printService.getResolveInfo();
|
||||
if (resolveInfo == null || resolveInfo.serviceInfo == null) {
|
||||
continue;
|
||||
}
|
||||
mPrintServices.add(resolveInfo.serviceInfo.packageName);
|
||||
}
|
||||
if (hasFeaturePrinting) {
|
||||
activity.getLoaderManager().initLoader(loaderId, null, this);
|
||||
}
|
||||
|
||||
// Cache IME service packages to know when they go away.
|
||||
@@ -158,12 +143,12 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
}
|
||||
|
||||
// Watch for input device changes.
|
||||
InputManager inputManager = (InputManager) context.getSystemService(
|
||||
InputManager inputManager = (InputManager) activity.getSystemService(
|
||||
Context.INPUT_SERVICE);
|
||||
inputManager.registerInputDeviceListener(this, mHandler);
|
||||
|
||||
// Start tracking packages.
|
||||
register(context, Looper.getMainLooper(), UserHandle.CURRENT, false);
|
||||
register(activity, Looper.getMainLooper(), UserHandle.CURRENT, false);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
@@ -179,7 +164,6 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
}
|
||||
|
||||
mAccessibilityServices.clear();
|
||||
mPrintServices.clear();
|
||||
mImeServices.clear();
|
||||
}
|
||||
|
||||
@@ -242,18 +226,6 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
}
|
||||
}
|
||||
|
||||
if (mHasFeaturePrinting) {
|
||||
if (!mPrintServices.contains(packageName)) {
|
||||
final Intent intent = getPrintServiceIntent(packageName);
|
||||
List<?> services = mContext.getPackageManager().queryIntentServices(intent, 0);
|
||||
if (services != null && !services.isEmpty()) {
|
||||
mPrintServices.add(packageName);
|
||||
Index.getInstance(mContext).updateFromClassNameResource(
|
||||
PrintSettingsFragment.class.getName(), false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mHasFeatureIme) {
|
||||
if (!mImeServices.contains(packageName)) {
|
||||
Intent intent = getIMEServiceIntent(packageName);
|
||||
@@ -275,15 +247,6 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
AccessibilitySettings.class.getName(), true, true);
|
||||
}
|
||||
|
||||
if (mHasFeaturePrinting) {
|
||||
final int printIndex = mPrintServices.indexOf(packageName);
|
||||
if (printIndex >= 0) {
|
||||
mPrintServices.remove(printIndex);
|
||||
Index.getInstance(mContext).updateFromClassNameResource(
|
||||
PrintSettingsFragment.class.getName(), true, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (mHasFeatureIme) {
|
||||
final int imeIndex = mImeServices.indexOf(packageName);
|
||||
if (imeIndex >= 0) {
|
||||
@@ -294,6 +257,25 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Loader<List<PrintServiceInfo>> onCreateLoader(int id, Bundle args) {
|
||||
return new PrintServicesLoader(
|
||||
(PrintManager) mContext.getSystemService(Context.PRINT_SERVICE), mContext,
|
||||
PrintManager.ALL_SERVICES);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<List<PrintServiceInfo>> loader,
|
||||
List<PrintServiceInfo> services) {
|
||||
Index.getInstance(mContext).updateFromClassNameResource(
|
||||
PrintSettingsFragment.class.getName(), false, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(Loader<List<PrintServiceInfo>> loader) {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
private final class UserDictionaryContentObserver extends ContentObserver {
|
||||
|
||||
public UserDictionaryContentObserver(Handler handler) {
|
||||
|
||||
Reference in New Issue
Block a user