Remove listeners when destroying GlobalActionsDialog.
Fixes memory leaks. Bug: 191150828 Test: atest SystemUITests Change-Id: I04c2acf528c48eba17a828017de5f70424c09e51
This commit is contained in:
@@ -30,6 +30,7 @@ import android.app.admin.DevicePolicyManager;
|
||||
import android.app.trust.TrustManager;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.database.ContentObserver;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -113,47 +114,100 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
|
||||
@VisibleForTesting
|
||||
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 :(
|
||||
*/
|
||||
@Inject
|
||||
public GlobalActionsDialog(Context context, GlobalActionsManager windowManagerFuncs,
|
||||
AudioManager audioManager, IDreamManager iDreamManager,
|
||||
DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils,
|
||||
public GlobalActionsDialog(
|
||||
Context context,
|
||||
GlobalActionsManager windowManagerFuncs,
|
||||
AudioManager audioManager,
|
||||
IDreamManager iDreamManager,
|
||||
DevicePolicyManager devicePolicyManager,
|
||||
LockPatternUtils lockPatternUtils,
|
||||
BroadcastDispatcher broadcastDispatcher,
|
||||
TelephonyListenerManager telephonyListenerManager,
|
||||
GlobalSettings globalSettings, SecureSettings secureSettings,
|
||||
@Nullable Vibrator vibrator, @Main Resources resources,
|
||||
ConfigurationController configurationController, ActivityStarter activityStarter,
|
||||
KeyguardStateController keyguardStateController, UserManager userManager,
|
||||
TrustManager trustManager, IActivityManager iActivityManager,
|
||||
@Nullable TelecomManager telecomManager, MetricsLogger metricsLogger,
|
||||
NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor,
|
||||
GlobalSettings globalSettings,
|
||||
SecureSettings secureSettings,
|
||||
@Nullable Vibrator vibrator,
|
||||
@Main Resources resources,
|
||||
ConfigurationController configurationController,
|
||||
ActivityStarter activityStarter,
|
||||
KeyguardStateController keyguardStateController,
|
||||
UserManager userManager,
|
||||
TrustManager trustManager,
|
||||
IActivityManager iActivityManager,
|
||||
@Nullable TelecomManager telecomManager,
|
||||
MetricsLogger metricsLogger,
|
||||
NotificationShadeDepthController depthController,
|
||||
SysuiColorExtractor colorExtractor,
|
||||
IStatusBarService statusBarService,
|
||||
NotificationShadeWindowController notificationShadeWindowController,
|
||||
IWindowManager iWindowManager,
|
||||
@Background Executor backgroundExecutor,
|
||||
UiEventLogger uiEventLogger,
|
||||
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler,
|
||||
RingerModeTracker ringerModeTracker,
|
||||
SysUiState sysUiState,
|
||||
@Main Handler handler,
|
||||
PackageManager packageManager,
|
||||
StatusBar statusBar) {
|
||||
|
||||
super(context, windowManagerFuncs,
|
||||
audioManager, iDreamManager,
|
||||
devicePolicyManager, lockPatternUtils,
|
||||
broadcastDispatcher, telephonyListenerManager,
|
||||
globalSettings, secureSettings,
|
||||
vibrator, resources,
|
||||
super(context,
|
||||
windowManagerFuncs,
|
||||
audioManager,
|
||||
iDreamManager,
|
||||
devicePolicyManager,
|
||||
lockPatternUtils,
|
||||
broadcastDispatcher,
|
||||
telephonyListenerManager,
|
||||
globalSettings,
|
||||
secureSettings,
|
||||
vibrator,
|
||||
resources,
|
||||
configurationController,
|
||||
keyguardStateController, userManager,
|
||||
trustManager, iActivityManager,
|
||||
telecomManager, metricsLogger,
|
||||
depthController, colorExtractor,
|
||||
keyguardStateController,
|
||||
userManager,
|
||||
trustManager,
|
||||
iActivityManager,
|
||||
telecomManager,
|
||||
metricsLogger,
|
||||
depthController,
|
||||
colorExtractor,
|
||||
statusBarService,
|
||||
notificationShadeWindowController,
|
||||
iWindowManager,
|
||||
backgroundExecutor,
|
||||
uiEventLogger,
|
||||
ringerModeTracker, sysUiState, handler, statusBar);
|
||||
ringerModeTracker,
|
||||
sysUiState,
|
||||
handler,
|
||||
packageManager,
|
||||
statusBar);
|
||||
|
||||
mLockPatternUtils = lockPatternUtils;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
@@ -163,34 +217,22 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
|
||||
mNotificationShadeWindowController = notificationShadeWindowController;
|
||||
mSysUiState = sysUiState;
|
||||
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) {
|
||||
dialog.hideLockMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
mKeyguardStateController.addCallback(mKeyguardStateControllerListener);
|
||||
|
||||
// Listen for changes to show pay on the power menu while locked
|
||||
onPowerMenuLockScreenSettingsChanged();
|
||||
mGlobalSettings.registerContentObserver(
|
||||
Settings.Secure.getUriFor(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT),
|
||||
false /* notifyForDescendants */,
|
||||
new ContentObserver(handler) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
onPowerMenuLockScreenSettingsChanged();
|
||||
}
|
||||
});
|
||||
mSettingsObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
super.destroy();
|
||||
mKeyguardStateController.removeCallback(mKeyguardStateControllerListener);
|
||||
mGlobalSettings.unregisterContentObserver(mSettingsObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -177,6 +177,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
private final IDreamManager mDreamManager;
|
||||
private final DevicePolicyManager mDevicePolicyManager;
|
||||
private final LockPatternUtils mLockPatternUtils;
|
||||
private final TelephonyListenerManager mTelephonyListenerManager;
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
private final BroadcastDispatcher mBroadcastDispatcher;
|
||||
protected final GlobalSettings mGlobalSettings;
|
||||
@@ -307,24 +308,37 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
* @param context everything needs a context :(
|
||||
*/
|
||||
@Inject
|
||||
public GlobalActionsDialogLite(Context context, GlobalActionsManager windowManagerFuncs,
|
||||
AudioManager audioManager, IDreamManager iDreamManager,
|
||||
DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils,
|
||||
public GlobalActionsDialogLite(
|
||||
Context context,
|
||||
GlobalActionsManager windowManagerFuncs,
|
||||
AudioManager audioManager,
|
||||
IDreamManager iDreamManager,
|
||||
DevicePolicyManager devicePolicyManager,
|
||||
LockPatternUtils lockPatternUtils,
|
||||
BroadcastDispatcher broadcastDispatcher,
|
||||
TelephonyListenerManager telephonyListenerManager,
|
||||
GlobalSettings globalSettings, SecureSettings secureSettings,
|
||||
@Nullable Vibrator vibrator, @Main Resources resources,
|
||||
GlobalSettings globalSettings,
|
||||
SecureSettings secureSettings,
|
||||
@Nullable Vibrator vibrator,
|
||||
@Main Resources resources,
|
||||
ConfigurationController configurationController,
|
||||
KeyguardStateController keyguardStateController, UserManager userManager,
|
||||
TrustManager trustManager, IActivityManager iActivityManager,
|
||||
@Nullable TelecomManager telecomManager, MetricsLogger metricsLogger,
|
||||
NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor,
|
||||
KeyguardStateController keyguardStateController,
|
||||
UserManager userManager,
|
||||
TrustManager trustManager,
|
||||
IActivityManager iActivityManager,
|
||||
@Nullable TelecomManager telecomManager,
|
||||
MetricsLogger metricsLogger,
|
||||
NotificationShadeDepthController depthController,
|
||||
SysuiColorExtractor colorExtractor,
|
||||
IStatusBarService statusBarService,
|
||||
NotificationShadeWindowController notificationShadeWindowController,
|
||||
IWindowManager iWindowManager,
|
||||
@Background Executor backgroundExecutor,
|
||||
UiEventLogger uiEventLogger,
|
||||
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler,
|
||||
RingerModeTracker ringerModeTracker,
|
||||
SysUiState sysUiState,
|
||||
@Main Handler handler,
|
||||
PackageManager packageManager,
|
||||
StatusBar statusBar) {
|
||||
mContext = context;
|
||||
mWindowManagerFuncs = windowManagerFuncs;
|
||||
@@ -332,6 +346,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
mDreamManager = iDreamManager;
|
||||
mDevicePolicyManager = devicePolicyManager;
|
||||
mLockPatternUtils = lockPatternUtils;
|
||||
mTelephonyListenerManager = telephonyListenerManager;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mBroadcastDispatcher = broadcastDispatcher;
|
||||
mGlobalSettings = globalSettings;
|
||||
@@ -353,7 +368,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
mRingerModeTracker = ringerModeTracker;
|
||||
mSysUiState = sysUiState;
|
||||
mMainHandler = handler;
|
||||
mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp;
|
||||
mSmallestScreenWidthDp = resources.getConfiguration().smallestScreenWidthDp;
|
||||
mStatusBar = statusBar;
|
||||
|
||||
// receive broadcasts
|
||||
@@ -363,11 +378,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
filter.addAction(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
|
||||
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
|
||||
|
||||
mHasTelephony =
|
||||
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
|
||||
mHasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
|
||||
|
||||
// get notified of phone state changes
|
||||
telephonyListenerManager.addServiceStateListener(mPhoneStateListener);
|
||||
mTelephonyListenerManager.addServiceStateListener(mPhoneStateListener);
|
||||
mGlobalSettings.registerContentObserver(
|
||||
Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,
|
||||
mAirplaneModeObserver);
|
||||
@@ -387,6 +401,16 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
mConfigurationController.addCallback(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up callbacks
|
||||
*/
|
||||
public void destroy() {
|
||||
mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
|
||||
mTelephonyListenerManager.removeServiceStateListener(mPhoneStateListener);
|
||||
mGlobalSettings.unregisterContentObserver(mAirplaneModeObserver);
|
||||
mConfigurationController.removeCallback(this);
|
||||
}
|
||||
|
||||
protected Context getContext() {
|
||||
return mContext;
|
||||
}
|
||||
@@ -686,14 +710,6 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
mDialog.refreshDialog();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up callbacks
|
||||
*/
|
||||
public void destroy() {
|
||||
mConfigurationController.removeCallback(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is
|
||||
* called when the quick access wallet requests dismissal.
|
||||
@@ -2015,7 +2031,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
}
|
||||
};
|
||||
|
||||
private ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) {
|
||||
private final ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
onAirplaneModeChanged();
|
||||
|
||||
@@ -32,7 +32,6 @@ import android.widget.TextView;
|
||||
import com.android.internal.R;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.plugins.GlobalActions;
|
||||
import com.android.systemui.scrim.ScrimDrawable;
|
||||
import com.android.systemui.statusbar.BlurUtils;
|
||||
@@ -52,19 +51,24 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
private final DeviceProvisionedController mDeviceProvisionedController;
|
||||
private final BlurUtils mBlurUtils;
|
||||
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
private final CommandQueue mCommandQueue;
|
||||
private GlobalActionsDialogLite mGlobalActionsDialog;
|
||||
private boolean mDisabled;
|
||||
|
||||
@Inject
|
||||
public GlobalActionsImpl(Context context, CommandQueue commandQueue,
|
||||
Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils) {
|
||||
Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils,
|
||||
KeyguardStateController keyguardStateController,
|
||||
DeviceProvisionedController deviceProvisionedController,
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor) {
|
||||
mContext = context;
|
||||
mGlobalActionsDialogLazy = globalActionsDialogLazy;
|
||||
mKeyguardStateController = Dependency.get(KeyguardStateController.class);
|
||||
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mDeviceProvisionedController = deviceProvisionedController;
|
||||
mCommandQueue = commandQueue;
|
||||
mBlurUtils = blurUtils;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mCommandQueue.addCallback(this);
|
||||
}
|
||||
|
||||
@@ -83,7 +87,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
|
||||
mGlobalActionsDialog = mGlobalActionsDialogLazy.get();
|
||||
mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
|
||||
mDeviceProvisionedController.isDeviceProvisioned());
|
||||
Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth();
|
||||
mKeyguardUpdateMonitor.requestFaceAuth();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -74,7 +74,7 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
|
||||
private final PageIndicator mPageIndicator;
|
||||
private final View mPowerMenuLite;
|
||||
private final boolean mShowPMLiteButton;
|
||||
private GlobalActionsDialogLite mGlobalActionsDialog;
|
||||
private final GlobalActionsDialogLite mGlobalActionsDialog;
|
||||
private final UiEventLogger mUiEventLogger;
|
||||
|
||||
private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =
|
||||
|
||||
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
|
||||
import android.app.IActivityManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.trust.TrustManager;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
@@ -108,6 +109,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
|
||||
@Mock private RingerModeTracker mRingerModeTracker;
|
||||
@Mock private RingerModeLiveData mRingerModeLiveData;
|
||||
@Mock private SysUiState mSysUiState;
|
||||
@Mock private PackageManager mPackageManager;
|
||||
@Mock private Handler mHandler;
|
||||
@Mock private UserContextProvider mUserContextProvider;
|
||||
@Mock private StatusBar mStatusBar;
|
||||
@@ -122,6 +124,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
|
||||
|
||||
when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
|
||||
when(mUserContextProvider.getUserContext()).thenReturn(mContext);
|
||||
when(mResources.getConfiguration()).thenReturn(
|
||||
getContext().getResources().getConfiguration());
|
||||
|
||||
mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext,
|
||||
mWindowManagerFuncs,
|
||||
@@ -152,6 +156,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
|
||||
mRingerModeTracker,
|
||||
mSysUiState,
|
||||
mHandler,
|
||||
mPackageManager,
|
||||
mStatusBar
|
||||
);
|
||||
mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();
|
||||
|
||||
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.when;
|
||||
import android.app.IActivityManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.trust.TrustManager;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
@@ -124,6 +125,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
|
||||
@Mock GlobalActionsPanelPlugin.PanelViewController mWalletController;
|
||||
@Mock private Handler mHandler;
|
||||
@Mock private UserTracker mUserTracker;
|
||||
@Mock private PackageManager mPackageManager;
|
||||
@Mock private SecureSettings mSecureSettings;
|
||||
@Mock private StatusBar mStatusBar;
|
||||
|
||||
@@ -136,6 +138,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
|
||||
allowTestableLooperAsMainThread();
|
||||
|
||||
when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
|
||||
when(mResources.getConfiguration()).thenReturn(
|
||||
getContext().getResources().getConfiguration());
|
||||
|
||||
mGlobalActionsDialog = new GlobalActionsDialog(mContext,
|
||||
mWindowManagerFuncs,
|
||||
@@ -167,6 +171,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
|
||||
mRingerModeTracker,
|
||||
mSysUiState,
|
||||
mHandler,
|
||||
mPackageManager,
|
||||
mStatusBar
|
||||
);
|
||||
mGlobalActionsDialog.setZeroDialogPressDelayForTesting();
|
||||
|
||||
Reference in New Issue
Block a user