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

View File

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

View File

@@ -23,6 +23,8 @@ import android.view.View.VISIBLE
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.SysuiTestCase 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.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
@@ -44,7 +46,7 @@ import org.mockito.MockitoAnnotations
class NotificationStackSizeCalculatorTest : SysuiTestCase() { class NotificationStackSizeCalculatorTest : SysuiTestCase() {
@Mock private lateinit var sysuiStatusBarStateController: SysuiStatusBarStateController @Mock private lateinit var sysuiStatusBarStateController: SysuiStatusBarStateController
@Mock private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
@Mock private lateinit var stackLayout: NotificationStackScrollLayout @Mock private lateinit var stackLayout: NotificationStackScrollLayout
private val testableResources = mContext.getOrCreateTestableResources() private val testableResources = mContext.getOrCreateTestableResources()
@@ -63,6 +65,7 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() {
sizeCalculator = sizeCalculator =
NotificationStackSizeCalculator( NotificationStackSizeCalculator(
statusBarStateController = sysuiStatusBarStateController, statusBarStateController = sysuiStatusBarStateController,
lockscreenShadeTransitionController = lockscreenShadeTransitionController,
testableResources.resources) testableResources.resources)
} }
@@ -155,6 +158,55 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() {
assertThat(height).isAtMost(availableSpace) 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( private fun computeMaxKeyguardNotifications(
rows: List<ExpandableView>, rows: List<ExpandableView>,
availableSpace: Float, availableSpace: Float,