Merge "Revert "Motion: tweak split shade expansion on lockscreen with media."" into tm-dev

This commit is contained in:
Christian Göllner
2022-02-24 16:04:44 +00:00
committed by Android (Google) Code Review
9 changed files with 45 additions and 182 deletions

View File

@@ -42,8 +42,4 @@
the shade (in alpha) --> the shade (in alpha) -->
<dimen name="lockscreen_shade_scrim_transition_distance">200dp</dimen> <dimen name="lockscreen_shade_scrim_transition_distance">200dp</dimen>
<!-- Distance that the full shade transition takes in order for media to fully transition to
the shade -->
<dimen name="lockscreen_shade_media_transition_distance">200dp</dimen>
</resources> </resources>

View File

@@ -795,9 +795,6 @@ class MediaHierarchyManager @Inject constructor(
@TransformationType @TransformationType
fun calculateTransformationType(): Int { fun calculateTransformationType(): Int {
if (isTransitioningToFullShade) { if (isTransitioningToFullShade) {
if (inSplitShade) {
return TRANSFORMATION_TYPE_TRANSITION
}
return TRANSFORMATION_TYPE_FADE return TRANSFORMATION_TYPE_FADE
} }
if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS || if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS ||
@@ -964,7 +961,6 @@ class MediaHierarchyManager @Inject constructor(
(qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS (qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS
qsExpansion > 0.4f && onLockscreen -> LOCATION_QS qsExpansion > 0.4f && onLockscreen -> LOCATION_QS
!hasActiveMedia -> LOCATION_QS !hasActiveMedia -> LOCATION_QS
onLockscreen && isSplitShadeExpanding() -> LOCATION_QS
onLockscreen && isTransformingToFullShadeAndInQQS() -> LOCATION_QQS onLockscreen && isTransformingToFullShadeAndInQQS() -> LOCATION_QQS
onLockscreen && allowedOnLockscreen -> LOCATION_LOCKSCREEN onLockscreen && allowedOnLockscreen -> LOCATION_LOCKSCREEN
else -> LOCATION_QQS else -> LOCATION_QQS
@@ -990,10 +986,6 @@ class MediaHierarchyManager @Inject constructor(
return location return location
} }
private fun isSplitShadeExpanding(): Boolean {
return inSplitShade && isTransitioningToFullShade
}
/** /**
* Are we currently transforming to the full shade and already in QQS * Are we currently transforming to the full shade and already in QQS
*/ */
@@ -1001,10 +993,6 @@ class MediaHierarchyManager @Inject constructor(
if (!isTransitioningToFullShade) { if (!isTransitioningToFullShade) {
return false return false
} }
if (inSplitShade) {
// Split shade doesn't use QQS.
return false
}
return fullShadeTransitionProgress > 0.5f return fullShadeTransitionProgress > 0.5f
} }
@@ -1012,10 +1000,6 @@ class MediaHierarchyManager @Inject constructor(
* Is the current transformationType fading * Is the current transformationType fading
*/ */
private fun isCurrentlyFading(): Boolean { private fun isCurrentlyFading(): Boolean {
if (isSplitShadeExpanding()) {
// Split shade always uses transition instead of fade.
return false
}
if (isTransitioningToFullShade) { if (isTransitioningToFullShade) {
return true return true
} }

View File

@@ -513,8 +513,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
mContainer.setExpansion(expansion); mContainer.setExpansion(expansion);
final float translationScaleY = (mInSplitShade final float translationScaleY = (mInSplitShade
? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1);
boolean onKeyguard = isKeyguardState(); boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard;
boolean onKeyguardAndExpanded = onKeyguard && !mShowCollapsedOnKeyguard;
if (!mHeaderAnimating && !headerWillBeAnimating()) { if (!mHeaderAnimating && !headerWillBeAnimating()) {
getView().setTranslationY( getView().setTranslationY(
onKeyguardAndExpanded onKeyguardAndExpanded
@@ -548,7 +547,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
mHeader.updateResources(); mHeader.updateResources();
} }
} }
mQSPanelController.setIsOnKeyguard(onKeyguard);
mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion);
mQSFooterActionController.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mQSFooterActionController.setExpansion(onKeyguardAndExpanded ? 1 : expansion);
mQSPanelController.setRevealExpansion(expansion); mQSPanelController.setRevealExpansion(expansion);

View File

@@ -110,8 +110,6 @@ public class QSPanel extends LinearLayout implements Tunable {
private final ArrayMap<View, Integer> mChildrenLayoutTop = new ArrayMap<>(); private final ArrayMap<View, Integer> mChildrenLayoutTop = new ArrayMap<>();
private final Rect mClippingRect = new Rect(); private final Rect mClippingRect = new Rect();
private boolean mUseNewFooter = false; private boolean mUseNewFooter = false;
private ViewGroup mMediaHostView;
private boolean mShouldMoveMediaOnExpansion = true;
public QSPanel(Context context, AttributeSet attrs) { public QSPanel(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -291,15 +289,9 @@ public class QSPanel extends LinearLayout implements Tunable {
for (int i = 0; i < getChildCount(); i++) { for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i); View child = getChildAt(i);
if (move) { if (move) {
int topOffset;
if (child == mMediaHostView && !mShouldMoveMediaOnExpansion) {
topOffset = 0;
} else {
topOffset = tileHeightOffset;
}
int top = Objects.requireNonNull(mChildrenLayoutTop.get(child)); int top = Objects.requireNonNull(mChildrenLayoutTop.get(child));
child.setLeftTopRightBottom(child.getLeft(), top + topOffset, child.setLeftTopRightBottom(child.getLeft(), top + tileHeightOffset,
child.getRight(), top + topOffset + child.getHeight()); child.getRight(), top + tileHeightOffset + child.getHeight());
} }
if (child == mTileLayout) { if (child == mTileLayout) {
move = true; move = true;
@@ -471,7 +463,6 @@ public class QSPanel extends LinearLayout implements Tunable {
if (!mUsingMediaPlayer) { if (!mUsingMediaPlayer) {
return; return;
} }
mMediaHostView = hostView;
ViewGroup newParent = horizontal ? mHorizontalLinearLayout : this; ViewGroup newParent = horizontal ? mHorizontalLinearLayout : this;
ViewGroup currentParent = (ViewGroup) hostView.getParent(); ViewGroup currentParent = (ViewGroup) hostView.getParent();
if (currentParent != newParent) { if (currentParent != newParent) {
@@ -665,19 +656,6 @@ public class QSPanel extends LinearLayout implements Tunable {
updatePadding(); updatePadding();
} }
/**
* Sets whether the media container should move during the expansion of the QS Panel.
*
* As the QS Panel expands and the QS unsquish, the views below the QS tiles move to adapt to
* the new height of the QS tiles.
*
* In some cases this might not be wanted for media. One example is when there is a transition
* animation of the media container happening on split shade lock screen.
*/
public void setShouldMoveMediaOnExpansion(boolean shouldMoveMediaOnExpansion) {
mShouldMoveMediaOnExpansion = shouldMoveMediaOnExpansion;
}
private class H extends Handler { private class H extends Handler {
private static final int ANNOUNCE_FOR_ACCESSIBILITY = 1; private static final int ANNOUNCE_FOR_ACCESSIBILITY = 1;

View File

@@ -419,16 +419,6 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
return mView.getBrightnessView(); return mView.getBrightnessView();
} }
/** Sets whether we are currently on lock screen. */
public void setIsOnKeyguard(boolean isOnKeyguard) {
boolean isOnSplitShadeLockscreen = mShouldUseSplitNotificationShade && isOnKeyguard;
// When the split shade is expanding on lockscreen, the media container transitions from the
// lockscreen to QS.
// We have to prevent the media container position from moving during the transition to have
// a smooth translation animation without stuttering.
mView.setShouldMoveMediaOnExpansion(!isOnSplitShadeLockscreen);
}
/** */ /** */
public static final class TileRecord { public static final class TileRecord {
public TileRecord(QSTile tile, com.android.systemui.plugins.qs.QSTileView tileView) { public TileRecord(QSTile tile, com.android.systemui.plugins.qs.QSTileView tileView) {

View File

@@ -342,7 +342,9 @@ class LockscreenShadeTransitionController @Inject constructor(
qS.setTransitionToFullShadeAmount(field, qSDragProgress) qS.setTransitionToFullShadeAmount(field, qSDragProgress)
notificationPanelController.setTransitionToFullShadeAmount(field, notificationPanelController.setTransitionToFullShadeAmount(field,
false /* animate */, 0 /* delay */) false /* animate */, 0 /* delay */)
mediaHierarchyManager.setTransitionToFullShadeAmount(field) // TODO: appear media also in split shade
val mediaAmount = if (useSplitShade) 0f else field
mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount)
transitionToShadeAmountCommon(field) transitionToShadeAmountCommon(field)
} }
} }

View File

@@ -33,11 +33,10 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.animation.UniqueObjectHostView
import com.android.systemui.util.mockito.any import junit.framework.Assert
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertNotNull import org.junit.Assert.assertNotNull
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
@@ -45,16 +44,16 @@ import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyLong
import org.mockito.Captor import org.mockito.Captor
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.any
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.anyLong
import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.times import org.mockito.Mockito.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoJUnit
import org.mockito.Mockito.`when` as whenever
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
@@ -84,6 +83,8 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
@Mock @Mock
private lateinit var keyguardViewController: KeyguardViewController private lateinit var keyguardViewController: KeyguardViewController
@Mock @Mock
private lateinit var configurationController: ConfigurationController
@Mock
private lateinit var uniqueObjectHostView: UniqueObjectHostView private lateinit var uniqueObjectHostView: UniqueObjectHostView
@Mock @Mock
private lateinit var dreamOverlayStateController: DreamOverlayStateController private lateinit var dreamOverlayStateController: DreamOverlayStateController
@@ -96,7 +97,6 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
val mockito = MockitoJUnit.rule() val mockito = MockitoJUnit.rule()
private lateinit var mediaHiearchyManager: MediaHierarchyManager private lateinit var mediaHiearchyManager: MediaHierarchyManager
private lateinit var mediaFrame: ViewGroup private lateinit var mediaFrame: ViewGroup
private val configurationController = FakeConfigurationController()
@Before @Before
fun setup() { fun setup() {
@@ -176,7 +176,12 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
@Test @Test
fun testGoingToFullShade() { fun testGoingToFullShade() {
goToLockscreen() // Let's set it onto Lock screen
`when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
`when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn(
true)
statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD)
clearInvocations(mediaCarouselController)
// Let's transition all the way to full shade // Let's transition all the way to full shade
mediaHiearchyManager.setTransitionToFullShadeAmount(100000f) mediaHiearchyManager.setTransitionToFullShadeAmount(100000f)
@@ -199,48 +204,41 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
// Let's make sure alpha is set // Let's make sure alpha is set
mediaHiearchyManager.setTransitionToFullShadeAmount(2.0f) mediaHiearchyManager.setTransitionToFullShadeAmount(2.0f)
assertThat(mediaFrame.alpha).isNotEqualTo(1.0f) Assert.assertTrue("alpha should not be 1.0f when cross fading", mediaFrame.alpha != 1.0f)
} }
@Test @Test
fun testTransformationOnLockScreenIsFading() { fun testTransformationOnLockScreenIsFading() {
goToLockscreen() // Let's set it onto Lock screen
expandQS() `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
`when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn(
true)
statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD)
clearInvocations(mediaCarouselController)
// Let's transition from lockscreen to qs
mediaHiearchyManager.qsExpansion = 1.0f
val transformType = mediaHiearchyManager.calculateTransformationType() val transformType = mediaHiearchyManager.calculateTransformationType()
assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) Assert.assertTrue("media isn't transforming to qs with a fade",
} transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE)
@Test
fun calculateTransformationType_onLockShade_inSplitShade_goingToFullShade_returnsTransition() {
enableSplitShade()
goToLockscreen()
expandQS()
mediaHiearchyManager.setTransitionToFullShadeAmount(10000f)
val transformType = mediaHiearchyManager.calculateTransformationType()
assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_TRANSITION)
}
@Test
fun calculateTransformationType_onLockShade_inSplitShade_notExpanding_returnsFade() {
enableSplitShade()
goToLockscreen()
goToLockedShade()
expandQS()
mediaHiearchyManager.setTransitionToFullShadeAmount(0f)
val transformType = mediaHiearchyManager.calculateTransformationType()
assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE)
} }
@Test @Test
fun testTransformationOnLockScreenToQQSisFading() { fun testTransformationOnLockScreenToQQSisFading() {
goToLockscreen() // Let's set it onto Lock screen
goToLockedShade() `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
`when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn(
true)
statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD)
clearInvocations(mediaCarouselController)
// Let's transition from lockscreen to qs
`when`(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)
statusBarCallback.value.onStatePreChange(StatusBarState.KEYGUARD,
StatusBarState.SHADE_LOCKED)
val transformType = mediaHiearchyManager.calculateTransformationType() val transformType = mediaHiearchyManager.calculateTransformationType()
assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) Assert.assertTrue("media isn't transforming to qqswith a fade",
transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE)
} }
@Test @Test
@@ -256,32 +254,4 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
verify(mediaCarouselController).closeGuts() verify(mediaCarouselController).closeGuts()
} }
}
private fun enableSplitShade() {
context.getOrCreateTestableResources().addOverride(
R.bool.config_use_split_notification_shade, true
)
configurationController.notifyConfigurationChanged()
}
private fun goToLockscreen() {
whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
whenever(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn(
true
)
statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD)
clearInvocations(mediaCarouselController)
}
private fun goToLockedShade() {
whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)
statusBarCallback.value.onStatePreChange(
StatusBarState.KEYGUARD,
StatusBarState.SHADE_LOCKED
)
}
private fun expandQS() {
mediaHiearchyManager.qsExpansion = 1.0f
}
}

View File

@@ -23,7 +23,7 @@ import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.phone.StatusBar
import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import org.junit.After import org.junit.After
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull import org.junit.Assert.assertNotNull
@@ -66,6 +66,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
@Mock lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock lateinit var wakefulnessLifecycle: WakefulnessLifecycle
@Mock lateinit var mediaHierarchyManager: MediaHierarchyManager @Mock lateinit var mediaHierarchyManager: MediaHierarchyManager
@Mock lateinit var scrimController: ScrimController @Mock lateinit var scrimController: ScrimController
@Mock lateinit var configurationController: ConfigurationController
@Mock lateinit var falsingManager: FalsingManager @Mock lateinit var falsingManager: FalsingManager
@Mock lateinit var notificationPanelController: NotificationPanelViewController @Mock lateinit var notificationPanelController: NotificationPanelViewController
@Mock lateinit var nsslController: NotificationStackScrollLayoutController @Mock lateinit var nsslController: NotificationStackScrollLayoutController
@@ -76,8 +77,6 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
@Mock lateinit var qS: QS @Mock lateinit var qS: QS
@JvmField @Rule val mockito = MockitoJUnit.rule() @JvmField @Rule val mockito = MockitoJUnit.rule()
private val configurationController = FakeConfigurationController()
@Before @Before
fun setup() { fun setup() {
val helper = NotificationTestHelper( val helper = NotificationTestHelper(
@@ -245,27 +244,4 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat())
verify(depthController).transitionToFullShadeProgress = anyFloat() verify(depthController).transitionToFullShadeProgress = anyFloat()
} }
@Test
fun setDragDownAmount_setsValueOnMediaHierarchyManager() {
transitionController.dragDownAmount = 10f
verify(mediaHierarchyManager).setTransitionToFullShadeAmount(10f)
}
@Test
fun setDragDownAmount_inSplitShade_setsValueOnMediaHierarchyManager() {
enableSplitShade()
transitionController.dragDownAmount = 10f
verify(mediaHierarchyManager).setTransitionToFullShadeAmount(10f)
}
private fun enableSplitShade() {
context.getOrCreateTestableResources().addOverride(
R.bool.config_use_split_notification_shade, true
)
configurationController.notifyConfigurationChanged()
}
} }

View File

@@ -1,31 +0,0 @@
package com.android.systemui.statusbar.policy
import android.content.res.Configuration
/** Fake implementation of [ConfigurationController] for tests. */
class FakeConfigurationController : ConfigurationController {
private var listener: ConfigurationController.ConfigurationListener? = null
override fun addCallback(listener: ConfigurationController.ConfigurationListener) {
this.listener = listener
}
override fun removeCallback(listener: ConfigurationController.ConfigurationListener) {
this.listener = null
}
override fun onConfigurationChanged(newConfiguration: Configuration?) {
listener?.onConfigChanged(newConfiguration)
}
override fun notifyThemeChanged() {
listener?.onThemeChanged()
}
fun notifyConfigurationChanged() {
onConfigurationChanged(newConfiguration = null)
}
override fun isLayoutRtl(): Boolean = false
}