Merge "Fix disappear animation" into rvc-dev am: af5f762072

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

Change-Id: I5d4be4d88760cf1a12d52aace580348255fdf01e
This commit is contained in:
TreeHugger Robot
2020-06-15 23:12:20 +00:00
committed by Automerger Merge Worker
2 changed files with 77 additions and 11 deletions

View File

@@ -25,12 +25,16 @@ import static com.android.systemui.DejankUtils.whitelistIpcs;
import static java.lang.Integer.max; import static java.lang.Integer.max;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Insets;
import android.graphics.Rect; import android.graphics.Rect;
import android.metrics.LogMaker; import android.metrics.LogMaker;
import android.os.Handler; import android.os.Handler;
@@ -48,9 +52,13 @@ import android.view.View;
import android.view.ViewConfiguration; import android.view.ViewConfiguration;
import android.view.WindowInsets; import android.view.WindowInsets;
import android.view.WindowInsetsAnimation; import android.view.WindowInsetsAnimation;
import android.view.WindowInsetsAnimationControlListener;
import android.view.WindowInsetsAnimationController;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringAnimation;
@@ -64,6 +72,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SystemUIFactory; import com.android.systemui.SystemUIFactory;
import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.SysUiStatsLog;
@@ -100,6 +109,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
private static final UiEventLogger sUiEventLogger = new UiEventLoggerImpl(); private static final UiEventLogger sUiEventLogger = new UiEventLoggerImpl();
private static final long IME_DISAPPEAR_DURATION_MS = 125;
private KeyguardSecurityModel mSecurityModel; private KeyguardSecurityModel mSecurityModel;
private LockPatternUtils mLockPatternUtils; private LockPatternUtils mLockPatternUtils;
@@ -125,6 +136,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
private int mActivePointerId = -1; private int mActivePointerId = -1;
private boolean mIsDragging; private boolean mIsDragging;
private float mStartTouchY = -1; private float mStartTouchY = -1;
private boolean mDisappearAnimRunning;
private final WindowInsetsAnimation.Callback mWindowInsetsAnimationCallback = private final WindowInsetsAnimation.Callback mWindowInsetsAnimationCallback =
new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) { new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
@@ -148,22 +160,29 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
public WindowInsets onProgress(WindowInsets windowInsets, public WindowInsets onProgress(WindowInsets windowInsets,
List<WindowInsetsAnimation> list) { List<WindowInsetsAnimation> list) {
int translationY = 0; int translationY = 0;
for (WindowInsetsAnimation animation : list) { if (mDisappearAnimRunning) {
if ((animation.getTypeMask() & WindowInsets.Type.ime()) == 0) { mSecurityViewFlipper.setTranslationY(
continue; mInitialBounds.bottom - mFinalBounds.bottom);
} else {
for (WindowInsetsAnimation animation : list) {
if ((animation.getTypeMask() & WindowInsets.Type.ime()) == 0) {
continue;
}
final int paddingBottom = (int) MathUtils.lerp(
mInitialBounds.bottom - mFinalBounds.bottom, 0,
animation.getInterpolatedFraction());
translationY += paddingBottom;
} }
final int paddingBottom = (int) MathUtils.lerp( mSecurityViewFlipper.setTranslationY(translationY);
mInitialBounds.bottom - mFinalBounds.bottom, 0,
animation.getInterpolatedFraction());
translationY += paddingBottom;
} }
mSecurityViewFlipper.setTranslationY(translationY);
return windowInsets; return windowInsets;
} }
@Override @Override
public void onEnd(WindowInsetsAnimation animation) { public void onEnd(WindowInsetsAnimation animation) {
mSecurityViewFlipper.setTranslationY(0); if (!mDisappearAnimRunning) {
mSecurityViewFlipper.setTranslationY(0);
}
} }
}; };
@@ -376,8 +395,51 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
} }
public boolean startDisappearAnimation(Runnable onFinishRunnable) { public boolean startDisappearAnimation(Runnable onFinishRunnable) {
mDisappearAnimRunning = true;
if (mCurrentSecuritySelection == SecurityMode.Password) { if (mCurrentSecuritySelection == SecurityMode.Password) {
mSecurityViewFlipper.getWindowInsetsController().hide(WindowInsets.Type.ime()); mSecurityViewFlipper.getWindowInsetsController().controlWindowInsetsAnimation(ime(),
IME_DISAPPEAR_DURATION_MS,
Interpolators.LINEAR, null, new WindowInsetsAnimationControlListener() {
@Override
public void onReady(@NonNull WindowInsetsAnimationController controller,
int types) {
ValueAnimator anim = ValueAnimator.ofFloat(1f, 0f);
anim.addUpdateListener(animation -> {
if (controller.isCancelled()) {
return;
}
Insets shownInsets = controller.getShownStateInsets();
Insets insets = Insets.add(shownInsets, Insets.of(0, 0, 0,
(int) (-shownInsets.bottom / 4
* anim.getAnimatedFraction())));
controller.setInsetsAndAlpha(insets,
(float) animation.getAnimatedValue(),
anim.getAnimatedFraction());
});
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
controller.finish(false);
}
});
anim.setDuration(IME_DISAPPEAR_DURATION_MS);
anim.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
anim.start();
}
@Override
public void onFinished(
@NonNull WindowInsetsAnimationController controller) {
mDisappearAnimRunning = false;
}
@Override
public void onCancelled(
@Nullable WindowInsetsAnimationController controller) {
}
});
} }
if (mCurrentSecuritySelection != SecurityMode.None) { if (mCurrentSecuritySelection != SecurityMode.None) {
return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation( return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation(
@@ -887,6 +949,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
@Override @Override
public void reset() { public void reset() {
mSecurityViewFlipper.reset(); mSecurityViewFlipper.reset();
mDisappearAnimRunning = false;
} }
@Override @Override

View File

@@ -18,7 +18,9 @@ package com.android.keyguard;
import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.ime;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -110,6 +112,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
mKeyguardSecurityContainer.startDisappearAnimation(null); mKeyguardSecurityContainer.startDisappearAnimation(null);
verify(mSecurityView).startDisappearAnimation(eq(null)); verify(mSecurityView).startDisappearAnimation(eq(null));
verify(mWindowInsetsController).hide(eq(ime())); verify(mWindowInsetsController).controlWindowInsetsAnimation(eq(ime()), anyLong(), any(),
any(), any());
} }
} }