Merge "Restore notification stack updates during lockscreen-to-shade" into tm-dev am: 022f4485d6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17765603 Change-Id: If78a3e0f8034e7530c8ab9a781347e73963b65e5 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user