Merge "Remove listeners when destroying GlobalActionsDialog." into sc-dev am: d2455e0c75

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15000573

Change-Id: Ia8fa44bf9089919528d91ad5cc1074f72b48e543
This commit is contained in:
Dave Mankoff
2021-06-17 14:08:57 +00:00
committed by Automerger Merge Worker
6 changed files with 144 additions and 72 deletions

View File

@@ -30,6 +30,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager; import android.app.trust.TrustManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@@ -113,48 +114,101 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
@VisibleForTesting @VisibleForTesting
boolean mShowLockScreenCards = false; boolean mShowLockScreenCards = false;
private final KeyguardStateController.Callback mKeyguardStateControllerListener =
new KeyguardStateController.Callback() {
@Override
public void onUnlockedChanged() {
if (mDialog != null) {
ActionsDialog dialog = (ActionsDialog) mDialog;
boolean unlocked = mKeyguardStateController.isUnlocked();
if (dialog.mWalletViewController != null) {
dialog.mWalletViewController.onDeviceLockStateChanged(!unlocked);
}
if (unlocked) {
dialog.hideLockMessage();
}
}
}
};
private final ContentObserver mSettingsObserver = new ContentObserver(mMainHandler) {
@Override
public void onChange(boolean selfChange) {
onPowerMenuLockScreenSettingsChanged();
}
};
/** /**
* @param context everything needs a context :( * @param context everything needs a context :(
*/ */
@Inject @Inject
public GlobalActionsDialog(Context context, GlobalActionsManager windowManagerFuncs, public GlobalActionsDialog(
AudioManager audioManager, IDreamManager iDreamManager, Context context,
DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils, GlobalActionsManager windowManagerFuncs,
AudioManager audioManager,
IDreamManager iDreamManager,
DevicePolicyManager devicePolicyManager,
LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher, BroadcastDispatcher broadcastDispatcher,
TelephonyListenerManager telephonyListenerManager, TelephonyListenerManager telephonyListenerManager,
GlobalSettings globalSettings, SecureSettings secureSettings, GlobalSettings globalSettings,
@Nullable Vibrator vibrator, @Main Resources resources, SecureSettings secureSettings,
ConfigurationController configurationController, ActivityStarter activityStarter, @Nullable Vibrator vibrator,
KeyguardStateController keyguardStateController, UserManager userManager, @Main Resources resources,
TrustManager trustManager, IActivityManager iActivityManager, ConfigurationController configurationController,
@Nullable TelecomManager telecomManager, MetricsLogger metricsLogger, ActivityStarter activityStarter,
NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor, KeyguardStateController keyguardStateController,
UserManager userManager,
TrustManager trustManager,
IActivityManager iActivityManager,
@Nullable TelecomManager telecomManager,
MetricsLogger metricsLogger,
NotificationShadeDepthController depthController,
SysuiColorExtractor colorExtractor,
IStatusBarService statusBarService, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController,
IWindowManager iWindowManager, IWindowManager iWindowManager,
@Background Executor backgroundExecutor, @Background Executor backgroundExecutor,
UiEventLogger uiEventLogger, UiEventLogger uiEventLogger,
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, RingerModeTracker ringerModeTracker,
SysUiState sysUiState,
@Main Handler handler,
PackageManager packageManager,
StatusBar statusBar) { StatusBar statusBar) {
super(context, windowManagerFuncs, super(context,
audioManager, iDreamManager, windowManagerFuncs,
devicePolicyManager, lockPatternUtils, audioManager,
broadcastDispatcher, telephonyListenerManager, iDreamManager,
globalSettings, secureSettings, devicePolicyManager,
vibrator, resources, lockPatternUtils,
broadcastDispatcher,
telephonyListenerManager,
globalSettings,
secureSettings,
vibrator,
resources,
configurationController, configurationController,
keyguardStateController, userManager, keyguardStateController,
trustManager, iActivityManager, userManager,
telecomManager, metricsLogger, trustManager,
depthController, colorExtractor, iActivityManager,
telecomManager,
metricsLogger,
depthController,
colorExtractor,
statusBarService, statusBarService,
notificationShadeWindowController, notificationShadeWindowController,
iWindowManager, iWindowManager,
backgroundExecutor, backgroundExecutor,
uiEventLogger, uiEventLogger,
null, null,
ringerModeTracker, sysUiState, handler, statusBar); ringerModeTracker,
sysUiState,
handler,
packageManager,
statusBar);
mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
@@ -164,34 +218,22 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
mNotificationShadeWindowController = notificationShadeWindowController; mNotificationShadeWindowController = notificationShadeWindowController;
mSysUiState = sysUiState; mSysUiState = sysUiState;
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override
public void onUnlockedChanged() {
if (mDialog != null) {
ActionsDialog dialog = (ActionsDialog) mDialog;
boolean unlocked = mKeyguardStateController.isUnlocked();
if (dialog.mWalletViewController != null) {
dialog.mWalletViewController.onDeviceLockStateChanged(!unlocked);
}
if (unlocked) { mKeyguardStateController.addCallback(mKeyguardStateControllerListener);
dialog.hideLockMessage();
}
}
}
});
// Listen for changes to show pay on the power menu while locked // Listen for changes to show pay on the power menu while locked
onPowerMenuLockScreenSettingsChanged(); onPowerMenuLockScreenSettingsChanged();
mGlobalSettings.registerContentObserver( mGlobalSettings.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT), Settings.Secure.getUriFor(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT),
false /* notifyForDescendants */, false /* notifyForDescendants */,
new ContentObserver(handler) { mSettingsObserver);
@Override }
public void onChange(boolean selfChange) {
onPowerMenuLockScreenSettingsChanged(); @Override
} public void destroy() {
}); super.destroy();
mKeyguardStateController.removeCallback(mKeyguardStateControllerListener);
mGlobalSettings.unregisterContentObserver(mSettingsObserver);
} }
/** /**

View File

@@ -177,6 +177,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
private final IDreamManager mDreamManager; private final IDreamManager mDreamManager;
private final DevicePolicyManager mDevicePolicyManager; private final DevicePolicyManager mDevicePolicyManager;
private final LockPatternUtils mLockPatternUtils; private final LockPatternUtils mLockPatternUtils;
private final TelephonyListenerManager mTelephonyListenerManager;
private final KeyguardStateController mKeyguardStateController; private final KeyguardStateController mKeyguardStateController;
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
protected final GlobalSettings mGlobalSettings; protected final GlobalSettings mGlobalSettings;
@@ -308,25 +309,38 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
* @param context everything needs a context :( * @param context everything needs a context :(
*/ */
@Inject @Inject
public GlobalActionsDialogLite(Context context, GlobalActionsManager windowManagerFuncs, public GlobalActionsDialogLite(
AudioManager audioManager, IDreamManager iDreamManager, Context context,
DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils, GlobalActionsManager windowManagerFuncs,
AudioManager audioManager,
IDreamManager iDreamManager,
DevicePolicyManager devicePolicyManager,
LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher, BroadcastDispatcher broadcastDispatcher,
TelephonyListenerManager telephonyListenerManager, TelephonyListenerManager telephonyListenerManager,
GlobalSettings globalSettings, SecureSettings secureSettings, GlobalSettings globalSettings,
@Nullable Vibrator vibrator, @Main Resources resources, SecureSettings secureSettings,
@Nullable Vibrator vibrator,
@Main Resources resources,
ConfigurationController configurationController, ConfigurationController configurationController,
KeyguardStateController keyguardStateController, UserManager userManager, KeyguardStateController keyguardStateController,
TrustManager trustManager, IActivityManager iActivityManager, UserManager userManager,
@Nullable TelecomManager telecomManager, MetricsLogger metricsLogger, TrustManager trustManager,
NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor, IActivityManager iActivityManager,
@Nullable TelecomManager telecomManager,
MetricsLogger metricsLogger,
NotificationShadeDepthController depthController,
SysuiColorExtractor colorExtractor,
IStatusBarService statusBarService, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController,
IWindowManager iWindowManager, IWindowManager iWindowManager,
@Background Executor backgroundExecutor, @Background Executor backgroundExecutor,
UiEventLogger uiEventLogger, UiEventLogger uiEventLogger,
GlobalActionsInfoProvider infoProvider, GlobalActionsInfoProvider infoProvider,
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, RingerModeTracker ringerModeTracker,
SysUiState sysUiState,
@Main Handler handler,
PackageManager packageManager,
StatusBar statusBar) { StatusBar statusBar) {
mContext = context; mContext = context;
mWindowManagerFuncs = windowManagerFuncs; mWindowManagerFuncs = windowManagerFuncs;
@@ -334,6 +348,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mDreamManager = iDreamManager; mDreamManager = iDreamManager;
mDevicePolicyManager = devicePolicyManager; mDevicePolicyManager = devicePolicyManager;
mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils;
mTelephonyListenerManager = telephonyListenerManager;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mGlobalSettings = globalSettings; mGlobalSettings = globalSettings;
@@ -356,7 +371,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mRingerModeTracker = ringerModeTracker; mRingerModeTracker = ringerModeTracker;
mSysUiState = sysUiState; mSysUiState = sysUiState;
mMainHandler = handler; mMainHandler = handler;
mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp; mSmallestScreenWidthDp = resources.getConfiguration().smallestScreenWidthDp;
mStatusBar = statusBar; mStatusBar = statusBar;
// receive broadcasts // receive broadcasts
@@ -366,11 +381,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
filter.addAction(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); filter.addAction(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
mHasTelephony = mHasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
// get notified of phone state changes // get notified of phone state changes
telephonyListenerManager.addServiceStateListener(mPhoneStateListener); mTelephonyListenerManager.addServiceStateListener(mPhoneStateListener);
mGlobalSettings.registerContentObserver( mGlobalSettings.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true, Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,
mAirplaneModeObserver); mAirplaneModeObserver);
@@ -390,6 +404,16 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mConfigurationController.addCallback(this); mConfigurationController.addCallback(this);
} }
/**
* Clean up callbacks
*/
public void destroy() {
mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
mTelephonyListenerManager.removeServiceStateListener(mPhoneStateListener);
mGlobalSettings.unregisterContentObserver(mAirplaneModeObserver);
mConfigurationController.removeCallback(this);
}
protected Context getContext() { protected Context getContext() {
return mContext; return mContext;
} }
@@ -689,14 +713,6 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mDialog.refreshDialog(); mDialog.refreshDialog();
} }
} }
/**
* Clean up callbacks
*/
public void destroy() {
mConfigurationController.removeCallback(this);
}
/** /**
* Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is * Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is
* called when the quick access wallet requests dismissal. * called when the quick access wallet requests dismissal.
@@ -2018,7 +2034,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
} }
}; };
private ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) { private final ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
onAirplaneModeChanged(); onAirplaneModeChanged();

View File

@@ -32,7 +32,6 @@ import android.widget.TextView;
import com.android.internal.R; import com.android.internal.R;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.GlobalActions; import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.scrim.ScrimDrawable;
import com.android.systemui.statusbar.BlurUtils; import com.android.systemui.statusbar.BlurUtils;
@@ -52,19 +51,24 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
private final KeyguardStateController mKeyguardStateController; private final KeyguardStateController mKeyguardStateController;
private final DeviceProvisionedController mDeviceProvisionedController; private final DeviceProvisionedController mDeviceProvisionedController;
private final BlurUtils mBlurUtils; private final BlurUtils mBlurUtils;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final CommandQueue mCommandQueue; private final CommandQueue mCommandQueue;
private GlobalActionsDialogLite mGlobalActionsDialog; private GlobalActionsDialogLite mGlobalActionsDialog;
private boolean mDisabled; private boolean mDisabled;
@Inject @Inject
public GlobalActionsImpl(Context context, CommandQueue commandQueue, public GlobalActionsImpl(Context context, CommandQueue commandQueue,
Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils) { Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils,
KeyguardStateController keyguardStateController,
DeviceProvisionedController deviceProvisionedController,
KeyguardUpdateMonitor keyguardUpdateMonitor) {
mContext = context; mContext = context;
mGlobalActionsDialogLazy = globalActionsDialogLazy; mGlobalActionsDialogLazy = globalActionsDialogLazy;
mKeyguardStateController = Dependency.get(KeyguardStateController.class); mKeyguardStateController = keyguardStateController;
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mDeviceProvisionedController = deviceProvisionedController;
mCommandQueue = commandQueue; mCommandQueue = commandQueue;
mBlurUtils = blurUtils; mBlurUtils = blurUtils;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mCommandQueue.addCallback(this); mCommandQueue.addCallback(this);
} }
@@ -83,7 +87,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
mGlobalActionsDialog = mGlobalActionsDialogLazy.get(); mGlobalActionsDialog = mGlobalActionsDialogLazy.get();
mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(), mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
mDeviceProvisionedController.isDeviceProvisioned()); mDeviceProvisionedController.isDeviceProvisioned());
Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth(); mKeyguardUpdateMonitor.requestFaceAuth();
} }
@Override @Override

View File

@@ -74,7 +74,7 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
private final PageIndicator mPageIndicator; private final PageIndicator mPageIndicator;
private final View mPowerMenuLite; private final View mPowerMenuLite;
private final boolean mShowPMLiteButton; private final boolean mShowPMLiteButton;
private GlobalActionsDialogLite mGlobalActionsDialog; private final GlobalActionsDialogLite mGlobalActionsDialog;
private final UiEventLogger mUiEventLogger; private final UiEventLogger mUiEventLogger;
private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener = private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =

View File

@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager; import android.app.trust.TrustManager;
import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.media.AudioManager; import android.media.AudioManager;
@@ -109,6 +110,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
@Mock private RingerModeTracker mRingerModeTracker; @Mock private RingerModeTracker mRingerModeTracker;
@Mock private RingerModeLiveData mRingerModeLiveData; @Mock private RingerModeLiveData mRingerModeLiveData;
@Mock private SysUiState mSysUiState; @Mock private SysUiState mSysUiState;
@Mock private PackageManager mPackageManager;
@Mock private Handler mHandler; @Mock private Handler mHandler;
@Mock private UserContextProvider mUserContextProvider; @Mock private UserContextProvider mUserContextProvider;
@Mock private StatusBar mStatusBar; @Mock private StatusBar mStatusBar;
@@ -123,6 +125,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData); when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
when(mUserContextProvider.getUserContext()).thenReturn(mContext); when(mUserContextProvider.getUserContext()).thenReturn(mContext);
when(mResources.getConfiguration()).thenReturn(
getContext().getResources().getConfiguration());
mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext, mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext,
mWindowManagerFuncs, mWindowManagerFuncs,
@@ -154,6 +158,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
mRingerModeTracker, mRingerModeTracker,
mSysUiState, mSysUiState,
mHandler, mHandler,
mPackageManager,
mStatusBar mStatusBar
); );
mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();

View File

@@ -33,6 +33,7 @@ import static org.mockito.Mockito.when;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager; import android.app.trust.TrustManager;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
@@ -124,6 +125,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
@Mock GlobalActionsPanelPlugin.PanelViewController mWalletController; @Mock GlobalActionsPanelPlugin.PanelViewController mWalletController;
@Mock private Handler mHandler; @Mock private Handler mHandler;
@Mock private UserTracker mUserTracker; @Mock private UserTracker mUserTracker;
@Mock private PackageManager mPackageManager;
@Mock private SecureSettings mSecureSettings; @Mock private SecureSettings mSecureSettings;
@Mock private StatusBar mStatusBar; @Mock private StatusBar mStatusBar;
@@ -136,6 +138,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
allowTestableLooperAsMainThread(); allowTestableLooperAsMainThread();
when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData); when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
when(mResources.getConfiguration()).thenReturn(
getContext().getResources().getConfiguration());
mGlobalActionsDialog = new GlobalActionsDialog(mContext, mGlobalActionsDialog = new GlobalActionsDialog(mContext,
mWindowManagerFuncs, mWindowManagerFuncs,
@@ -167,6 +171,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
mRingerModeTracker, mRingerModeTracker,
mSysUiState, mSysUiState,
mHandler, mHandler,
mPackageManager,
mStatusBar mStatusBar
); );
mGlobalActionsDialog.setZeroDialogPressDelayForTesting(); mGlobalActionsDialog.setZeroDialogPressDelayForTesting();