Merge "Add support for seamless transion from/to AoD"

This commit is contained in:
Lucas Dupin
2017-12-12 06:36:30 +00:00
committed by Android (Google) Code Review
10 changed files with 100 additions and 19 deletions

View File

@@ -63,7 +63,7 @@ public class DozeFactory {
new DozeFalsingManagerAdapter(FalsingManager.getInstance(context)),
createDozeTriggers(context, sensorManager, host, alarmManager, config, params,
handler, wakeLock, machine),
createDozeUi(context, host, wakeLock, machine, handler, alarmManager),
createDozeUi(context, host, wakeLock, machine, handler, alarmManager, params),
new DozeScreenState(wrappedService, handler),
createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
});
@@ -89,8 +89,9 @@ public class DozeFactory {
}
private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
DozeMachine machine, Handler handler, AlarmManager alarmManager) {
return new DozeUi(context, alarmManager, machine, wakeLock, host, handler);
DozeMachine machine, Handler handler, AlarmManager alarmManager,
DozeParameters params) {
return new DozeUi(context, alarmManager, machine, wakeLock, host, handler, params);
}
public static DozeHost getHost(DozeService service) {

View File

@@ -38,6 +38,7 @@ public interface DozeHost {
void extendPulse();
void setAnimateWakeup(boolean animateWakeup);
void setAnimateScreenOff(boolean animateScreenOff);
void onDoubleTap(float x, float y);

View File

@@ -23,6 +23,7 @@ import android.os.SystemClock;
import android.text.format.Formatter;
import android.util.Log;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.WakeLock;
@@ -41,18 +42,22 @@ public class DozeUi implements DozeMachine.Part {
private final WakeLock mWakeLock;
private final DozeMachine mMachine;
private final AlarmTimeout mTimeTicker;
private final boolean mCanAnimateWakeup;
private long mLastTimeTickElapsed = 0;
public DozeUi(Context context, AlarmManager alarmManager, DozeMachine machine,
WakeLock wakeLock, DozeHost host, Handler handler) {
WakeLock wakeLock, DozeHost host, Handler handler,
DozeParameters params) {
mContext = context;
mMachine = machine;
mWakeLock = wakeLock;
mHost = host;
mHandler = handler;
mCanAnimateWakeup = !params.getDisplayNeedsBlanking();
mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
mHost.setAnimateScreenOff(params.getCanControlScreenOffAnimation());
}
private void pulseWhileDozing(int reason) {
@@ -106,7 +111,7 @@ public class DozeUi implements DozeMachine.Part {
// Keep current state.
break;
default:
mHost.setAnimateWakeup(false);
mHost.setAnimateWakeup(mCanAnimateWakeup);
break;
}
}

View File

@@ -119,6 +119,28 @@ public class DozeParameters {
return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
}
/**
* Some screens need to be completely black before changing the display power mode,
* unexpected behavior might happen if this parameter isn't respected.
*
* @return true if screen needs to be completely black before a power transition.
*/
public boolean getDisplayNeedsBlanking() {
return mContext.getResources().getBoolean(
com.android.internal.R.bool.config_displayBlanksAfterDoze);
}
/**
* Whether we can implement our own screen off animation or if we need
* to rely on DisplayPowerManager to dim the display.
*
* @return true if SystemUI can control the screen off animation.
*/
public boolean getCanControlScreenOffAnimation() {
return !mContext.getResources().getBoolean(
com.android.internal.R.bool.config_dozeAfterScreenOff);
}
private boolean getBoolean(String propName, int resId) {
return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
}

View File

@@ -20,6 +20,7 @@ import android.graphics.Color;
import android.os.Trace;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.stack.StackStateAnimator;
/**
* Possible states of the ScrimController state machine.
@@ -38,12 +39,18 @@ public enum ScrimState {
@Override
public void prepare(ScrimState previousState) {
// DisplayPowerManager will blank the screen, we'll just
// set our scrim to black in this frame to avoid flickering and
// fade it out afterwards.
mBlankScreen = previousState == ScrimState.AOD;
mBlankScreen = false;
if (previousState == ScrimState.AOD) {
updateScrimColor(mScrimInFront, 1, Color.BLACK);
mAnimationDuration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
if (mDisplayRequiresBlanking) {
// DisplayPowerManager will blank the screen, we'll just
// set our scrim to black in this frame to avoid flickering and
// fade it out afterwards.
mBlankScreen = true;
updateScrimColor(mScrimInFront, 1, Color.BLACK);
}
} else {
mAnimationDuration = ScrimController.ANIMATION_DURATION;
}
mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
mCurrentInFrontAlpha = 0;
@@ -78,7 +85,7 @@ public enum ScrimState {
AOD {
@Override
public void prepare(ScrimState previousState) {
if (previousState == ScrimState.PULSING) {
if (previousState == ScrimState.PULSING && !mCanControlScreenOff) {
updateScrimColor(mScrimInFront, 1, Color.BLACK);
}
final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
@@ -89,7 +96,7 @@ public enum ScrimState {
mCurrentBehindTint = Color.BLACK;
// DisplayPowerManager will blank the screen for us, we just need
// to set our state.
mAnimateChange = false;
mAnimateChange = mCanControlScreenOff;
}
},
@@ -103,8 +110,10 @@ public enum ScrimState {
mCurrentInFrontAlpha = 0;
mCurrentInFrontTint = Color.BLACK;
mCurrentBehindTint = Color.BLACK;
mBlankScreen = true;
updateScrimColor(mScrimInFront, 1, Color.BLACK);
mBlankScreen = mDisplayRequiresBlanking;
if (mDisplayRequiresBlanking) {
updateScrimColor(mScrimInFront, 1, Color.BLACK);
}
}
},
@@ -147,11 +156,15 @@ public enum ScrimState {
ScrimView mScrimInFront;
ScrimView mScrimBehind;
DozeParameters mDozeParameters;
boolean mDisplayRequiresBlanking;
boolean mCanControlScreenOff;
public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) {
mScrimInFront = scrimInFront;
mScrimBehind = scrimBehind;
mDozeParameters = dozeParameters;
mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
mCanControlScreenOff = dozeParameters.getCanControlScreenOffAnimation();
}
public void prepare(ScrimState previousState) {

View File

@@ -4409,7 +4409,8 @@ public class StatusBar extends SystemUI implements DemoMode,
private void updateDozingState() {
Trace.traceCounter(Trace.TRACE_TAG_APP, "dozing", mDozing ? 1 : 0);
Trace.beginSection("StatusBar#updateDozingState");
boolean animate = !mDozing && mDozeServiceHost.shouldAnimateWakeup();
boolean animate = (!mDozing && mDozeServiceHost.shouldAnimateWakeup())
|| (mDozing && mDozeServiceHost.shouldAnimateScreenOff());
mNotificationPanel.setDozing(mDozing, animate);
mStackScroller.setDark(mDozing, animate, mWakeUpTouchLocation);
mDozeScrimController.setDozing(mDozing);
@@ -5177,6 +5178,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private final class DozeServiceHost implements DozeHost {
private final ArrayList<Callback> mCallbacks = new ArrayList<>();
private boolean mAnimateWakeup;
private boolean mAnimateScreenOff;
private boolean mIgnoreTouchWhilePulsing;
@Override
@@ -5323,6 +5325,11 @@ public class StatusBar extends SystemUI implements DemoMode,
mAnimateWakeup = animateWakeup;
}
@Override
public void setAnimateScreenOff(boolean animateScreenOff) {
mAnimateScreenOff = animateScreenOff;
}
@Override
public void onDoubleTap(float screenX, float screenY) {
if (screenX > 0 && screenY > 0 && mAmbientIndicationContainer != null
@@ -5367,6 +5374,10 @@ public class StatusBar extends SystemUI implements DemoMode,
private boolean shouldAnimateWakeup() {
return mAnimateWakeup;
}
public boolean shouldAnimateScreenOff() {
return mAnimateScreenOff;
}
}
public boolean shouldIgnoreTouch() {

View File

@@ -40,7 +40,7 @@ import java.util.Stack;
public class StackStateAnimator {
public static final int ANIMATION_DURATION_STANDARD = 360;
public static final int ANIMATION_DURATION_WAKEUP = 200;
public static final int ANIMATION_DURATION_WAKEUP = 500;
public static final int ANIMATION_DURATION_GO_TO_FULL_SHADE = 448;
public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464;
public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220;

View File

@@ -28,6 +28,7 @@ class DozeHostFake implements DozeHost {
Callback callback;
boolean pulseExtended;
boolean animateWakeup;
boolean animateScreenOff;
boolean dozing;
float doubleTapX;
float doubleTapY;
@@ -102,6 +103,11 @@ class DozeHostFake implements DozeHost {
this.animateWakeup = animateWakeup;
}
@Override
public void setAnimateScreenOff(boolean animateScreenOff) {
this.animateScreenOff = animateScreenOff;
}
@Override
public void onDoubleTap(float x, float y) {
doubleTapX = y;

View File

@@ -16,6 +16,7 @@
package com.android.systemui.doze;
import static com.android.systemui.doze.DozeMachine.State.DOZE;
import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD;
import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED;
import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
@@ -28,19 +29,20 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -66,8 +68,11 @@ public class DozeUiTest extends SysuiTestCase {
mWakeLock = new WakeLockFake();
mHost = new DozeHostFake();
mHandler = mHandlerThread.getThreadHandler();
DozeParameters params = mock(DozeParameters.class);
when(params.getCanControlScreenOffAnimation()).thenReturn(true);
when(params.getDisplayNeedsBlanking()).thenReturn(false);
mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler);
mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler, params);
}
@After
@@ -89,4 +94,20 @@ public class DozeUiTest extends SysuiTestCase {
verify(mAlarmManager).setExact(anyInt(), anyLong(), eq("doze_time_tick"), any(), any());
}
@Test
public void propagatesAnimateScreenOff() {
Assert.assertTrue("animateScreenOff should be true", mHost.animateScreenOff);
DozeParameters params = mock(DozeParameters.class);
new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler, params);
Assert.assertFalse("animateScreenOff should be false", mHost.animateScreenOff);
}
@Test
public void transitionSetsAnimateWakeup() {
mHost.animateWakeup = false;
mDozeUi.transitionTo(UNINITIALIZED, DOZE);
Assert.assertTrue("animateScreenOff should be true", mHost.animateWakeup);
}
}

View File

@@ -70,6 +70,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimVisibilityCallback = (Boolean visible) -> mScrimVisibile = visible;
mDozeParamenters = mock(DozeParameters.class);
when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
mScrimController = new SynchronousScrimController(mLightBarController, mScrimBehind,
mScrimInFront, mHeadsUpScrim, mScrimVisibilityCallback, mDozeParamenters);
}