diff options
7 files changed, 61 insertions, 16 deletions
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index adc0b417dea3..636b929c6aa5 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -77,15 +77,20 @@ android:contentDescription="@string/accessibility_phone_button" android:tint="?attr/wallpaperTextColor" /> - <com.android.systemui.statusbar.phone.LockIcon - android:id="@+id/lock_icon" + <FrameLayout + android:id="@+id/lock_icon_container" android:layout_width="@dimen/keyguard_lock_width" android:layout_height="@dimen/keyguard_lock_height" android:layout_gravity="bottom|center_horizontal" - android:layout_marginBottom="@dimen/keyguard_lock_padding" - android:src="@*android:drawable/ic_lock" - android:contentDescription="@string/accessibility_unlock_button" - android:scaleType="center" /> + android:layout_marginBottom="@dimen/keyguard_lock_padding"> + <com.android.systemui.statusbar.phone.LockIcon + android:id="@+id/lock_icon" + android:layout_width="@dimen/keyguard_lock_width" + android:layout_height="@dimen/keyguard_lock_height" + android:src="@*android:drawable/ic_lock" + android:contentDescription="@string/accessibility_unlock_button" + android:scaleType="center" /> + </FrameLayout> <FrameLayout android:id="@+id/overlay_container" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 800ae5801016..2d91d53212f4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -122,6 +122,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private KeyguardAffordanceView mRightAffordanceView; private KeyguardAffordanceView mLeftAffordanceView; private LockIcon mLockIcon; + private ViewGroup mLockIconContainer; private ViewGroup mIndicationArea; private TextView mEnterpriseDisclosure; private TextView mIndicationText; @@ -244,6 +245,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mRightAffordanceView = findViewById(R.id.camera_button); mLeftAffordanceView = findViewById(R.id.left_button); mLockIcon = findViewById(R.id.lock_icon); + mLockIconContainer = findViewById(R.id.lock_icon_container); mIndicationArea = findViewById(R.id.keyguard_indication_area); mEnterpriseDisclosure = findViewById( R.id.keyguard_indication_enterprise_disclosure); @@ -657,6 +659,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return mLockIcon; } + public ViewGroup getLockIconContainer() { + return mLockIconContainer; + } + public View getIndicationArea() { return mIndicationArea; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index fe3a455302d4..5afff814c111 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -123,6 +123,7 @@ public class KeyguardBouncer { return; } ensureView(); + mIsScrimmed = isScrimmed; // On the keyguard, we want to show the bouncer when the user drags up, but it's // not correct to end the falsing session. We still need to verify if those touches @@ -132,13 +133,13 @@ public class KeyguardBouncer { if (isScrimmed) { setExpansion(EXPANSION_VISIBLE); } - mIsScrimmed = isScrimmed; if (resetSecuritySelection) { // showPrimarySecurityScreen() updates the current security method. This is needed in // case we are already showing and the current security method changed. showPrimarySecurityScreen(); } + if (mRoot.getVisibility() == View.VISIBLE || mShowingSoon) { return; } @@ -168,8 +169,8 @@ public class KeyguardBouncer { mCallback.onBouncerVisiblityChanged(true /* shown */); } - public boolean isShowingScrimmed() { - return isShowing() && mIsScrimmed; + public boolean isScrimmed() { + return mIsScrimmed; } public ViewGroup getLockIconContainer() { @@ -281,6 +282,7 @@ public class KeyguardBouncer { StatsLog.KEYGUARD_BOUNCER_STATE_CHANGED__STATE__HIDDEN); mDismissCallbackRegistry.notifyDismissCancelled(); } + mIsScrimmed = false; mFalsingManager.onBouncerHidden(); mCallback.onBouncerVisiblityChanged(false /* shown */); cancelShowRunnable(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 2c4679e567ac..ab1f500b25e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -3040,6 +3040,7 @@ public class NotificationPanelView extends PanelView implements } ViewGroup bouncerContainer = mBouncer.getLockIconContainer(); + ViewGroup bottomContainer = mKeyguardBottomArea.getLockIconContainer(); LockIcon lockIcon = mKeyguardBottomArea.getLockIcon(); if (mBouncer.isAnimatingAway()) { @@ -3051,9 +3052,21 @@ public class NotificationPanelView extends PanelView implements return; } + // Lock icon needs to be re-parented in case of a scrimmed bouncer, + // otherwise it would be under the scrim. + if (mBouncer.isScrimmed() && bouncerContainer != null + && lockIcon.getParent() != bouncerContainer) { + ((ViewGroup) lockIcon.getParent()).removeView(lockIcon); + bouncerContainer.addView(lockIcon); + } else if (!mBouncer.isScrimmed() && bottomContainer != null + && lockIcon.getParent() != bottomContainer) { + ((ViewGroup) lockIcon.getParent()).removeView(lockIcon); + bottomContainer.addView(lockIcon); + } + float translation = 0; - if (bouncerContainer != null) { - float bottomAreaContainerY = getCommonTop(lockIcon); + if (bouncerContainer != null && bottomContainer != null && !mBouncer.isScrimmed()) { + float bottomAreaContainerY = getCommonTop(bottomContainer); float bouncerLockY = getCommonTop(bouncerContainer); if (bouncerLockY < bottomAreaContainerY) { translation = bouncerLockY - bottomAreaContainerY; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 441285138afd..cbaabf719985 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -86,6 +86,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void onFullyShown() { updateStates(); mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mContainer, "BOUNCER_VISIBLE"); + mNotificationPanelView.updateLockIcon(); } @Override @@ -96,6 +97,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void onFullyHidden() { updateStates(); + mNotificationPanelView.updateLockIcon(); } @Override @@ -759,7 +761,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public boolean bouncerNeedsScrimming() { return mOccluded || mBouncer.willDismissWithAction() || mBouncer.needsFullscreenBouncer() - || mStatusBar.isFullScreenUserSwitcherState() || mBouncer.isShowingScrimmed(); + || mStatusBar.isFullScreenUserSwitcherState() + || (mBouncer.isShowing() && mBouncer.isScrimmed()); } public void dump(PrintWriter pw) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index e84dd68e30ea..c2e60d9e1230 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; @@ -336,11 +337,25 @@ public class KeyguardBouncerTest extends SysuiTestCase { } @Test - public void testIsShowingScrimmed() { + public void testIsShowingScrimmed_true() { + doAnswer(invocation -> { + assertThat(mBouncer.isScrimmed()).isTrue(); + return null; + }).when(mExpansionCallback).onFullyShown(); mBouncer.show(false /* resetSecuritySelection */, true /* animate */); - assertThat(mBouncer.isShowingScrimmed()).isTrue(); + assertThat(mBouncer.isScrimmed()).isTrue(); + mBouncer.hide(false /* destroyView */); + assertThat(mBouncer.isScrimmed()).isFalse(); + } + + @Test + public void testIsShowingScrimmed_false() { + doAnswer(invocation -> { + assertThat(mBouncer.isScrimmed()).isFalse(); + return null; + }).when(mExpansionCallback).onFullyShown(); mBouncer.show(false /* resetSecuritySelection */, false /* animate */); - assertThat(mBouncer.isShowingScrimmed()).isFalse(); + assertThat(mBouncer.isScrimmed()).isFalse(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 1a27765cbcda..7d347d55e930 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -120,7 +120,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Test public void onPanelExpansionChanged_neverHidesScrimmedBouncer() { - when(mBouncer.isShowingScrimmed()).thenReturn(true); + when(mBouncer.isShowing()).thenReturn(true); + when(mBouncer.isScrimmed()).thenReturn(true); mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */, true /* tracking */); verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_VISIBLE)); |