DynamicIndexableContentMonito should respect lacking software features.

We have software features that are optional and developers should check if
these feature are available before use their APIs which are nop if the feature
is not present. DynamicIndexableContentMonito is observing changes in print
services and IMEs but printing and IMEs are optional features. Now we are
checking before tracking these features.

bug:14653371

Change-Id: I3003c645e637aa7d7118c80b4453a54b8ac8bf9a
This commit is contained in:
Svetoslav
2014-05-08 14:43:18 -07:00
parent 9ed4f1c6ef
commit 149c1361f1

View File

@@ -74,10 +74,15 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
}
};
private final ContentObserver mContentObserver = new MyContentObserver(mHandler);
private final ContentObserver mUserDictionaryContentObserver =
new UserDictionaryContentObserver(mHandler);
private Context mContext;
private boolean mHasFeturePrinting;
private boolean mHasFetureIme;
private static Intent getAccessibilityServiceIntent(String packageName) {
final Intent intent = new Intent(AccessibilityService.SERVICE_INTERFACE);
intent.setPackage(packageName);
@@ -99,6 +104,11 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
public void register(Context context) {
mContext = context;
mHasFeturePrinting = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PRINTING);
mHasFetureIme = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INPUT_METHODS);
// Cache accessibility service packages to know when they go away.
AccessibilityManager accessibilityManager = (AccessibilityManager)
mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
@@ -114,35 +124,39 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
mAccessibilityServices.add(resolveInfo.serviceInfo.packageName);
}
// 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;
if (mHasFeturePrinting) {
// 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);
}
mPrintServices.add(resolveInfo.serviceInfo.packageName);
}
// Cache IME service packages to know when they go away.
InputMethodManager imeManager = (InputMethodManager)
mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethods = imeManager.getInputMethodList();
final int inputMethodCount = inputMethods.size();
for (int i = 0; i < inputMethodCount; i++) {
InputMethodInfo inputMethod = inputMethods.get(i);
ServiceInfo serviceInfo = inputMethod.getServiceInfo();
if (serviceInfo == null) continue;
mImeServices.add(serviceInfo.packageName);
}
if (mHasFetureIme) {
InputMethodManager imeManager = (InputMethodManager)
mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethods = imeManager.getInputMethodList();
final int inputMethodCount = inputMethods.size();
for (int i = 0; i < inputMethodCount; i++) {
InputMethodInfo inputMethod = inputMethods.get(i);
ServiceInfo serviceInfo = inputMethod.getServiceInfo();
if (serviceInfo == null) continue;
mImeServices.add(serviceInfo.packageName);
}
// Watch for related content URIs.
mContext.getContentResolver().registerContentObserver(
UserDictionary.Words.CONTENT_URI, true, mContentObserver);
// Watch for related content URIs.
mContext.getContentResolver().registerContentObserver(
UserDictionary.Words.CONTENT_URI, true, mUserDictionaryContentObserver);
}
// Watch for input device changes.
InputManager inputManager = (InputManager) context.getSystemService(
@@ -160,7 +174,10 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
Context.INPUT_SERVICE);
inputManager.unregisterInputDeviceListener(this);
mContext.getContentResolver().unregisterContentObserver(mContentObserver);
if (mHasFetureIme) {
mContext.getContentResolver().unregisterContentObserver(
mUserDictionaryContentObserver);
}
mAccessibilityServices.clear();
mPrintServices.clear();
@@ -225,21 +242,25 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
}
}
if (!mPrintServices.contains(packageName)) {
final Intent intent = getPrintServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
mPrintServices.add(packageName);
Index.getInstance(mContext).updateFromClassNameResource(
PrintSettingsFragment.class.getName(), false, true);
if (mHasFeturePrinting) {
if (!mPrintServices.contains(packageName)) {
final Intent intent = getPrintServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
mPrintServices.add(packageName);
Index.getInstance(mContext).updateFromClassNameResource(
PrintSettingsFragment.class.getName(), false, true);
}
}
}
if (!mImeServices.contains(packageName)) {
Intent intent = getIMEServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
mImeServices.add(packageName);
Index.getInstance(mContext).updateFromClassNameResource(
InputMethodAndLanguageSettings.class.getName(), false, true);
if (mHasFetureIme) {
if (!mImeServices.contains(packageName)) {
Intent intent = getIMEServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
mImeServices.add(packageName);
Index.getInstance(mContext).updateFromClassNameResource(
InputMethodAndLanguageSettings.class.getName(), false, true);
}
}
}
}
@@ -252,24 +273,28 @@ public final class DynamicIndexableContentMonitor extends PackageMonitor impleme
AccessibilitySettings.class.getName(), true, true);
}
final int printIndex = mPrintServices.indexOf(packageName);
if (printIndex >= 0) {
mPrintServices.remove(printIndex);
Index.getInstance(mContext).updateFromClassNameResource(
PrintSettingsFragment.class.getName(), true, true);
if (mHasFeturePrinting) {
final int printIndex = mPrintServices.indexOf(packageName);
if (printIndex >= 0) {
mPrintServices.remove(printIndex);
Index.getInstance(mContext).updateFromClassNameResource(
PrintSettingsFragment.class.getName(), true, true);
}
}
final int imeIndex = mImeServices.indexOf(packageName);
if (imeIndex >= 0) {
mImeServices.remove(imeIndex);
Index.getInstance(mContext).updateFromClassNameResource(
InputMethodAndLanguageSettings.class.getName(), true, true);
if (mHasFetureIme) {
final int imeIndex = mImeServices.indexOf(packageName);
if (imeIndex >= 0) {
mImeServices.remove(imeIndex);
Index.getInstance(mContext).updateFromClassNameResource(
InputMethodAndLanguageSettings.class.getName(), true, true);
}
}
}
private final class MyContentObserver extends ContentObserver {
private final class UserDictionaryContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
public UserDictionaryContentObserver(Handler handler) {
super(handler);
}