From a3f52079268c2cbfd9fedad0a22d97ee7bf3e838 Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Mon, 18 Mar 2019 13:37:22 -0400 Subject: [PATCH] Initialize GlobalActionsPanelPlugin before GlobalActions is launched Previously, we were loading the GlobalActionsPanelPlugin in the constructor for GlobalActionsDialog, which is instantiated on demand the first time that Global Actions is launched. Because the plugin is loaded in the background, a race condition exists where the GlobalActions Dialog is displayed before the plugin has finished loading, and so the Plugin will not appear, despite being enabled. In this change, the GlobalActionsPanelPlugin is loaded in GlobalActionsImpl, which is scoped to the SystemUI Applcation lifetime (it will always be available). Therefore, the plugin will start loading as soon as it is enabled by the user. The race condition still exists, but is greatly mitigated and should not pose a significant issue. Test: manual Change-Id: I624f7b0b9133e044fa486ad6a74944aba0511a70 --- .../globalactions/GlobalActionsDialog.java | 19 +++++++------------ .../globalactions/GlobalActionsImpl.java | 10 +++++++++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 0adbefeddea67..7ed3a8065bc51 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -92,8 +92,6 @@ import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.ExtensionController; -import com.android.systemui.statusbar.policy.ExtensionController.Extension; import com.android.systemui.util.EmergencyDialerConstants; import com.android.systemui.util.leak.RotationUtils; import com.android.systemui.volume.SystemUIInterpolators.LogAccelerateInterpolator; @@ -161,9 +159,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final EmergencyAffordanceManager mEmergencyAffordanceManager; private final ScreenshotHelper mScreenshotHelper; private final ScreenRecordHelper mScreenRecordHelper; - - private final Extension mPanelExtension; - private ActivityStarter mActivityStarter; + private final ActivityStarter mActivityStarter; + private GlobalActionsPanelPlugin mPanelPlugin; /** * @param context everything needs a context :( @@ -209,10 +206,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Dependency.get(ConfigurationController.class).addCallback(this); - mPanelExtension = Dependency.get(ExtensionController.class) - .newExtension(GlobalActionsPanelPlugin.class) - .withPlugin(GlobalActionsPanelPlugin.class) - .build(); mActivityStarter = Dependency.get(ActivityStarter.class); } @@ -221,9 +214,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, * * @param keyguardShowing True if keyguard is showing */ - public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) { + public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned, + GlobalActionsPanelPlugin panelPlugin) { mKeyguardShowing = keyguardShowing; mDeviceProvisioned = isDeviceProvisioned; + mPanelPlugin = panelPlugin; if (mDialog != null) { mDialog.dismiss(); mDialog = null; @@ -400,8 +395,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter = new MyAdapter(); GlobalActionsPanelPlugin.PanelViewController panelViewController = - mPanelExtension.get() != null - ? mPanelExtension.get().onPanelShown( + mPanelPlugin != null + ? mPanelPlugin.onPanelShown( new GlobalActionsPanelPlugin.Callbacks() { @Override public void dismissGlobalActionsMenu() { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java index 19a7ceaaaac3f..4cf58b736eb93 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java @@ -37,8 +37,10 @@ import com.android.systemui.Dependency; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.GlobalActions; +import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.ExtensionController; import com.android.systemui.statusbar.policy.KeyguardMonitor; public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks { @@ -48,6 +50,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks private final Context mContext; private final KeyguardMonitor mKeyguardMonitor; private final DeviceProvisionedController mDeviceProvisionedController; + private final ExtensionController.Extension mPanelExtension; private GlobalActionsDialog mGlobalActions; private boolean mDisabled; @@ -56,6 +59,10 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); SysUiServiceProvider.getComponent(context, CommandQueue.class).addCallback(this); + mPanelExtension = Dependency.get(ExtensionController.class) + .newExtension(GlobalActionsPanelPlugin.class) + .withPlugin(GlobalActionsPanelPlugin.class) + .build(); } @Override @@ -74,7 +81,8 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks mGlobalActions = new GlobalActionsDialog(mContext, manager); } mGlobalActions.showDialog(mKeyguardMonitor.isShowing(), - mDeviceProvisionedController.isDeviceProvisioned()); + mDeviceProvisionedController.isDeviceProvisioned(), + mPanelExtension.get()); } @Override