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:
Philip P. Moltmann
2016-02-24 12:11:05 -08:00
parent 52fdd6a058
commit d9779db8c9
6 changed files with 207 additions and 397 deletions

View File

@@ -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) {