diff --git a/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml b/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
index 3a7a8ae5bc3c4..7455ad2ac5f82 100644
--- a/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
+++ b/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
@@ -16,14 +16,7 @@
* limitations under the License.
*/
-->
-
- -
-
-
-
-
-
-
-
+
+
+
+
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
index e6298a426c5be..00470c0efe35f 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
@@ -16,17 +16,18 @@
package com.android.keyguard;
import android.animation.AnimatorSet;
+import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
+import android.annotation.Nullable;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.RippleDrawable;
import android.view.ContextThemeWrapper;
+import android.widget.TextView;
import androidx.annotation.StyleRes;
-import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.util.Utils;
@@ -34,45 +35,100 @@ import com.android.systemui.util.Utils;
* Provides background color and radius animations for key pad buttons.
*/
class NumPadAnimator {
- private AnimatorSet mAnimator;
private ValueAnimator mExpandAnimator;
+ private AnimatorSet mExpandAnimatorSet;
private ValueAnimator mContractAnimator;
+ private AnimatorSet mContractAnimatorSet;
private GradientDrawable mBackground;
- private RippleDrawable mRipple;
private int mNormalColor;
private int mHighlightColor;
private int mStyle;
+ private static final int EXPAND_ANIMATION_MS = 100;
+ private static final int EXPAND_COLOR_ANIMATION_MS = 50;
+ private static final int CONTRACT_ANIMATION_DELAY_MS = 33;
+ private static final int CONTRACT_ANIMATION_MS = 417;
- NumPadAnimator(Context context, final RippleDrawable drawable, @StyleRes int style) {
+ NumPadAnimator(Context context, final Drawable drawable, @StyleRes int style) {
+ this(context, drawable, style, null);
+ }
+
+ NumPadAnimator(Context context, final Drawable drawable, @StyleRes int style,
+ @Nullable TextView digitTextView) {
mStyle = style;
- mRipple = (RippleDrawable) drawable.mutate();
- mBackground = (GradientDrawable) mRipple.findDrawableByLayerId(R.id.background);
+ mBackground = (GradientDrawable) drawable;
reloadColors(context);
+ int textColorPrimary = com.android.settingslib.Utils
+ .getColorAttrDefaultColor(context, android.R.attr.textColorPrimary);
+ int textColorPrimaryInverse = com.android.settingslib.Utils
+ .getColorAttrDefaultColor(context, android.R.attr.textColorPrimaryInverse);
// Actual values will be updated later, usually during an onLayout() call
- mAnimator = new AnimatorSet();
mExpandAnimator = ValueAnimator.ofFloat(0f, 1f);
- mExpandAnimator.setDuration(50);
+ mExpandAnimator.setDuration(EXPAND_ANIMATION_MS);
mExpandAnimator.setInterpolator(Interpolators.LINEAR);
- mExpandAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- public void onAnimationUpdate(ValueAnimator anim) {
- mBackground.setCornerRadius((float) anim.getAnimatedValue());
- mRipple.invalidateSelf();
- }
+ mExpandAnimator.addUpdateListener(
+ anim -> mBackground.setCornerRadius((float) anim.getAnimatedValue()));
+
+ ValueAnimator expandBackgroundColorAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
+ mNormalColor, mHighlightColor);
+ expandBackgroundColorAnimator.setDuration(EXPAND_COLOR_ANIMATION_MS);
+ expandBackgroundColorAnimator.addUpdateListener(
+ animator -> mBackground.setColor((int) animator.getAnimatedValue()));
+
+ ValueAnimator expandTextColorAnimator =
+ ValueAnimator.ofObject(new ArgbEvaluator(),
+ textColorPrimary, textColorPrimaryInverse);
+ expandTextColorAnimator.setDuration(EXPAND_COLOR_ANIMATION_MS);
+ expandTextColorAnimator.addUpdateListener(valueAnimator -> {
+ if (digitTextView != null) {
+ digitTextView.setTextColor((int) valueAnimator.getAnimatedValue());
+ }
});
+ mExpandAnimatorSet = new AnimatorSet();
+ mExpandAnimatorSet.playTogether(mExpandAnimator,
+ expandBackgroundColorAnimator, expandTextColorAnimator);
+
mContractAnimator = ValueAnimator.ofFloat(1f, 0f);
- mContractAnimator.setStartDelay(33);
- mContractAnimator.setDuration(417);
+ mContractAnimator.setStartDelay(CONTRACT_ANIMATION_DELAY_MS);
+ mContractAnimator.setDuration(CONTRACT_ANIMATION_MS);
mContractAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mContractAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- public void onAnimationUpdate(ValueAnimator anim) {
- mBackground.setCornerRadius((float) anim.getAnimatedValue());
- mRipple.invalidateSelf();
- }
+ mContractAnimator.addUpdateListener(
+ anim -> mBackground.setCornerRadius((float) anim.getAnimatedValue()));
+ ValueAnimator contractBackgroundColorAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
+ mHighlightColor, mNormalColor);
+ contractBackgroundColorAnimator.setStartDelay(CONTRACT_ANIMATION_DELAY_MS);
+ contractBackgroundColorAnimator.setDuration(CONTRACT_ANIMATION_MS);
+ contractBackgroundColorAnimator.addUpdateListener(
+ animator -> mBackground.setColor((int) animator.getAnimatedValue()));
+
+ ValueAnimator contractTextColorAnimator =
+ ValueAnimator.ofObject(new ArgbEvaluator(), textColorPrimaryInverse,
+ textColorPrimary);
+ contractTextColorAnimator.setStartDelay(CONTRACT_ANIMATION_DELAY_MS);
+ contractTextColorAnimator.setDuration(CONTRACT_ANIMATION_MS);
+ contractTextColorAnimator.addUpdateListener(valueAnimator -> {
+ if (digitTextView != null) {
+ digitTextView.setTextColor((int) valueAnimator.getAnimatedValue());
+ }
});
- mAnimator.playSequentially(mExpandAnimator, mContractAnimator);
+
+ mContractAnimatorSet = new AnimatorSet();
+ mContractAnimatorSet.playTogether(mContractAnimator,
+ contractBackgroundColorAnimator, contractTextColorAnimator);
+ }
+
+ public void expand() {
+ mExpandAnimatorSet.cancel();
+ mContractAnimatorSet.cancel();
+ mExpandAnimatorSet.start();
+ }
+
+ public void contract() {
+ mExpandAnimatorSet.cancel();
+ mContractAnimatorSet.cancel();
+ mContractAnimatorSet.start();
}
void onLayout(int height) {
@@ -83,11 +139,6 @@ class NumPadAnimator {
mContractAnimator.setFloatValues(endRadius, startRadius);
}
- void start() {
- mAnimator.cancel();
- mAnimator.start();
- }
-
/**
* Reload colors from resources.
**/
@@ -103,7 +154,6 @@ class NumPadAnimator {
a.recycle();
mBackground.setColor(mNormalColor);
- mRipple.setColor(ColorStateList.valueOf(mHighlightColor));
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
index f4ce643a085c4..e0d0fc25943b2 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
@@ -19,8 +19,6 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.RippleDrawable;
import android.graphics.drawable.VectorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
@@ -39,13 +37,8 @@ public class NumPadButton extends AlphaOptimizedImageButton {
public NumPadButton(Context context, AttributeSet attrs) {
super(context, attrs);
- Drawable background = getBackground();
- if (background instanceof RippleDrawable) {
- mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(),
- attrs.getStyleAttribute());
- } else {
- mAnimator = null;
- }
+ mAnimator = new NumPadAnimator(context, getBackground().mutate(),
+ attrs.getStyleAttribute());
}
@Override
@@ -79,8 +72,14 @@ public class NumPadButton extends AlphaOptimizedImageButton {
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mAnimator != null) {
- mAnimator.start();
+ switch(event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mAnimator != null) mAnimator.expand();
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ if (mAnimator != null) mAnimator.contract();
+ break;
}
return super.onTouchEvent(event);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index a5a3f80d07b95..88a0bcec05428 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -18,8 +18,6 @@ package com.android.keyguard;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.RippleDrawable;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.AttributeSet;
@@ -131,13 +129,8 @@ public class NumPadKey extends ViewGroup {
setContentDescription(mDigitText.getText().toString());
- Drawable background = getBackground();
- if (background instanceof RippleDrawable) {
- mAnimator = new NumPadAnimator(context, (RippleDrawable) background,
- R.style.NumPadKey);
- } else {
- mAnimator = null;
- }
+ mAnimator = new NumPadAnimator(context, getBackground().mutate(),
+ R.style.NumPadKey, mDigitText);
}
@Override
@@ -161,11 +154,16 @@ public class NumPadKey extends ViewGroup {
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
- doHapticKeyClick();
- if (mAnimator != null) mAnimator.start();
+ switch(event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ doHapticKeyClick();
+ if (mAnimator != null) mAnimator.expand();
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ if (mAnimator != null) mAnimator.contract();
+ break;
}
-
return super.onTouchEvent(event);
}