diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java | 59 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java | 26 | 
2 files changed, 68 insertions, 17 deletions
| diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index d4c73668d0ed..20477975a6dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -104,15 +104,19 @@ public class KeyguardSliceProvider extends SliceProvider implements      private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm;      private final HashSet<Integer> mMediaInvisibleStates;      private final Object mMediaToken = new Object(); -    private SettableWakeLock mMediaWakeLock; -    private ZenModeController mZenModeController; +    @VisibleForTesting +    protected SettableWakeLock mMediaWakeLock; +    @VisibleForTesting +    protected ZenModeController mZenModeController;      private String mDatePattern;      private DateFormat mDateFormat;      private String mLastText;      private boolean mRegistered;      private String mNextAlarm;      private NextAlarmController mNextAlarmController; +    @VisibleForTesting      protected AlarmManager mAlarmManager; +    @VisibleForTesting      protected ContentResolver mContentResolver;      private AlarmManager.AlarmClockInfo mNextAlarmInfo;      private PendingIntent mPendingIntent; @@ -297,22 +301,44 @@ public class KeyguardSliceProvider extends SliceProvider implements      @Override      public boolean onCreateSliceProvider() { -        mAlarmManager = getContext().getSystemService(AlarmManager.class); -        mContentResolver = getContext().getContentResolver(); -        mNextAlarmController = new NextAlarmControllerImpl(getContext()); -        mNextAlarmController.addCallback(this); -        mZenModeController = new ZenModeControllerImpl(getContext(), mHandler); -        mZenModeController.addCallback(this); -        mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern); -        mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0); -        mMediaWakeLock = new SettableWakeLock(WakeLock.createPartial(getContext(), "media"), -                "media"); -        KeyguardSliceProvider.sInstance = this; -        registerClockUpdate(); -        updateClockLocked(); +        synchronized (this) { +            KeyguardSliceProvider oldInstance = KeyguardSliceProvider.sInstance; +            if (oldInstance != null) { +                oldInstance.onDestroy(); +            } + +            mAlarmManager = getContext().getSystemService(AlarmManager.class); +            mContentResolver = getContext().getContentResolver(); +            mNextAlarmController = new NextAlarmControllerImpl(getContext()); +            mNextAlarmController.addCallback(this); +            mZenModeController = new ZenModeControllerImpl(getContext(), mHandler); +            mZenModeController.addCallback(this); +            mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern); +            mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0); +            mMediaWakeLock = new SettableWakeLock(WakeLock.createPartial(getContext(), "media"), +                    "media"); +            KeyguardSliceProvider.sInstance = this; +            registerClockUpdate(); +            updateClockLocked(); +        }          return true;      } +    @VisibleForTesting +    protected void onDestroy() { +        synchronized (this) { +            mNextAlarmController.removeCallback(this); +            mZenModeController.removeCallback(this); +            mMediaWakeLock.setAcquired(false); +            mAlarmManager.cancel(mUpdateNextAlarm); +            if (mRegistered) { +                mRegistered = false; +                getKeyguardUpdateMonitor().removeCallback(mKeyguardUpdateMonitorCallback); +                getContext().unregisterReceiver(mIntentReceiver); +            } +        } +    } +      @Override      public void onZenChanged(int zen) {          notifyChange(); @@ -350,7 +376,8 @@ public class KeyguardSliceProvider extends SliceProvider implements       * Registers a broadcast receiver for clock updates, include date, time zone and manually       * changing the date/time via the settings app.       */ -    private void registerClockUpdate() { +    @VisibleForTesting +    protected void registerClockUpdate() {          synchronized (this) {              if (mRegistered) {                  return; diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 355e26071b2a..44191147f914 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,8 @@ import com.android.keyguard.KeyguardUpdateMonitor;  import com.android.systemui.SysuiTestCase;  import com.android.systemui.plugins.statusbar.StatusBarStateController;  import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.util.wakelock.SettableWakeLock;  import org.junit.Assert;  import org.junit.Before; @@ -73,6 +75,12 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {      private NotificationMediaManager mNotificationMediaManager;      @Mock      private StatusBarStateController mStatusBarStateController; +    @Mock +    private ZenModeController mZenModeController; +    @Mock +    private SettableWakeLock mMediaWakeLock; +    @Mock +    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;      private TestableKeyguardSliceProvider mProvider;      private boolean mIsZenMode; @@ -194,6 +202,20 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {          verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null));      } +    @Test +    public void onDestroy_noCrash() { +        mProvider.onDestroy(); +    } + +    @Test +    public void onDestroy_unregisterListeners() { +        mProvider.registerClockUpdate(); +        mProvider.onDestroy(); +        verify(mMediaWakeLock).setAcquired(eq(false)); +        verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class)); +        verify(mKeyguardUpdateMonitor).removeCallback(any()); +    } +      private class TestableKeyguardSliceProvider extends KeyguardSliceProvider {          int mCleanDateFormatInvokations;          private int mCounter; @@ -207,6 +229,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {              super.onCreateSliceProvider();              mAlarmManager = KeyguardSliceProviderTest.this.mAlarmManager;              mContentResolver = KeyguardSliceProviderTest.this.mContentResolver; +            mZenModeController = KeyguardSliceProviderTest.this.mZenModeController; +            mMediaWakeLock = KeyguardSliceProviderTest.this.mMediaWakeLock;              return true;          } @@ -223,7 +247,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {          @Override          public KeyguardUpdateMonitor getKeyguardUpdateMonitor() { -            return mock(KeyguardUpdateMonitor.class); +            return mKeyguardUpdateMonitor;          }          @Override |