diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimation.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimation.java index 3ea8140427cbb..3bf75d105b9fb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimation.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimation.java @@ -19,8 +19,10 @@ package com.android.systemui.biometrics; import android.content.Context; import android.graphics.RectF; import android.graphics.drawable.Drawable; +import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.systemui.R; @@ -33,6 +35,7 @@ public abstract class UdfpsAnimation extends Drawable { @NonNull protected final Context mContext; @NonNull protected final Drawable mFingerprintDrawable; + @Nullable private View mView; public UdfpsAnimation(@NonNull Context context) { mContext = context; @@ -53,6 +56,10 @@ public abstract class UdfpsAnimation extends Drawable { mFingerprintDrawable.setAlpha(alpha); } + public void setAnimationView(UdfpsAnimationView view) { + mView = view; + } + /** * @return The amount of padding that's needed on each side of the sensor, in pixels. */ @@ -66,4 +73,10 @@ public abstract class UdfpsAnimation extends Drawable { public int getPaddingY() { return 0; } + + protected void postInvalidateView() { + if (mView != null) { + mView.postInvalidate(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationKeyguard.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationKeyguard.java index 501de9df575bf..8664e44c9ad21 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationKeyguard.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationKeyguard.java @@ -23,7 +23,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.util.MathUtils; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -42,7 +41,6 @@ public class UdfpsAnimationKeyguard extends UdfpsAnimation implements DozeReceiv private static final String TAG = "UdfpsAnimationKeyguard"; - @NonNull private final View mParent; @NonNull private final Context mContext; private final int mMaxBurnInOffsetX; private final int mMaxBurnInOffsetY; @@ -52,10 +50,9 @@ public class UdfpsAnimationKeyguard extends UdfpsAnimation implements DozeReceiv private float mBurnInOffsetX; private float mBurnInOffsetY; - UdfpsAnimationKeyguard(@NonNull View parent, @NonNull Context context, + UdfpsAnimationKeyguard(@NonNull Context context, @NonNull StatusBarStateController statusBarStateController) { super(context); - mParent = parent; mContext = context; mMaxBurnInOffsetX = context.getResources() @@ -73,10 +70,10 @@ public class UdfpsAnimationKeyguard extends UdfpsAnimation implements DozeReceiv mInterpolatedDarkAmount); mBurnInOffsetY = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */) - - 0.5f * mMaxBurnInOffsetY, + - mMaxBurnInOffsetY, mInterpolatedDarkAmount); updateColor(); - mParent.postInvalidate(); + postInvalidateView(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java index 41ea4d66f5750..44122cba87162 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java @@ -74,7 +74,14 @@ public class UdfpsAnimationView extends View implements DozeReceiver, } void setAnimation(@Nullable UdfpsAnimation animation) { + if (mUdfpsAnimation != null) { + mUdfpsAnimation.setAnimationView(null); + } + mUdfpsAnimation = animation; + if (mUdfpsAnimation != null) { + mUdfpsAnimation.setAnimationView(this); + } } void onSensorRectUpdated(@NonNull RectF sensorRect) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index e7b08e72877da..6451ad9fd5d2f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -44,7 +44,6 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.DozeReceiver; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.util.concurrency.DelayableExecutor; @@ -324,7 +323,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { case IUdfpsOverlayController.REASON_ENROLL_ENROLLING: return new UdfpsAnimationEnroll(mContext); case IUdfpsOverlayController.REASON_AUTH_FPM_KEYGUARD: - return new UdfpsAnimationKeyguard(mView, mContext, mStatusBarStateController); + return new UdfpsAnimationKeyguard(mContext, mStatusBarStateController); case IUdfpsOverlayController.REASON_AUTH_FPM_OTHER: return new UdfpsAnimationFpmOther(mContext); default: diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java index 00cb28b8b8fbb..6ffecdba883bf 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java @@ -113,6 +113,7 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin void setExtras(@Nullable UdfpsAnimation animation, @Nullable UdfpsEnrollHelper enrollHelper) { mAnimationView.setAnimation(animation); + mEnrollHelper = enrollHelper; if (enrollHelper != null) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index 8ab135ced97ed..4418696bfc9b9 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -32,6 +32,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.dagger.DozeScope; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.AlarmTimeout; @@ -41,12 +42,15 @@ import java.util.Calendar; import javax.inject.Inject; +import dagger.Lazy; + /** * The policy controlling doze. */ @DozeScope public class DozeUi implements DozeMachine.Part, TunerService.Tunable { - + // if enabled, calls dozeTimeTick() whenever the time changes: + private static final boolean BURN_IN_TESTING_ENABLED = false; private static final long TIME_TICK_DEADLINE_MILLIS = 90 * 1000; // 1.5min private final Context mContext; private final DozeHost mHost; @@ -57,16 +61,28 @@ public class DozeUi implements DozeMachine.Part, TunerService.Tunable { private final boolean mCanAnimateTransition; private final DozeParameters mDozeParameters; private final DozeLog mDozeLog; + private final Lazy mStatusBarStateController; private boolean mKeyguardShowing; private final KeyguardUpdateMonitorCallback mKeyguardVisibilityCallback = new KeyguardUpdateMonitorCallback() { - @Override public void onKeyguardVisibilityChanged(boolean showing) { mKeyguardShowing = showing; updateAnimateScreenOff(); } + + @Override + public void onTimeChanged() { + if (BURN_IN_TESTING_ENABLED && mStatusBarStateController != null + && mStatusBarStateController.get().isDozing()) { + // update whenever the time changes for manual burn in testing + mHost.dozeTimeTick(); + + // Keep wakelock until a frame has been pushed. + mHandler.post(mWakeLock.wrap(() -> {})); + } + } }; private long mLastTimeTickElapsed = 0; @@ -75,7 +91,8 @@ public class DozeUi implements DozeMachine.Part, TunerService.Tunable { public DozeUi(Context context, AlarmManager alarmManager, WakeLock wakeLock, DozeHost host, @Main Handler handler, DozeParameters params, KeyguardUpdateMonitor keyguardUpdateMonitor, - DozeLog dozeLog, TunerService tunerService) { + DozeLog dozeLog, TunerService tunerService, + Lazy statusBarStateController) { mContext = context; mWakeLock = wakeLock; mHost = host; @@ -85,8 +102,8 @@ public class DozeUi implements DozeMachine.Part, TunerService.Tunable { mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler); keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback); mDozeLog = dozeLog; - tunerService.addTunable(this, Settings.Secure.DOZE_ALWAYS_ON); + mStatusBarStateController = statusBarStateController; } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java index d60772730dff0..afe5c0b2edbd7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java @@ -41,6 +41,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.wakelock.WakeLockFake; @@ -74,6 +75,8 @@ public class DozeUiTest extends SysuiTestCase { private Handler mHandler; private HandlerThread mHandlerThread; private DozeUi mDozeUi; + @Mock + private StatusBarStateController mStatusBarStateController; @Before public void setUp() throws Exception { @@ -85,7 +88,8 @@ public class DozeUiTest extends SysuiTestCase { mHandler = mHandlerThread.getThreadHandler(); mDozeUi = new DozeUi(mContext, mAlarmManager, mWakeLock, mHost, mHandler, - mDozeParameters, mKeyguardUpdateMonitor, mDozeLog, mTunerService); + mDozeParameters, mKeyguardUpdateMonitor, mDozeLog, mTunerService, + () -> mStatusBarStateController); mDozeUi.setDozeMachine(mMachine); } @@ -141,7 +145,8 @@ public class DozeUiTest extends SysuiTestCase { reset(mHost); when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true); mDozeUi = new DozeUi(mContext, mAlarmManager, mWakeLock, mHost, mHandler, - mDozeParameters, mKeyguardUpdateMonitor, mDozeLog, mTunerService); + mDozeParameters, mKeyguardUpdateMonitor, mDozeLog, mTunerService, + () -> mStatusBarStateController); mDozeUi.setDozeMachine(mMachine); // Never animate if display doesn't support it.