Add unocclude animation.

This is a simple downward translate/alpha animation to match
the shade's current unocclude animation. We use this rather
than activity lauch animator since we're not launching from
a view/from the power button, so it's not needed.

Bug: 202963722
Test: unocclude camera
Test: unocclude home controls
Test: unocclude google maps navigation
Change-Id: Id62fcb75d9215d8b12d06fb8c2e7e6e884e457b9
This commit is contained in:
Josh Tsuji
2022-03-25 11:30:28 -04:00
parent 017c695c8c
commit ccf3121eb1

View File

@@ -47,6 +47,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.graphics.Matrix;
import android.hardware.biometrics.BiometricSourceType;
import android.media.AudioAttributes;
import android.media.AudioManager;
@@ -236,6 +237,14 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
*/
private static final int KEYGUARD_DONE_DRAWING_TIMEOUT_MS = 2000;
private static final int UNOCCLUDE_ANIMATION_DURATION = 250;
/**
* How far down to animate the unoccluding activity, in terms of percent of the activity's
* height.
*/
private static final float UNOCCLUDE_TRANSLATE_DISTANCE_PERCENT = 0.1f;
/**
* Boolean option for doKeyguardLocked/doKeyguardTimeout which, when set to true, forces the
* keyguard to show even if it is disabled for the current user.
@@ -883,52 +892,89 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
}
};
/**
* Animation controller for activities that unocclude the keyguard. This will play the launch
* animation in reverse.
*/
private final ActivityLaunchAnimator.Controller mUnoccludeAnimationController =
new ActivityLaunchAnimator.Controller() {
@Override
public void onLaunchAnimationEnd(boolean isExpandingFullyAbove) {
setOccluded(false /* isOccluded */, false /* animate */);
}
@Override
public void onLaunchAnimationCancelled() {
setOccluded(false /* isOccluded */, false /* animate */);
}
@NonNull
@Override
public ViewGroup getLaunchContainer() {
return ((ViewGroup) mKeyguardViewControllerLazy.get()
.getViewRootImpl().getView());
}
@Override
public void setLaunchContainer(@NonNull ViewGroup launchContainer) {
// No-op, launch container is always the shade.
Log.wtf(TAG, "Someone tried to change the launch container for the "
+ "ActivityLaunchAnimator, which should never happen.");
}
@NonNull
@Override
public LaunchAnimator.State createAnimatorState() {
final int width = getLaunchContainer().getWidth();
final int height = getLaunchContainer().getHeight();
// TODO(b/207399883): Unocclude animation. This currently ends instantly.
return new LaunchAnimator.State(
0, height, 0, width, mWindowCornerRadius, mWindowCornerRadius);
}
};
private IRemoteAnimationRunner mOccludeAnimationRunner =
new ActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);
/**
* Animation controller for activities that unocclude the keyguard. This does not use the
* ActivityLaunchAnimator since we're just translating down, rather than emerging from a view
* or the power button.
*/
private IRemoteAnimationRunner mUnoccludeAnimationRunner =
new ActivityLaunchRemoteAnimationRunner(mUnoccludeAnimationController);
new IRemoteAnimationRunner.Stub() {
@Nullable private ValueAnimator mUnoccludeAnimator;
private final Matrix mUnoccludeMatrix = new Matrix();
@Override
public void onAnimationCancelled() {
if (mUnoccludeAnimator != null) {
mUnoccludeAnimator.cancel();
}
}
@Override
public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
final RemoteAnimationTarget primary = apps[0];
if (primary == null) {
finishedCallback.onAnimationFinished();
return;
}
final SyncRtSurfaceTransactionApplier applier =
new SyncRtSurfaceTransactionApplier(
mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
mContext.getMainExecutor().execute(() -> {
if (mUnoccludeAnimator != null) {
mUnoccludeAnimator.cancel();
}
mUnoccludeAnimator = ValueAnimator.ofFloat(1f, 0f);
mUnoccludeAnimator.setDuration(UNOCCLUDE_ANIMATION_DURATION);
mUnoccludeAnimator.setInterpolator(Interpolators.TOUCH_RESPONSE);
mUnoccludeAnimator.addUpdateListener(
animation -> {
final float animatedValue =
(float) animation.getAnimatedValue();
final float surfaceHeight = primary.screenSpaceBounds.height();
mUnoccludeMatrix.setTranslate(
0f,
(1f - animatedValue)
* surfaceHeight
* UNOCCLUDE_TRANSLATE_DISTANCE_PERCENT);
SyncRtSurfaceTransactionApplier.SurfaceParams params =
new SyncRtSurfaceTransactionApplier.SurfaceParams
.Builder(primary.leash)
.withMatrix(mUnoccludeMatrix)
.withCornerRadius(mWindowCornerRadius)
.withAlpha(animatedValue)
.build();
applier.scheduleApply(params);
});
mUnoccludeAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
try {
finishedCallback.onAnimationFinished();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
mUnoccludeAnimator.start();
});
}
};
private DeviceConfigProxy mDeviceConfig;
private DozeParameters mDozeParameters;