Merge "Revert "Revert "Fix shouldControlUnlockedScreenOff.""" into tm-dev am: b39e1f1a67 am: dd0f6b86bc

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17571000

Change-Id: I1d5aa3a26285b099ddde3921e47260ca26c10220
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Josh Tsuji
2022-04-11 22:17:18 +00:00
committed by Automerger Merge Worker
4 changed files with 61 additions and 17 deletions

View File

@@ -31,6 +31,8 @@ import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.util.MathUtils; import android.util.MathUtils;
import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -291,6 +293,11 @@ public class DozeParameters implements
} }
public void updateControlScreenOff() { public void updateControlScreenOff() {
Log.i("TEST", "Display needs blanking?" + getDisplayNeedsBlanking());
Log.i("TEST", "Should control screen off?" + shouldControlUnlockedScreenOff());
Log.i("TEST", "alwaysOn?" + getAlwaysOn());
Log.i("TEST", "keyguard showing?" + mKeyguardShowing);
Log.i("TEST", "Flag enabled? " + mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ANIMATIONS));
if (!getDisplayNeedsBlanking()) { if (!getDisplayNeedsBlanking()) {
final boolean controlScreenOff = final boolean controlScreenOff =
getAlwaysOn() && (mKeyguardShowing || shouldControlUnlockedScreenOff()); getAlwaysOn() && (mKeyguardShowing || shouldControlUnlockedScreenOff());
@@ -298,6 +305,17 @@ public class DozeParameters implements
} }
} }
/**
* Whether we're capable of controlling the screen off animation if we want to. This isn't
* possible if AOD isn't even enabled or if the flag is disabled, or if the display needs
* blanking.
*/
public boolean canControlUnlockedScreenOff() {
return getAlwaysOn()
&& mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ANIMATIONS)
&& !getDisplayNeedsBlanking();
}
/** /**
* Whether we want to control the screen off animation when the device is unlocked. If we do, * Whether we want to control the screen off animation when the device is unlocked. If we do,
* we'll animate in AOD before turning off the screen, rather than simply fading to black and * we'll animate in AOD before turning off the screen, rather than simply fading to black and
@@ -308,8 +326,7 @@ public class DozeParameters implements
* disabled for a11y. * disabled for a11y.
*/ */
public boolean shouldControlUnlockedScreenOff() { public boolean shouldControlUnlockedScreenOff() {
return canControlUnlockedScreenOff() return mUnlockedScreenOffAnimationController.shouldPlayUnlockedScreenOffAnimation();
&& mUnlockedScreenOffAnimationController.shouldPlayUnlockedScreenOffAnimation();
} }
public boolean shouldDelayKeyguardShow() { public boolean shouldDelayKeyguardShow() {
@@ -341,16 +358,6 @@ public class DozeParameters implements
return getAlwaysOn() && mKeyguardShowing; return getAlwaysOn() && mKeyguardShowing;
} }
/**
* Whether we're capable of controlling the screen off animation if we want to. This isn't
* possible if AOD isn't even enabled or if the flag is disabled.
*/
public boolean canControlUnlockedScreenOff() {
return getAlwaysOn()
&& mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ANIMATIONS)
&& !getDisplayNeedsBlanking();
}
private boolean getBoolean(String propName, int resId) { private boolean getBoolean(String propName, int resId) {
return SystemProperties.getBoolean(propName, mResources.getBoolean(resId)); return SystemProperties.getBoolean(propName, mResources.getBoolean(resId));
} }

View File

@@ -59,8 +59,14 @@ class UnlockedScreenOffAnimationController @Inject constructor(
private val powerManager: PowerManager, private val powerManager: PowerManager,
private val handler: Handler = Handler() private val handler: Handler = Handler()
) : WakefulnessLifecycle.Observer, ScreenOffAnimation { ) : WakefulnessLifecycle.Observer, ScreenOffAnimation {
private lateinit var mCentralSurfaces: CentralSurfaces private lateinit var mCentralSurfaces: CentralSurfaces
/**
* Whether or not [initialize] has been called to provide us with the StatusBar,
* NotificationPanelViewController, and LightRevealSrim so that we can run the unlocked screen
* off animation.
*/
private var initialized = false
private lateinit var lightRevealScrim: LightRevealScrim private lateinit var lightRevealScrim: LightRevealScrim
private var animatorDurationScale = 1f private var animatorDurationScale = 1f
@@ -116,6 +122,7 @@ class UnlockedScreenOffAnimationController @Inject constructor(
centralSurfaces: CentralSurfaces, centralSurfaces: CentralSurfaces,
lightRevealScrim: LightRevealScrim lightRevealScrim: LightRevealScrim
) { ) {
this.initialized = true
this.lightRevealScrim = lightRevealScrim this.lightRevealScrim = lightRevealScrim
this.mCentralSurfaces = centralSurfaces this.mCentralSurfaces = centralSurfaces
@@ -262,6 +269,18 @@ class UnlockedScreenOffAnimationController @Inject constructor(
* on the current state of the device. * on the current state of the device.
*/ */
fun shouldPlayUnlockedScreenOffAnimation(): Boolean { fun shouldPlayUnlockedScreenOffAnimation(): Boolean {
// If we haven't been initialized yet, we don't have a StatusBar/LightRevealScrim yet, so we
// can't perform the animation.
if (!initialized) {
return false
}
// If the device isn't in a state where we can control unlocked screen off (no AOD enabled,
// power save, etc.) then we shouldn't try to do so.
if (!dozeParameters.get().canControlUnlockedScreenOff()) {
return false
}
// If we explicitly already decided not to play the screen off animation, then never change // If we explicitly already decided not to play the screen off animation, then never change
// our mind. // our mind.
if (decidedToAnimateGoingToSleep == false) { if (decidedToAnimateGoingToSleep == false) {
@@ -304,7 +323,7 @@ class UnlockedScreenOffAnimationController @Inject constructor(
} }
override fun shouldDelayDisplayDozeTransition(): Boolean = override fun shouldDelayDisplayDozeTransition(): Boolean =
dozeParameters.get().shouldControlUnlockedScreenOff() shouldPlayUnlockedScreenOffAnimation()
/** /**
* Whether we're doing the light reveal animation or we're done with that and animating in the * Whether we're doing the light reveal animation or we're done with that and animating in the

View File

@@ -126,6 +126,12 @@ public class DozeParametersTest extends SysuiTestCase {
setAodEnabledForTest(true); setAodEnabledForTest(true);
setShouldControlUnlockedScreenOffForTest(true); setShouldControlUnlockedScreenOffForTest(true);
setDisplayNeedsBlankingForTest(false); setDisplayNeedsBlankingForTest(false);
// Default to false here (with one test to make sure that when it returns true, we respect
// that). We'll test the specific conditions for this to return true/false in the
// UnlockedScreenOffAnimationController's tests.
when(mUnlockedScreenOffAnimationController.shouldPlayUnlockedScreenOffAnimation())
.thenReturn(false);
} }
@Test @Test
@@ -174,9 +180,12 @@ public class DozeParametersTest extends SysuiTestCase {
*/ */
@Test @Test
public void testControlUnlockedScreenOffAnimation_dozeAfterScreenOff_false() { public void testControlUnlockedScreenOffAnimation_dozeAfterScreenOff_false() {
mDozeParameters.mKeyguardVisibilityCallback.onKeyguardVisibilityChanged(true);
// If AOD is disabled, we shouldn't want to control screen off. Also, let's double check // If AOD is disabled, we shouldn't want to control screen off. Also, let's double check
// that when that value is updated, we called through to PowerManager. // that when that value is updated, we called through to PowerManager.
setAodEnabledForTest(false); setAodEnabledForTest(false);
assertFalse(mDozeParameters.shouldControlScreenOff()); assertFalse(mDozeParameters.shouldControlScreenOff());
assertTrue(mPowerManagerDozeAfterScreenOff); assertTrue(mPowerManagerDozeAfterScreenOff);
@@ -188,7 +197,6 @@ public class DozeParametersTest extends SysuiTestCase {
@Test @Test
public void testControlUnlockedScreenOffAnimationDisabled_dozeAfterScreenOff() { public void testControlUnlockedScreenOffAnimationDisabled_dozeAfterScreenOff() {
setShouldControlUnlockedScreenOffForTest(true);
when(mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ANIMATIONS)).thenReturn(false); when(mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ANIMATIONS)).thenReturn(false);
assertFalse(mDozeParameters.shouldControlUnlockedScreenOff()); assertFalse(mDozeParameters.shouldControlUnlockedScreenOff());

View File

@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.StatusBarStateControllerImpl import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.GlobalSettings
import junit.framework.Assert.assertFalse
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@@ -133,7 +134,7 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() {
*/ */
@Test @Test
fun testAodUiShownIfNotInteractive() { fun testAodUiShownIfNotInteractive() {
`when`(dozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true) `when`(dozeParameters.canControlUnlockedScreenOff()).thenReturn(true)
`when`(powerManager.isInteractive).thenReturn(false) `when`(powerManager.isInteractive).thenReturn(false)
val callbackCaptor = ArgumentCaptor.forClass(Runnable::class.java) val callbackCaptor = ArgumentCaptor.forClass(Runnable::class.java)
@@ -156,7 +157,7 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() {
*/ */
@Test @Test
fun testAodUiNotShownIfInteractive() { fun testAodUiNotShownIfInteractive() {
`when`(dozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true) `when`(dozeParameters.canControlUnlockedScreenOff()).thenReturn(true)
`when`(powerManager.isInteractive).thenReturn(true) `when`(powerManager.isInteractive).thenReturn(true)
val callbackCaptor = ArgumentCaptor.forClass(Runnable::class.java) val callbackCaptor = ArgumentCaptor.forClass(Runnable::class.java)
@@ -167,4 +168,13 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() {
verify(notificationPanelViewController, never()).showAodUi() verify(notificationPanelViewController, never()).showAodUi()
} }
@Test
fun testNoAnimationPlaying_dozeParamsCanNotControlScreenOff() {
`when`(dozeParameters.canControlUnlockedScreenOff()).thenReturn(false)
assertFalse(controller.shouldPlayUnlockedScreenOffAnimation())
controller.startAnimation()
assertFalse(controller.isAnimationPlaying())
}
} }