launcher3: Improve SimpleBroadcastReceiver.
Unless explicitly annotated, parameters in java are by default nullable. There are a few cases where a null context may be passed to the unregisterReceiverSafely function of SimpleBroadcastReceiver. To mitigate misuses or incorrect contexts being passed for register vs unregister, keep the context as a strong reference in the constructor. Also added NonNull annotations for any public callsites to enforce behavior. Bug: 395019017, 395966395 Flag: NONE - bug fixed Test: manual - presubmit Change-Id: Ie371fa45cadceaf51cf184b446df9123ef27c337
This commit is contained in:
@@ -124,8 +124,7 @@ public class TaskbarManager {
|
||||
private final TaskbarNavButtonController mDefaultNavButtonController;
|
||||
private final ComponentCallbacks mDefaultComponentCallbacks;
|
||||
|
||||
private final SimpleBroadcastReceiver mShutdownReceiver =
|
||||
new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
|
||||
private final SimpleBroadcastReceiver mShutdownReceiver;
|
||||
|
||||
// The source for this provider is set when Launcher is available
|
||||
// We use 'non-destroyable' version here so the original provider won't be destroyed
|
||||
@@ -183,8 +182,7 @@ public class TaskbarManager {
|
||||
|
||||
private boolean mUserUnlocked = false;
|
||||
|
||||
private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver =
|
||||
new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::showTaskbarFromBroadcast);
|
||||
private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver;
|
||||
|
||||
private final AllAppsActionManager mAllAppsActionManager;
|
||||
private final RecentsDisplayModel mRecentsDisplayModel;
|
||||
@@ -266,7 +264,13 @@ public class TaskbarManager {
|
||||
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
|
||||
Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
|
||||
mPrimaryWindowContext.registerComponentCallbacks(mDefaultComponentCallbacks);
|
||||
mShutdownReceiver.register(mPrimaryWindowContext, Intent.ACTION_SHUTDOWN);
|
||||
mShutdownReceiver =
|
||||
new SimpleBroadcastReceiver(
|
||||
mPrimaryWindowContext, UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
|
||||
mTaskbarBroadcastReceiver =
|
||||
new SimpleBroadcastReceiver(mPrimaryWindowContext,
|
||||
UI_HELPER_EXECUTOR, this::showTaskbarFromBroadcast);
|
||||
mShutdownReceiver.register(Intent.ACTION_SHUTDOWN);
|
||||
UI_HELPER_EXECUTOR.execute(() -> {
|
||||
mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
|
||||
mPrimaryWindowContext,
|
||||
@@ -274,8 +278,7 @@ public class TaskbarManager {
|
||||
new Intent(ACTION_SHOW_TASKBAR).setPackage(
|
||||
mPrimaryWindowContext.getPackageName()),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
mTaskbarBroadcastReceiver.register(
|
||||
mPrimaryWindowContext, RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
|
||||
mTaskbarBroadcastReceiver.register(RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
|
||||
});
|
||||
|
||||
debugWhyTaskbarNotDestroyed("TaskbarManager created");
|
||||
@@ -795,7 +798,7 @@ public class TaskbarManager {
|
||||
mRecentsViewContainer = null;
|
||||
debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
|
||||
removeActivityCallbacksAndListeners();
|
||||
mTaskbarBroadcastReceiver.unregisterReceiverSafely(mPrimaryWindowContext);
|
||||
mTaskbarBroadcastReceiver.unregisterReceiverSafely();
|
||||
|
||||
if (mUserUnlocked) {
|
||||
DisplayController.INSTANCE.get(mPrimaryWindowContext).removeChangeListener(
|
||||
@@ -807,7 +810,7 @@ public class TaskbarManager {
|
||||
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
|
||||
Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
|
||||
mPrimaryWindowContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
|
||||
mShutdownReceiver.unregisterReceiverSafely(mPrimaryWindowContext);
|
||||
mShutdownReceiver.unregisterReceiverSafely();
|
||||
destroyAllTaskbars();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user