Now Playing is too low on the lock screen

NOTE: on udfps devices while now playing + on pixel stand 2, and max density, there remains overlapping related to the assistant icon.

Test: manually test UI on Pixel Stand 2
Test: manually test UI by pushing song to NowPlaying via adb
Test: manually test on devices both with and without udfps, on large screen density and low density
Fixes: 230466568
Change-Id: I6f92c92f616363bf1812d221d31e614501b872df
This commit is contained in:
Brad Hinegardner
2022-10-25 03:26:04 -04:00
parent bbe23b9b80
commit bbbca1933b
11 changed files with 107 additions and 13 deletions

View File

@@ -762,7 +762,7 @@
<dimen name="keyguard_lock_padding">20dp</dimen>
<dimen name="keyguard_indication_margin_bottom">32dp</dimen>
<dimen name="lock_icon_margin_bottom">110dp</dimen>
<dimen name="lock_icon_margin_bottom">74dp</dimen>
<dimen name="ambient_indication_margin_bottom">71dp</dimen>

View File

@@ -158,6 +158,10 @@ public class LockIconView extends FrameLayout implements Dumpable {
return mLockIconCenter.y - mRadius;
}
float getLocationBottom() {
return mLockIconCenter.y + mRadius;
}
/**
* Updates the icon its default state where no visual is shown.
*/

View File

@@ -280,6 +280,10 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
return mView.getLocationTop();
}
public float getBottom() {
return mView.getLocationBottom();
}
private void updateVisibility() {
if (mCancelDelayedUpdateVisibilityRunnable != null) {
mCancelDelayedUpdateVisibilityRunnable.run();

View File

@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.data.repository
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.common.shared.model.Position
@@ -123,6 +124,11 @@ interface KeyguardRepository {
* Sets the relative offset of the lock-screen clock from its natural position on the screen.
*/
fun setClockPosition(x: Int, y: Int)
/**
* Returns whether the keyguard bottom area should be constrained to the top of the lock icon
*/
fun isUdfpsSupported(): Boolean
}
/** Encapsulates application state for the keyguard. */
@@ -130,11 +136,12 @@ interface KeyguardRepository {
class KeyguardRepositoryImpl
@Inject
constructor(
statusBarStateController: StatusBarStateController,
private val keyguardStateController: KeyguardStateController,
dozeHost: DozeHost,
wakefulnessLifecycle: WakefulnessLifecycle,
biometricUnlockController: BiometricUnlockController,
statusBarStateController: StatusBarStateController,
dozeHost: DozeHost,
wakefulnessLifecycle: WakefulnessLifecycle,
biometricUnlockController: BiometricUnlockController,
private val keyguardStateController: KeyguardStateController,
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
) : KeyguardRepository {
private val _animateBottomAreaDozingTransitions = MutableStateFlow(false)
override val animateBottomAreaDozingTransitions =
@@ -311,6 +318,8 @@ constructor(
_clockPosition.value = Position(x, y)
}
override fun isUdfpsSupported(): Boolean = keyguardUpdateMonitor.isUdfpsSupported
private fun statusBarStateIntToObject(value: Int): StatusBarState {
return when (value) {
0 -> StatusBarState.SHADE

View File

@@ -48,4 +48,9 @@ constructor(
fun setAnimateDozingTransitions(animate: Boolean) {
repository.setAnimateDozingTransitions(animate)
}
/**
* Returns whether the keyguard bottom area should be constrained to the top of the lock icon
*/
fun shouldConstrainToTopOfLockIcon(): Boolean = repository.isUdfpsSupported()
}

View File

@@ -27,6 +27,8 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.LockIconViewController
import com.android.settingslib.Utils
import com.android.systemui.R
import com.android.systemui.animation.Expandable
@@ -69,6 +71,11 @@ object KeyguardBottomAreaViewBinder {
/** Notifies that device configuration has changed. */
fun onConfigurationChanged()
/**
* Returns whether the keyguard bottom area should be constrained to the top of the lock icon
*/
fun shouldConstrainToTopOfLockIcon(): Boolean
}
/** Binds the view to the view-model, continuing to update the former based on the latter. */
@@ -208,6 +215,9 @@ object KeyguardBottomAreaViewBinder {
override fun onConfigurationChanged() {
configurationBasedDimensions.value = loadFromResources(view)
}
override fun shouldConstrainToTopOfLockIcon(): Boolean =
viewModel.shouldConstrainToTopOfLockIcon()
}
}

View File

@@ -90,6 +90,12 @@ constructor(
.distinctUntilChanged()
}
/**
* Returns whether the keyguard bottom area should be constrained to the top of the lock icon
*/
fun shouldConstrainToTopOfLockIcon(): Boolean =
bottomAreaInteractor.shouldConstrainToTopOfLockIcon()
private fun button(
position: KeyguardQuickAffordancePosition
): Flow<KeyguardQuickAffordanceViewModel> {

View File

@@ -1309,7 +1309,11 @@ public final class NotificationPanelViewController {
}
private void initBottomArea() {
mKeyguardBottomArea.init(mKeyguardBottomAreaViewModel, mFalsingManager);
mKeyguardBottomArea.init(
mKeyguardBottomAreaViewModel,
mFalsingManager,
mLockIconViewController
);
}
@VisibleForTesting

View File

@@ -23,6 +23,8 @@ import android.view.ViewGroup
import android.view.ViewPropertyAnimator
import android.view.WindowInsets
import android.widget.FrameLayout
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.LockIconViewController
import com.android.systemui.R
import com.android.systemui.keyguard.ui.binder.KeyguardBottomAreaViewBinder
import com.android.systemui.keyguard.ui.binder.KeyguardBottomAreaViewBinder.bind
@@ -51,13 +53,20 @@ constructor(
private var ambientIndicationArea: View? = null
private lateinit var binding: KeyguardBottomAreaViewBinder.Binding
private lateinit var lockIconViewController: LockIconViewController
/** Initializes the view. */
fun init(
viewModel: KeyguardBottomAreaViewModel,
falsingManager: FalsingManager,
lockIconViewController: LockIconViewController,
) {
binding = bind(this, viewModel, falsingManager)
binding = bind(
this,
viewModel,
falsingManager,
)
this.lockIconViewController = lockIconViewController
}
/**
@@ -114,4 +123,29 @@ constructor(
}
return insets
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
findViewById<View>(R.id.ambient_indication_container)?.let {
val (ambientLeft, ambientTop) = it.locationOnScreen
if (binding.shouldConstrainToTopOfLockIcon()) {
//make top of ambient indication view the bottom of the lock icon
it.layout(
ambientLeft,
lockIconViewController.bottom.toInt(),
right - ambientLeft,
ambientTop + it.measuredHeight
)
} else {
//make bottom of ambient indication view the top of the lock icon
val lockLocationTop = lockIconViewController.top
it.layout(
ambientLeft,
lockLocationTop.toInt() - it.measuredHeight,
right - ambientLeft,
lockLocationTop.toInt()
)
}
}
}
}

View File

@@ -17,6 +17,7 @@
package com.android.systemui.keyguard.data.repository
import androidx.test.filters.SmallTest
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.shared.model.Position
import com.android.systemui.doze.DozeHost
@@ -48,6 +49,7 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
@Mock private lateinit var dozeHost: DozeHost
@Mock private lateinit var keyguardStateController: KeyguardStateController
@Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
@Mock private lateinit var biometricUnlockController: BiometricUnlockController
private lateinit var underTest: KeyguardRepositoryImpl
@@ -58,11 +60,12 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
underTest =
KeyguardRepositoryImpl(
statusBarStateController,
keyguardStateController,
dozeHost,
wakefulnessLifecycle,
biometricUnlockController,
statusBarStateController,
dozeHost,
wakefulnessLifecycle,
biometricUnlockController,
keyguardStateController,
keyguardUpdateMonitor,
)
}
@@ -223,6 +226,15 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
}
@Test
fun isUdfpsSupported() = runBlockingTest {
whenever(keyguardUpdateMonitor.isUdfpsSupported).thenReturn(true)
assertThat(underTest.isUdfpsSupported()).isTrue()
whenever(keyguardUpdateMonitor.isUdfpsSupported).thenReturn(false)
assertThat(underTest.isUdfpsSupported()).isFalse()
}
@Test
fun isBouncerShowing() = runBlockingTest {
whenever(keyguardStateController.isBouncerShowing).thenReturn(false)
var latest: Boolean? = null

View File

@@ -53,6 +53,8 @@ class FakeKeyguardRepository : KeyguardRepository {
private val _wakefulnessState = MutableStateFlow(WakefulnessModel.ASLEEP)
override val wakefulnessState: Flow<WakefulnessModel> = _wakefulnessState
private val _isUdfpsSupported = MutableStateFlow(false)
private val _isBouncerShowing = MutableStateFlow(false)
override val isBouncerShowing: Flow<Boolean> = _isBouncerShowing
@@ -86,4 +88,8 @@ class FakeKeyguardRepository : KeyguardRepository {
fun setDozeAmount(dozeAmount: Float) {
_dozeAmount.value = dozeAmount
}
override fun isUdfpsSupported(): Boolean {
return _isUdfpsSupported.value
}
}