From 23372e8994dde9604baeafaee516faea47fed726 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 10 Feb 2017 16:58:45 +0900 Subject: [PATCH] Fix monkey crash by guarding singleton initializing Fixes: 35203476 Test: Run monkey test and observe no crash happens. adb shell monkey -p com.google.android.launcher -p com.android.settings -c android.intent.category.LAUNCHER --ignore-security-exceptions --monitor-native-crashes -s 454 -v -v -v 125000 Change-Id: Ib13afcc4e14470510f3ccbb20d7e7d6009347149 --- .../DynamicIndexableContentMonitor.java | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java index c5125bda75f..0cc26887269 100644 --- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java +++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java @@ -129,7 +129,7 @@ public final class DynamicIndexableContentMonitor implements mContext = context; mIndex = index; - PACKAGE_CHANGE_MONITOR.register(context); + PACKAGE_CHANGE_MONITOR.registerMonitor(context); mHasFeaturePrinting = context.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_PRINTING); if (mHasFeaturePrinting) { @@ -154,7 +154,7 @@ public final class DynamicIndexableContentMonitor implements public void unregister(Activity activity, int loaderId) { if (mIndex == null) return; - PACKAGE_CHANGE_MONITOR.unregister(); + PACKAGE_CHANGE_MONITOR.unregisterMonitor(); if (mHasFeaturePrinting) { activity.getLoaderManager().destroyLoader(loaderId); } @@ -240,15 +240,31 @@ public final class DynamicIndexableContentMonitor implements private static class PackageChangeMonitor extends PackageMonitor { private static final String TAG = PackageChangeMonitor.class.getSimpleName(); - // Null if not initialized. + // Null if not initialized. Guarded by {@link #mLock}. @Nullable private PackageManager mPackageManager; + private final Object mLock = new Object(); - public void register(Context context) { - mPackageManager = context.getPackageManager(); + public void registerMonitor(Context context) { + synchronized (mLock) { + if (mPackageManager != null) { + return; + } + mPackageManager = context.getPackageManager(); - // Start tracking packages. Use background thread for monitoring. Note that no need to - // unregister this monitor. This should be alive while Settings app is running. - register(context, null /* thread */, UserHandle.CURRENT, false); + // Start tracking packages. Use background thread for monitoring. Note that no need + // to unregister this monitor. This should be alive while Settings app is running. + super.register(context, null /* thread */, UserHandle.CURRENT, false); + } + } + + public void unregisterMonitor() { + synchronized (mLock) { + if (mPackageManager == null) { + return; + } + super.unregister(); + mPackageManager = null; + } } // Covers installed, appeared external storage with the package, upgraded.