Merge "Restore notification stack updates during lockscreen-to-shade" into tm-dev

This commit is contained in:
Lyn Han
2022-04-16 01:51:00 +00:00
committed by Android (Google) Code Review
3 changed files with 74 additions and 10 deletions

View File

@@ -72,6 +72,9 @@ class LockscreenShadeTransitionController @Inject constructor(
dumpManager: DumpManager
) : Dumpable {
private var pulseHeight: Float = 0f
@get:VisibleForTesting
var fractionToShade: Float = 0f
private set
private var useSplitShade: Boolean = false
private lateinit var nsslController: NotificationStackScrollLayoutController
lateinit var notificationPanelController: NotificationPanelViewController
@@ -405,9 +408,9 @@ class LockscreenShadeTransitionController @Inject constructor(
if (field != value || forceApplyAmount) {
field = value
if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) {
val notificationShelfProgress =
fractionToShade =
MathUtils.saturate(dragDownAmount / notificationShelfTransitionDistance)
nsslController.setTransitionToFullShadeAmount(notificationShelfProgress)
nsslController.setTransitionToFullShadeAmount(fractionToShade)
qSDragProgress = MathUtils.saturate(dragDownAmount / qsTransitionDistance)
qS.setTransitionToFullShadeAmount(field, qSDragProgress)

View File

@@ -19,9 +19,11 @@ package com.android.systemui.statusbar.notification.stack
import android.content.res.Resources
import android.util.Log
import android.view.View.GONE
import androidx.annotation.VisibleForTesting
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.StatusBarState.KEYGUARD
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
@@ -41,6 +43,7 @@ class NotificationStackSizeCalculator
@Inject
constructor(
private val statusBarStateController: SysuiStatusBarStateController,
private val lockscreenShadeTransitionController: LockscreenShadeTransitionController,
@Main private val resources: Resources
) {
@@ -129,7 +132,7 @@ constructor(
yield(dividerHeight + shelfIntrinsicHeight) // Only shelf.
children.forEachIndexed { i, currentNotification ->
height += currentNotification.spaceNeeded(i, previous, stack, onLockscreen)
height += spaceNeeded(currentNotification, i, previous, stack, onLockscreen)
previous = currentNotification
val shelfHeight =
@@ -156,22 +159,28 @@ constructor(
private val NotificationStackScrollLayout.childrenSequence: Sequence<ExpandableView>
get() = children.map { it as ExpandableView }
private fun onLockscreen() = statusBarStateController.state == KEYGUARD
@VisibleForTesting
fun onLockscreen() : Boolean {
return statusBarStateController.state == KEYGUARD
&& lockscreenShadeTransitionController.fractionToShade == 0f
}
private fun ExpandableView.spaceNeeded(
@VisibleForTesting
fun spaceNeeded(
view: ExpandableView,
visibleIndex: Int,
previousView: ExpandableView?,
stack: NotificationStackScrollLayout,
onLockscreen: Boolean
): Float {
assert(isShowable(onLockscreen))
assert(view.isShowable(onLockscreen))
var size =
if (onLockscreen) {
getMinHeight(/* ignoreTemporaryStates= */ true).toFloat()
view.getMinHeight(/* ignoreTemporaryStates= */ true).toFloat()
} else {
intrinsicHeight.toFloat()
view.intrinsicHeight.toFloat()
}
size += calculateGapAndDividerHeight(stack, previousView, current = this, visibleIndex)
size += calculateGapAndDividerHeight(stack, previousView, current = view, visibleIndex)
return size
}

View File

@@ -23,6 +23,8 @@ import android.view.View.VISIBLE
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
@@ -44,7 +46,7 @@ import org.mockito.MockitoAnnotations
class NotificationStackSizeCalculatorTest : SysuiTestCase() {
@Mock private lateinit var sysuiStatusBarStateController: SysuiStatusBarStateController
@Mock private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
@Mock private lateinit var stackLayout: NotificationStackScrollLayout
private val testableResources = mContext.getOrCreateTestableResources()
@@ -63,6 +65,7 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() {
sizeCalculator =
NotificationStackSizeCalculator(
statusBarStateController = sysuiStatusBarStateController,
lockscreenShadeTransitionController = lockscreenShadeTransitionController,
testableResources.resources)
}
@@ -155,6 +158,55 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() {
assertThat(height).isAtMost(availableSpace)
}
@Test
fun onLockscreen_onKeyguard_AndNotGoingToShade_returnsTrue() {
whenever(sysuiStatusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
whenever(lockscreenShadeTransitionController.fractionToShade).thenReturn(0f)
assertThat(sizeCalculator.onLockscreen()).isTrue()
}
@Test
fun onLockscreen_goingToShade_returnsFalse() {
whenever(sysuiStatusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
whenever(lockscreenShadeTransitionController.fractionToShade).thenReturn(0.5f)
assertThat(sizeCalculator.onLockscreen()).isFalse()
}
@Test
fun onLockscreen_notOnLockscreen_returnsFalse() {
whenever(sysuiStatusBarStateController.state).thenReturn(StatusBarState.SHADE)
whenever(lockscreenShadeTransitionController.fractionToShade).thenReturn(1f)
assertThat(sizeCalculator.onLockscreen()).isFalse()
}
@Test
fun spaceNeeded_onLockscreen_usesMinHeight() {
setGapHeight(0f)
// No divider height since we're testing one element where index = 0
val expandableView = createMockRow(rowHeight)
whenever(expandableView.getMinHeight(any())).thenReturn(5)
whenever(expandableView.intrinsicHeight).thenReturn(10)
val space = sizeCalculator.spaceNeeded(expandableView, visibleIndex = 0,
previousView = null, stack = stackLayout, onLockscreen = true)
assertThat(space).isEqualTo(5)
}
@Test
fun spaceNeeded_notOnLockscreen_usesIntrinsicHeight() {
setGapHeight(0f)
// No divider height since we're testing one element where index = 0
val expandableView = createMockRow(rowHeight)
whenever(expandableView.getMinHeight(any())).thenReturn(5)
whenever(expandableView.intrinsicHeight).thenReturn(10)
val space = sizeCalculator.spaceNeeded(expandableView, visibleIndex = 0,
previousView = null, stack = stackLayout, onLockscreen = false)
assertThat(space).isEqualTo(10)
}
private fun computeMaxKeyguardNotifications(
rows: List<ExpandableView>,
availableSpace: Float,