From 014c68767b4caaa191f31cd8e1fd249ae992dfc2 Mon Sep 17 00:00:00 2001 From: shawnlin Date: Wed, 26 Feb 2020 17:51:51 +0800 Subject: [PATCH] Fixed listeners were unexpectedly unregistered when device rotated Fixes: 150271714 Test: atest ScreenDecorationsTest Change-Id: I66ad1baf7ef801f9c3982260c45d84a2f9e5e391 --- .../android/systemui/ScreenDecorations.java | 12 +++-- .../systemui/ScreenDecorationsTest.java | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 6ce6353147fb3..0f896c44ae636 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -99,7 +99,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { private static final boolean DEBUG_COLOR = DEBUG_SCREENSHOT_ROUNDED_CORNERS; private DisplayManager mDisplayManager; - private boolean mIsRegistered; + @VisibleForTesting + protected boolean mIsRegistered; private final BroadcastDispatcher mBroadcastDispatcher; private final Handler mMainHandler; private final TunerService mTunerService; @@ -168,7 +169,6 @@ public class ScreenDecorations extends SystemUI implements Tunable { mDisplayManager = mContext.getSystemService(DisplayManager.class); updateRoundedCornerRadii(); setupDecorations(); - mDisplayListener = new DisplayManager.DisplayListener() { @Override public void onDisplayAdded(int displayId) { @@ -230,7 +230,10 @@ public class ScreenDecorations extends SystemUI implements Tunable { removeAllOverlays(); } - if (hasOverlays() && !mIsRegistered) { + if (hasOverlays()) { + if (mIsRegistered) { + return; + } DisplayMetrics metrics = new DisplayMetrics(); mDisplayManager.getDisplay(DEFAULT_DISPLAY).getMetrics(metrics); mDensity = metrics.density; @@ -271,7 +274,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { return mContext.getDisplay().getCutout(); } - private boolean hasOverlays() { + @VisibleForTesting + boolean hasOverlays() { if (mOverlays == null) { return false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index a974c6d0e5b5c..1b34b3d85c09a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -456,4 +456,52 @@ public class ScreenDecorationsTest extends SysuiTestCase { assertThat(rectsToRegion(Collections.singletonList(rect)).getBounds(), is(rect)); } + @Test + public void testRegistration_From_NoOverlay_To_HasOverlays() { + doReturn(false).when(mScreenDecorations).hasOverlays(); + mScreenDecorations.start(); + verify(mTunerService, times(0)).addTunable(any(), any()); + verify(mTunerService, times(1)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(false)); + reset(mTunerService); + + doReturn(true).when(mScreenDecorations).hasOverlays(); + mScreenDecorations.onConfigurationChanged(new Configuration()); + verify(mTunerService, times(1)).addTunable(any(), any()); + verify(mTunerService, times(0)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(true)); + } + + @Test + public void testRegistration_From_HasOverlays_To_HasOverlays() { + doReturn(true).when(mScreenDecorations).hasOverlays(); + + mScreenDecorations.start(); + verify(mTunerService, times(1)).addTunable(any(), any()); + verify(mTunerService, times(0)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(true)); + reset(mTunerService); + + mScreenDecorations.onConfigurationChanged(new Configuration()); + verify(mTunerService, times(0)).addTunable(any(), any()); + verify(mTunerService, times(0)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(true)); + } + + @Test + public void testRegistration_From_HasOverlays_To_NoOverlay() { + doReturn(true).when(mScreenDecorations).hasOverlays(); + + mScreenDecorations.start(); + verify(mTunerService, times(1)).addTunable(any(), any()); + verify(mTunerService, times(0)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(true)); + reset(mTunerService); + + doReturn(false).when(mScreenDecorations).hasOverlays(); + mScreenDecorations.onConfigurationChanged(new Configuration()); + verify(mTunerService, times(0)).addTunable(any(), any()); + verify(mTunerService, times(1)).removeTunable(any()); + assertThat(mScreenDecorations.mIsRegistered, is(false)); + } }