Prevent re-use of dismissed wallet view

Rotation is disabled when wallet view is shown, but other interactions
(ie with Android Auto) cause ui mode change. Preventing re-use of the
wallet view controller after it has been dismissed ensures that the view
will not be re-attached to a different parent.

Fixes: b/162676641
Test: atest GlobalActionsDialogTest
Test: manual - enable rotation when wallet is shown (code change) and rotate.
Change-Id: I03591d11cf746f264e71e70585370a5dcdfb67a9
(cherry picked from commit 9294bd646f)
This commit is contained in:
Sean Pont
2020-08-12 13:42:52 -07:00
parent bae844a14d
commit a845acf97d

View File

@@ -148,6 +148,7 @@ import java.util.Set;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Provider;
/**
* Helper to show the global actions dialog. Each item is an {@link Action} that may show depending
@@ -401,7 +402,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
if (mDialog != null) {
if (!mDialog.isShowingControls() && shouldShowControls()) {
mDialog.showControls(mControlsUiControllerOptional.get());
} else if (shouldShowLockMessage()) {
} else if (shouldShowLockMessage(mDialog)) {
mDialog.showLockMessage();
}
}
@@ -698,19 +699,17 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mPowerAdapter = new MyPowerOptionsAdapter();
mDepthController.setShowingHomeControls(true);
GlobalActionsPanelPlugin.PanelViewController walletViewController =
getWalletViewController();
ControlsUiController uiController = null;
if (mControlsUiControllerOptional.isPresent() && shouldShowControls()) {
uiController = mControlsUiControllerOptional.get();
}
ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mOverflowAdapter,
walletViewController, mDepthController, mSysuiColorExtractor,
this::getWalletViewController, mDepthController, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController,
controlsAvailable(), uiController,
mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter);
if (shouldShowLockMessage()) {
if (shouldShowLockMessage(dialog)) {
dialog.showLockMessage();
}
dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
@@ -2124,7 +2123,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private MultiListLayout mGlobalActionsLayout;
private Drawable mBackgroundDrawable;
private final SysuiColorExtractor mColorExtractor;
private final GlobalActionsPanelPlugin.PanelViewController mWalletViewController;
private final Provider<GlobalActionsPanelPlugin.PanelViewController> mWalletFactory;
@Nullable private GlobalActionsPanelPlugin.PanelViewController mWalletViewController;
private boolean mKeyguardShowing;
private boolean mShowing;
private float mScrimAlpha;
@@ -2144,7 +2144,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private TextView mLockMessage;
ActionsDialog(Context context, MyAdapter adapter, MyOverflowAdapter overflowAdapter,
GlobalActionsPanelPlugin.PanelViewController walletViewController,
Provider<GlobalActionsPanelPlugin.PanelViewController> walletFactory,
NotificationShadeDepthController depthController,
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController,
@@ -2165,6 +2165,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mSysUiState = sysuiState;
mOnRotateCallback = onRotateCallback;
mKeyguardShowing = keyguardShowing;
mWalletFactory = walletFactory;
// Window initialization
Window window = getWindow();
@@ -2187,7 +2188,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
window.getAttributes().setFitInsetsTypes(0 /* types */);
setTitle(R.string.global_actions);
mWalletViewController = walletViewController;
initializeLayout();
}
@@ -2200,8 +2200,13 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mControlsUiController.show(mControlsView, this::dismissForControlsActivity);
}
private boolean isWalletViewAvailable() {
return mWalletViewController != null && mWalletViewController.getPanelContent() != null;
}
private void initializeWalletView() {
if (mWalletViewController == null || mWalletViewController.getPanelContent() == null) {
mWalletViewController = mWalletFactory.get();
if (!isWalletViewAvailable()) {
return;
}
@@ -2507,6 +2512,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private void dismissWallet() {
if (mWalletViewController != null) {
mWalletViewController.onDismissed();
// The wallet controller should not be re-used after being dismissed.
mWalletViewController = null;
}
}
@@ -2648,18 +2655,12 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
&& !mControlsServiceInfos.isEmpty();
}
private boolean walletViewAvailable() {
GlobalActionsPanelPlugin.PanelViewController walletViewController =
getWalletViewController();
return walletViewController != null && walletViewController.getPanelContent() != null;
}
private boolean shouldShowLockMessage() {
private boolean shouldShowLockMessage(ActionsDialog dialog) {
boolean isLockedAfterBoot = mLockPatternUtils.getStrongAuthForUser(getCurrentUser().id)
== STRONG_AUTH_REQUIRED_AFTER_BOOT;
return !mKeyguardStateController.isUnlocked()
&& (!mShowLockScreenCardsAndControls || isLockedAfterBoot)
&& (controlsAvailable() || walletViewAvailable());
&& (controlsAvailable() || dialog.isWalletViewAvailable());
}
private void onPowerMenuLockScreenSettingsChanged() {