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:
@@ -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,6 +160,10 @@ 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;
|
||||||
|
if (mDisappearAnimRunning) {
|
||||||
|
mSecurityViewFlipper.setTranslationY(
|
||||||
|
mInitialBounds.bottom - mFinalBounds.bottom);
|
||||||
|
} else {
|
||||||
for (WindowInsetsAnimation animation : list) {
|
for (WindowInsetsAnimation animation : list) {
|
||||||
if ((animation.getTypeMask() & WindowInsets.Type.ime()) == 0) {
|
if ((animation.getTypeMask() & WindowInsets.Type.ime()) == 0) {
|
||||||
continue;
|
continue;
|
||||||
@@ -158,13 +174,16 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
|
|||||||
translationY += paddingBottom;
|
translationY += paddingBottom;
|
||||||
}
|
}
|
||||||
mSecurityViewFlipper.setTranslationY(translationY);
|
mSecurityViewFlipper.setTranslationY(translationY);
|
||||||
|
}
|
||||||
return windowInsets;
|
return windowInsets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnd(WindowInsetsAnimation animation) {
|
public void onEnd(WindowInsetsAnimation animation) {
|
||||||
|
if (!mDisappearAnimRunning) {
|
||||||
mSecurityViewFlipper.setTranslationY(0);
|
mSecurityViewFlipper.setTranslationY(0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Used to notify the container when something interesting happens.
|
// Used to notify the container when something interesting happens.
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user