From 109831c3c0c6ae053d278c0ba5a9434dac9b6261 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Wed, 3 Nov 2021 18:54:18 +0000 Subject: [PATCH 1/2] Moving now playing widget above lock icon in split shade This change extracts lock icon padding to resources and simplifies it a bit. Also fixes small inaccuracy when reading screen size in pixels which didn't take into account status bar. Moving margins from inner ambient to ambient container so they can be easily refreshed when layout changes. Also moving some piece of code from AmbientContainer to NPVC as it feels a bit weird that ambient container knows about stack scroller. Fixes: 204567063 Bug: 204567056 Test: manual Change-Id: Ifab2980a8bfd5bf0e62b5deed85b9b811060f714 --- .../res/values-sw600dp-land/config.xml | 1 - .../res/values-sw600dp-land/dimens.xml | 24 +++++++++++++++++++ packages/SystemUI/res/values/dimens.xml | 4 +++- .../keyguard/LockIconViewController.java | 18 +++++++------- .../NotificationPanelViewController.java | 7 +++++- .../keyguard/LockIconViewControllerTest.java | 10 +++++--- 6 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 packages/SystemUI/res/values-sw600dp-land/dimens.xml diff --git a/packages/SystemUI/res/values-sw600dp-land/config.xml b/packages/SystemUI/res/values-sw600dp-land/config.xml index 040df865bfe52..362e18d785ac0 100644 --- a/packages/SystemUI/res/values-sw600dp-land/config.xml +++ b/packages/SystemUI/res/values-sw600dp-land/config.xml @@ -33,5 +33,4 @@ false - 25dp diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml new file mode 100644 index 0000000000000..23f138ba250fc --- /dev/null +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -0,0 +1,24 @@ + + + + + + 25dp + 115dp + 60dp + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index db6985d2b61f1..58beb000539ce 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -929,7 +929,9 @@ 20dp 32dp - 98dp + 110dp + 71dp + 12sp diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 3c80a186a4a77..df066027e784b 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -43,6 +43,7 @@ import android.view.GestureDetector.SimpleOnGestureListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -85,7 +86,6 @@ public class LockIconViewController extends ViewController impleme private static final float sDefaultDensity = (float) DisplayMetrics.DENSITY_DEVICE_STABLE / (float) DisplayMetrics.DENSITY_DEFAULT; private static final int sLockIconRadiusPx = (int) (sDefaultDensity * 36); - private static final float sDistAboveKgBottomAreaPx = sDefaultDensity * 12; private static final AudioAttributes VIBRATION_SONIFICATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) @@ -126,7 +126,7 @@ public class LockIconViewController extends ViewController impleme private boolean mUdfpsSupported; private float mHeightPixels; private float mWidthPixels; - private int mBottomPadding; // in pixels + private int mBottomPaddingPx; private boolean mShowUnlockIcon; private boolean mShowLockIcon; @@ -347,11 +347,11 @@ public class LockIconViewController extends ViewController impleme } private void updateConfiguration() { - final DisplayMetrics metrics = mView.getContext().getResources().getDisplayMetrics(); - mWidthPixels = metrics.widthPixels; - mHeightPixels = metrics.heightPixels; - mBottomPadding = mView.getContext().getResources().getDimensionPixelSize( - R.dimen.lock_icon_margin_bottom); + WindowManager windowManager = getContext().getSystemService(WindowManager.class); + Rect bounds = windowManager.getCurrentWindowMetrics().getBounds(); + mWidthPixels = bounds.right; + mHeightPixels = bounds.bottom; + mBottomPaddingPx = getResources().getDimensionPixelSize(R.dimen.lock_icon_margin_bottom); mUnlockedLabel = mView.getContext().getResources().getString( R.string.accessibility_unlock_button); @@ -370,8 +370,8 @@ public class LockIconViewController extends ViewController impleme } else { mView.setCenterLocation( new PointF(mWidthPixels / 2, - mHeightPixels - mBottomPadding - sDistAboveKgBottomAreaPx - - sLockIconRadiusPx), sLockIconRadiusPx); + mHeightPixels - mBottomPaddingPx - sLockIconRadiusPx), + sLockIconRadiusPx); } mView.getHitRect(mSensorTouchLocation); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 3fe393d99c7f4..5551611ef5a85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3525,7 +3525,12 @@ public class NotificationPanelViewController extends PanelViewController { mNotificationStackScrollLayoutController.setPulsing(pulsing, animatePulse); } - public void setAmbientIndicationBottomPadding(int ambientIndicationBottomPadding) { + public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) { + int ambientIndicationBottomPadding = 0; + if (ambientTextVisible) { + int stackBottom = mNotificationStackScrollLayoutController.getView().getBottom(); + ambientIndicationBottomPadding = stackBottom - ambientIndicationTop; + } if (mAmbientIndicationBottomPadding != ambientIndicationBottomPadding) { mAmbientIndicationBottomPadding = ambientIndicationBottomPadding; updateMaxDisplayedNotifications(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java index 5e73dbcbc95d4..a37d3af786109 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; import android.graphics.PointF; +import android.graphics.Rect; import android.graphics.drawable.AnimatedStateListDrawable; import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.SensorLocationInternal; @@ -39,10 +40,10 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.util.DisplayMetrics; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; +import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import androidx.test.filters.SmallTest; @@ -70,6 +71,7 @@ import com.airbnb.lottie.LottieAnimationView; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -88,7 +90,7 @@ public class LockIconViewControllerTest extends SysuiTestCase { private @Mock AnimatedStateListDrawable mIconDrawable; private @Mock Context mContext; private @Mock Resources mResources; - private @Mock DisplayMetrics mDisplayMetrics; + private @Mock(answer = Answers.RETURNS_DEEP_STUBS) WindowManager mWindowManager; private @Mock StatusBarStateController mStatusBarStateController; private @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor; private @Mock KeyguardViewController mKeyguardViewController; @@ -137,7 +139,9 @@ public class LockIconViewControllerTest extends SysuiTestCase { when(mLockIconView.getContext()).thenReturn(mContext); when(mLockIconView.findViewById(R.layout.udfps_aod_lock_icon)).thenReturn(mAodFp); when(mContext.getResources()).thenReturn(mResources); - when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); + when(mContext.getSystemService(WindowManager.class)).thenReturn(mWindowManager); + Rect windowBounds = new Rect(0, 0, 800, 1200); + when(mWindowManager.getCurrentWindowMetrics().getBounds()).thenReturn(windowBounds); when(mResources.getString(R.string.accessibility_unlock_button)).thenReturn(UNLOCKED_LABEL); when(mResources.getDrawable(anyInt(), any())).thenReturn(mIconDrawable); From 38f8e0e53e6c25f809bdcf66c554999f4c25b4e9 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Tue, 9 Nov 2021 18:30:27 +0000 Subject: [PATCH 2/2] Moving notifications and keyguard status higher in split shade lockscreen Decreasing Y position of keyguard status view and decreasing padding of notifications. Padding of notifications is calculated instead of provided with resources because notifications already have margin that is flexible and would be likely overriden in overlays. Fixes: 204568802 Test: KeyguardClockPositionAlgorithmTest Change-Id: I3f9c60ec03bfdc3efc347d3dd1cb1b66c6dcd865 --- .../res/values-sw600dp-land/dimens.xml | 4 ++ packages/SystemUI/res/values/dimens.xml | 3 ++ .../phone/KeyguardClockPositionAlgorithm.java | 39 ++++++++++--------- .../KeyguardClockPositionAlgorithmTest.java | 30 +++++++++++++- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml index 23f138ba250fc..3cfe056380320 100644 --- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -21,4 +21,8 @@ 25dp 115dp 60dp + + + 8dp diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 58beb000539ce..7aa96fc4c2a24 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -747,6 +747,9 @@ 100dp + + 68dp 20dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 4f3bbdbff030b..7ca8652e1b3c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -56,21 +56,6 @@ public class KeyguardClockPositionAlgorithm { */ private int mUserSwitchPreferredY; - /** - * Whether or not there is a custom clock face on keyguard. - */ - private boolean mHasCustomClock; - - /** - * Whether or not the NSSL contains any visible notifications. - */ - private boolean mHasVisibleNotifs; - - /** - * Height of notification stack: Sum of height of each notification. - */ - private int mNotificationStackHeight; - /** * Minimum top margin to avoid overlap with status bar, lock icon, or multi-user switcher * avatar. @@ -87,6 +72,16 @@ public class KeyguardClockPositionAlgorithm { */ private int mContainerTopPadding; + /** + * Top margin of notifications introduced by presence of split shade header / status bar + */ + private int mSplitShadeTopNotificationsMargin; + + /** + * Target margin for notifications and clock from the top of the screen in split shade + */ + private int mSplitShadeTargetTopMargin; + /** * @see NotificationPanelViewController#getExpandedFraction() */ @@ -152,6 +147,10 @@ public class KeyguardClockPositionAlgorithm { public void loadDimens(Resources res) { mStatusViewBottomMargin = res.getDimensionPixelSize( R.dimen.keyguard_status_view_bottom_margin); + mSplitShadeTopNotificationsMargin = + res.getDimensionPixelSize(R.dimen.split_shade_header_height); + mSplitShadeTargetTopMargin = + res.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin); mContainerTopPadding = res.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin); @@ -214,7 +213,7 @@ public class KeyguardClockPositionAlgorithm { if (mBypassEnabled) { return (int) (mUnlockedStackScrollerPadding + mOverStretchAmount); } else if (mIsSplitShade) { - return clockYPosition; + return Math.max(0, clockYPosition - mSplitShadeTopNotificationsMargin); } else { return clockYPosition + mKeyguardStatusHeight; } @@ -224,14 +223,18 @@ public class KeyguardClockPositionAlgorithm { if (mBypassEnabled) { return mUnlockedStackScrollerPadding; } else if (mIsSplitShade) { - return mMinTopMargin; + return Math.max(mSplitShadeTargetTopMargin, mMinTopMargin); } else { return mMinTopMargin + mKeyguardStatusHeight; } } private int getExpandedPreferredClockY() { - return mMinTopMargin + mUserSwitchHeight; + if (mIsSplitShade) { + return Math.max(mSplitShadeTargetTopMargin, mMinTopMargin); + } else { + return mMinTopMargin; + } } public int getLockscreenStatusViewHeight() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java index 624bedc30be9b..11826954baee9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java @@ -262,6 +262,34 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { assertThat(mClockPosition.stackScrollerPadding).isEqualTo(0); } + @Test + public void clockPositionedDependingOnMarginInSplitShade() { + when(mResources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)) + .thenReturn(400); + mClockPositionAlgorithm.loadDimens(mResources); + givenLockScreen(); + mIsSplitShade = true; + // WHEN the position algorithm is run + positionClock(); + + assertThat(mClockPosition.clockY).isEqualTo(400); + } + + @Test + public void notifPaddingMakesUpToFullMarginInSplitShade() { + when(mResources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)) + .thenReturn(100); + when(mResources.getDimensionPixelSize(R.dimen.split_shade_header_height)) + .thenReturn(70); + mClockPositionAlgorithm.loadDimens(mResources); + givenLockScreen(); + mIsSplitShade = true; + // WHEN the position algorithm is run + positionClock(); + // THEN the notif padding makes up lacking margin (margin - header height = 30). + assertThat(mClockPosition.stackScrollerPadding).isEqualTo(30); + } + @Test public void notifPaddingExpandedAlignedWithClockInSplitShadeMode() { givenLockScreen(); @@ -271,7 +299,7 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { positionClock(); // THEN the padding DOESN'T adjust for keyguard status height. assertThat(mClockPosition.stackScrollerPaddingExpanded) - .isEqualTo(mClockPosition.clockYFullyDozing); + .isEqualTo(mClockPosition.clockY); } @Test