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
This commit is contained in:
@@ -129,7 +129,7 @@ public final class DynamicIndexableContentMonitor implements
|
|||||||
mContext = context;
|
mContext = context;
|
||||||
mIndex = index;
|
mIndex = index;
|
||||||
|
|
||||||
PACKAGE_CHANGE_MONITOR.register(context);
|
PACKAGE_CHANGE_MONITOR.registerMonitor(context);
|
||||||
mHasFeaturePrinting = context.getPackageManager()
|
mHasFeaturePrinting = context.getPackageManager()
|
||||||
.hasSystemFeature(PackageManager.FEATURE_PRINTING);
|
.hasSystemFeature(PackageManager.FEATURE_PRINTING);
|
||||||
if (mHasFeaturePrinting) {
|
if (mHasFeaturePrinting) {
|
||||||
@@ -154,7 +154,7 @@ public final class DynamicIndexableContentMonitor implements
|
|||||||
public void unregister(Activity activity, int loaderId) {
|
public void unregister(Activity activity, int loaderId) {
|
||||||
if (mIndex == null) return;
|
if (mIndex == null) return;
|
||||||
|
|
||||||
PACKAGE_CHANGE_MONITOR.unregister();
|
PACKAGE_CHANGE_MONITOR.unregisterMonitor();
|
||||||
if (mHasFeaturePrinting) {
|
if (mHasFeaturePrinting) {
|
||||||
activity.getLoaderManager().destroyLoader(loaderId);
|
activity.getLoaderManager().destroyLoader(loaderId);
|
||||||
}
|
}
|
||||||
@@ -240,15 +240,31 @@ public final class DynamicIndexableContentMonitor implements
|
|||||||
private static class PackageChangeMonitor extends PackageMonitor {
|
private static class PackageChangeMonitor extends PackageMonitor {
|
||||||
private static final String TAG = PackageChangeMonitor.class.getSimpleName();
|
private static final String TAG = PackageChangeMonitor.class.getSimpleName();
|
||||||
|
|
||||||
// Null if not initialized.
|
// Null if not initialized. Guarded by {@link #mLock}.
|
||||||
@Nullable private PackageManager mPackageManager;
|
@Nullable private PackageManager mPackageManager;
|
||||||
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
public void register(Context context) {
|
public void registerMonitor(Context context) {
|
||||||
mPackageManager = context.getPackageManager();
|
synchronized (mLock) {
|
||||||
|
if (mPackageManager != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mPackageManager = context.getPackageManager();
|
||||||
|
|
||||||
// Start tracking packages. Use background thread for monitoring. Note that no need to
|
// Start tracking packages. Use background thread for monitoring. Note that no need
|
||||||
// unregister this monitor. This should be alive while Settings app is running.
|
// to unregister this monitor. This should be alive while Settings app is running.
|
||||||
register(context, null /* thread */, UserHandle.CURRENT, false);
|
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.
|
// Covers installed, appeared external storage with the package, upgraded.
|
||||||
|
Reference in New Issue
Block a user