summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorJorim Jaggi <jjaggi@google.com>2014-11-11 22:51:10 +0100
committerJorim Jaggi <jjaggi@google.com>2014-11-13 17:54:21 +0100
commit048af1f727dc81a6450e004391d072599ac449ee (patch)
tree997e7728ac4e4e84d458dd8f6d53ad4b1cf002e8 /packages
parent68b83a784a0c9f3d2483a8a38b8e1ae047c4914e (diff)
downloadframeworks_base-048af1f727dc81a6450e004391d072599ac449ee.zip
frameworks_base-048af1f727dc81a6450e004391d072599ac449ee.tar.gz
frameworks_base-048af1f727dc81a6450e004391d072599ac449ee.tar.bz2
Fix doze jank by removing a fullscreen layer of overdraw
Move all doze related stuff into DozeScrimController, and combine both alpha values from the regular ScrimController and DozeScrimController before applying it to a view. Move the black background from NotificationPanelView to DozeScrimController, which saves a fullscreen layer of overdraw during the transition. Bug: 18238168 Change-Id: Ifb133bf4a0f8255f5c2f5e205509af339cac8c8f
Diffstat (limited to 'packages')
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java260
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java53
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java183
4 files changed, 315 insertions, 192 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
new file mode 100644
index 0000000..c0d7b9b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Handler;
+import android.util.Log;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+
+import com.android.systemui.doze.DozeHost;
+import com.android.systemui.doze.DozeLog;
+
+/**
+ * Controller which handles all the doze animations of the scrims.
+ */
+public class DozeScrimController {
+ private static final String TAG = "DozeScrimController";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private final DozeParameters mDozeParameters;
+ private final Interpolator mPulseInInterpolator = PhoneStatusBar.ALPHA_OUT;
+ private final Interpolator mPulseOutInterpolator = PhoneStatusBar.ALPHA_IN;
+ private final Interpolator mDozeAnimationInterpolator;
+ private final Handler mHandler = new Handler();
+ private final ScrimController mScrimController;
+
+ private boolean mDozing;
+ private DozeHost.PulseCallback mPulseCallback;
+ private Animator mInFrontAnimator;
+ private Animator mBehindAnimator;
+ private float mInFrontTarget;
+ private float mBehindTarget;
+
+ public DozeScrimController(ScrimController scrimController, Context context) {
+ mScrimController = scrimController;
+ mDozeParameters = new DozeParameters(context);
+ mDozeAnimationInterpolator = AnimationUtils.loadInterpolator(context,
+ android.R.interpolator.linear_out_slow_in);
+ }
+
+ public void setDozing(boolean dozing, boolean animate) {
+ if (mDozing == dozing) return;
+ mDozing = dozing;
+ if (mDozing) {
+ abortAnimations();
+ mScrimController.setDozeBehindAlpha(1f);
+ mScrimController.setDozeInFrontAlpha(1f);
+ } else {
+ cancelPulsing();
+ if (animate) {
+ startScrimAnimation(false /* inFront */, 0f /* target */,
+ NotificationPanelView.DOZE_ANIMATION_DURATION, mDozeAnimationInterpolator);
+ startScrimAnimation(true /* inFront */, 0f /* target */,
+ NotificationPanelView.DOZE_ANIMATION_DURATION, mDozeAnimationInterpolator);
+ } else {
+ abortAnimations();
+ mScrimController.setDozeBehindAlpha(0f);
+ mScrimController.setDozeInFrontAlpha(0f);
+ }
+ }
+ }
+
+ /** When dozing, fade screen contents in and out using the front scrim. */
+ public void pulse(@NonNull DozeHost.PulseCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
+ }
+
+ if (!mDozing || mPulseCallback != null) {
+ // Pulse suppressed.
+ callback.onPulseFinished();
+ return;
+ }
+
+ // Begin pulse. Note that it's very important that the pulse finished callback
+ // be invoked when we're done so that the caller can drop the pulse wakelock.
+ mPulseCallback = callback;
+ mHandler.post(mPulseIn);
+ }
+
+ public boolean isPulsing() {
+ return mPulseCallback != null;
+ }
+
+ private void cancelPulsing() {
+ if (DEBUG) Log.d(TAG, "Cancel pulsing");
+
+ if (mPulseCallback != null) {
+ mHandler.removeCallbacks(mPulseIn);
+ mHandler.removeCallbacks(mPulseOut);
+ pulseFinished();
+ }
+ }
+
+ private void pulseStarted() {
+ if (mPulseCallback != null) {
+ mPulseCallback.onPulseStarted();
+ }
+ }
+
+ private void pulseFinished() {
+ if (mPulseCallback != null) {
+ mPulseCallback.onPulseFinished();
+ mPulseCallback = null;
+ }
+ }
+
+ private void abortAnimations() {
+ if (mInFrontAnimator != null) {
+ mInFrontAnimator.cancel();
+ }
+ if (mBehindAnimator != null) {
+ mBehindAnimator.cancel();
+ }
+ }
+
+ private void startScrimAnimation(final boolean inFront, float target, long duration,
+ Interpolator interpolator) {
+ startScrimAnimation(inFront, target, duration, interpolator, 0 /* delay */,
+ null /* endRunnable */);
+ }
+
+ private void startScrimAnimation(final boolean inFront, float target, long duration,
+ Interpolator interpolator, long delay, final Runnable endRunnable) {
+ Animator current = getCurrentAnimator(inFront);
+ if (current != null) {
+ float currentTarget = getCurrentTarget(inFront);
+ if (currentTarget == target) {
+ return;
+ }
+ current.cancel();
+ }
+ ValueAnimator anim = ValueAnimator.ofFloat(getDozeAlpha(inFront), target);
+ anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float value = (float) animation.getAnimatedValue();
+ setDozeAlpha(inFront, value);
+ }
+ });
+ anim.setInterpolator(interpolator);
+ anim.setDuration(duration);
+ anim.setStartDelay(delay);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ setCurrentAnimator(inFront, null);
+ if (endRunnable != null) {
+ endRunnable.run();
+ }
+ }
+ });
+ anim.start();
+ setCurrentAnimator(inFront, anim);
+ setCurrentTarget(inFront, target);
+ }
+
+ private float getCurrentTarget(boolean inFront) {
+ return inFront ? mInFrontTarget : mBehindTarget;
+ }
+
+ private void setCurrentTarget(boolean inFront, float target) {
+ if (inFront) {
+ mInFrontTarget = target;
+ } else {
+ mBehindTarget = target;
+ }
+ }
+
+ private Animator getCurrentAnimator(boolean inFront) {
+ return inFront ? mInFrontAnimator : mBehindAnimator;
+ }
+
+ private void setCurrentAnimator(boolean inFront, Animator animator) {
+ if (inFront) {
+ mInFrontAnimator = animator;
+ } else {
+ mBehindAnimator = animator;
+ }
+ }
+
+ private void setDozeAlpha(boolean inFront, float alpha) {
+ if (inFront) {
+ mScrimController.setDozeInFrontAlpha(alpha);
+ } else {
+ mScrimController.setDozeBehindAlpha(alpha);
+ }
+ }
+
+ private float getDozeAlpha(boolean inFront) {
+ return inFront
+ ? mScrimController.getDozeInFrontAlpha()
+ : mScrimController.getDozeBehindAlpha();
+ }
+
+ private final Runnable mPulseIn = new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing);
+ if (!mDozing) return;
+ DozeLog.tracePulseStart();
+ startScrimAnimation(true /* inFront */, 0f, mDozeParameters.getPulseInDuration(),
+ mPulseInInterpolator, mDozeParameters.getPulseInDelay(), mPulseInFinished);
+
+ // Signal that the pulse is ready to turn the screen on and draw.
+ pulseStarted();
+ }
+ };
+
+ private final Runnable mPulseInFinished = new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG) Log.d(TAG, "Pulse in finished, mDozing=" + mDozing);
+ if (!mDozing) return;
+ mHandler.postDelayed(mPulseOut, mDozeParameters.getPulseVisibleDuration());
+ }
+ };
+
+ private final Runnable mPulseOut = new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
+ if (!mDozing) return;
+ startScrimAnimation(true /* inFront */, 1f, mDozeParameters.getPulseOutDuration(),
+ mPulseOutInterpolator, 0 /* delay */, mPulseOutFinished);
+ }
+ };
+
+ private final Runnable mPulseOutFinished = new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG) Log.d(TAG, "Pulse out finished");
+ DozeLog.tracePulseFinish();
+
+ // Signal that the pulse is all finished so we can turn the screen off now.
+ pulseFinished();
+ }
+ };
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 9d7d310..de99a82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -23,10 +23,7 @@ import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
-import android.util.LayoutDirection;
import android.util.MathUtils;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -63,8 +60,6 @@ public class NotificationPanelView extends PanelView implements
private static final float HEADER_RUBBERBAND_FACTOR = 2.05f;
private static final float LOCK_ICON_ACTIVE_SCALE = 1.2f;
- private static final int DOZE_BACKGROUND_COLOR = 0xff000000;
- private static final int TAG_KEY_ANIM = R.id.scrim;
public static final long DOZE_ANIMATION_DURATION = 700;
private KeyguardAffordanceHelper mAfforanceHelper;
@@ -1824,11 +1819,9 @@ public class NotificationPanelView extends PanelView implements
if (dozing == mDozing) return;
mDozing = dozing;
if (mDozing) {
- setBackgroundColorAlpha(DOZE_BACKGROUND_COLOR, 0xff, false /*animate*/);
mKeyguardStatusBar.setVisibility(View.INVISIBLE);
mKeyguardBottomArea.setVisibility(View.INVISIBLE);
} else {
- setBackgroundColorAlpha(DOZE_BACKGROUND_COLOR, 0, animate);
mKeyguardBottomArea.setVisibility(View.VISIBLE);
mKeyguardStatusBar.setVisibility(View.VISIBLE);
if (animate) {
@@ -1843,52 +1836,6 @@ public class NotificationPanelView extends PanelView implements
return mDozing;
}
- private void setBackgroundColorAlpha(int rgb, int targetAlpha,
- boolean animate) {
- int currentAlpha = getBackgroundAlpha(this);
- if (currentAlpha == targetAlpha) {
- return;
- }
- final int r = Color.red(rgb);
- final int g = Color.green(rgb);
- final int b = Color.blue(rgb);
- Object runningAnim = getTag(TAG_KEY_ANIM);
- if (runningAnim instanceof ValueAnimator) {
- ((ValueAnimator) runningAnim).cancel();
- }
- if (!animate) {
- setBackgroundColor(Color.argb(targetAlpha, r, g, b));
- return;
- }
- ValueAnimator anim = ValueAnimator.ofInt(currentAlpha, targetAlpha);
- anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- int value = (int) animation.getAnimatedValue();
- setBackgroundColor(Color.argb(value, r, g, b));
- }
- });
- anim.setInterpolator(mDozeAnimationInterpolator);
- anim.setDuration(DOZE_ANIMATION_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- setTag(TAG_KEY_ANIM, null);
- }
- });
- anim.start();
- setTag(TAG_KEY_ANIM, anim);
- }
-
- private static int getBackgroundAlpha(View view) {
- if (view.getBackground() instanceof ColorDrawable) {
- ColorDrawable drawable = (ColorDrawable) view.getBackground();
- return Color.alpha(drawable.getColor());
- } else {
- return 0;
- }
- }
-
public void setShadeEmpty(boolean shadeEmpty) {
mShadeEmpty = shadeEmpty;
updateEmptyShadeView();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 2f0ce28..d94f122 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -414,6 +414,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private ViewMediatorCallback mKeyguardViewMediatorCallback;
private ScrimController mScrimController;
+ private DozeScrimController mDozeScrimController;
private final Runnable mAutohide = new Runnable() {
@Override
@@ -741,6 +742,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mScrimController = new ScrimController(scrimBehind, scrimInFront, mScrimSrcModeEnabled);
mScrimController.setBackDropView(mBackdrop);
mStatusBarView.setScrimController(mScrimController);
+ mDozeScrimController = new DozeScrimController(mScrimController, context);
mHeader = (StatusBarHeaderView) mStatusBarWindow.findViewById(R.id.header);
mHeader.setActivityStarter(this);
@@ -3677,13 +3679,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
if (mState != StatusBarState.KEYGUARD && !mNotificationPanel.isDozing()) {
return;
}
- mNotificationPanel.setDozing(mDozing, mScrimController.isPulsing() /*animate*/);
+ mNotificationPanel.setDozing(mDozing, mDozeScrimController.isPulsing() /*animate*/);
if (mDozing) {
mStackScroller.setDark(true, false /*animate*/);
} else {
mStackScroller.setDark(false, false /*animate*/);
}
- mScrimController.setDozing(mDozing, mScrimController.isPulsing() /*animate*/);
+ mScrimController.setDozing(mDozing);
+ mDozeScrimController.setDozing(mDozing, mDozeScrimController.isPulsing() /* animate */);
}
public void updateStackScrollerState(boolean goingToFullShade) {
@@ -4060,7 +4063,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
public void wakeUpIfDozing(long time, boolean fromTouch) {
- if (mDozing && mScrimController.isPulsing()) {
+ if (mDozing && mDozeScrimController.isPulsing()) {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
pm.wakeUp(time);
if (fromTouch) {
@@ -4175,7 +4178,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
private void handlePulseWhileDozing(@NonNull PulseCallback callback) {
- mScrimController.pulse(callback);
+ mDozeScrimController.pulse(callback);
}
private void handleStopDozing() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 10d6594..d6bd94b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -19,20 +19,15 @@ package com.android.systemui.statusbar.phone;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
-import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Color;
-import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
-import android.view.animation.PathInterpolator;
import com.android.systemui.R;
-import com.android.systemui.doze.DozeHost;
-import com.android.systemui.doze.DozeLog;
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.ScrimView;
@@ -41,9 +36,6 @@ import com.android.systemui.statusbar.ScrimView;
* security method gets shown).
*/
public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
- private static final String TAG = "ScrimController";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
public static final long ANIMATION_DURATION = 220;
private static final float SCRIM_BEHIND_ALPHA = 0.62f;
@@ -55,7 +47,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
private final ScrimView mScrimBehind;
private final ScrimView mScrimInFront;
private final UnlockMethodCache mUnlockMethodCache;
- private final DozeParameters mDozeParameters;
private boolean mKeyguardShowing;
private float mFraction;
@@ -70,15 +61,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
private long mAnimationDelay;
private Runnable mOnAnimationFinished;
private boolean mAnimationStarted;
- private boolean mDozing;
- private boolean mPulsingOut;
- private DozeHost.PulseCallback mPulseCallback;
private final Interpolator mInterpolator = new DecelerateInterpolator();
private final Interpolator mLinearOutSlowInInterpolator;
- private final Interpolator mPulseInInterpolator = PhoneStatusBar.ALPHA_OUT;
- private final Interpolator mPulseOutInterpolator = PhoneStatusBar.ALPHA_IN;
private BackDropView mBackDropView;
private boolean mScrimSrcEnabled;
+ private boolean mDozing;
+ private float mDozeInFrontAlpha;
+ private float mDozeBehindAlpha;
+ private float mCurrentInFrontAlpha;
+ private float mCurrentBehindAlpha;
public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, boolean scrimSrcEnabled) {
mScrimBehind = scrimBehind;
@@ -87,7 +78,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
mUnlockMethodCache = UnlockMethodCache.getInstance(context);
mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
android.R.interpolator.linear_out_slow_in);
- mDozeParameters = new DozeParameters(context);
mScrimSrcEnabled = scrimSrcEnabled;
}
@@ -134,60 +124,27 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
scheduleUpdate();
}
- public void setDozing(boolean dozing, boolean animate) {
- if (mDozing == dozing) return;
+ public void setDozing(boolean dozing) {
mDozing = dozing;
- if (!mDozing) {
- cancelPulsing();
- mAnimateChange = animate;
- }
scheduleUpdate();
}
- /** When dozing, fade screen contents in and out using the front scrim. */
- public void pulse(@NonNull DozeHost.PulseCallback callback) {
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
-
- if (!mDozing || mPulseCallback != null) {
- // Pulse suppressed.
- callback.onPulseFinished();
- return;
- }
-
- // Begin pulse. Note that it's very important that the pulse finished callback
- // be invoked when we're done so that the caller can drop the pulse wakelock.
- mPulseCallback = callback;
- mScrimInFront.post(mPulseIn);
+ public void setDozeInFrontAlpha(float alpha) {
+ mDozeInFrontAlpha = alpha;
+ updateScrimColor(mScrimInFront);
}
- public boolean isPulsing() {
- return mPulseCallback != null;
+ public void setDozeBehindAlpha(float alpha) {
+ mDozeBehindAlpha = alpha;
+ updateScrimColor(mScrimBehind);
}
- private void cancelPulsing() {
- if (DEBUG) Log.d(TAG, "Cancel pulsing");
-
- if (mPulseCallback != null) {
- mScrimInFront.removeCallbacks(mPulseIn);
- mScrimInFront.removeCallbacks(mPulseOut);
- pulseFinished();
- }
- }
-
- private void pulseStarted() {
- if (mPulseCallback != null) {
- mPulseCallback.onPulseStarted();
- }
+ public float getDozeBehindAlpha() {
+ return mDozeBehindAlpha;
}
- private void pulseFinished() {
- mPulsingOut = false;
- if (mPulseCallback != null) {
- mPulseCallback.onPulseFinished();
- mPulseCallback = null;
- }
+ public float getDozeInFrontAlpha() {
+ return mDozeInFrontAlpha;
}
private void scheduleUpdate() {
@@ -223,12 +180,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
} else if (mBouncerShowing) {
setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA);
setScrimBehindColor(0f);
- } else if (mDozing && isPulsing() && !mPulsingOut) {
- setScrimInFrontColor(0);
- setScrimBehindColor(SCRIM_BEHIND_ALPHA_KEYGUARD);
- } else if (mDozing) {
- setScrimInFrontColor(1);
- setScrimBehindColor(SCRIM_BEHIND_ALPHA_KEYGUARD);
} else {
float fraction = Math.max(0, Math.min(mFraction, 1));
setScrimInFrontColor(0f);
@@ -272,26 +223,46 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
((ValueAnimator) runningAnim).cancel();
scrim.setTag(TAG_KEY_ANIM, null);
}
- int color = Color.argb((int) (alpha * 255), 0, 0, 0);
if (mAnimateChange) {
- startScrimAnimation(scrim, color);
+ startScrimAnimation(scrim, alpha);
} else {
- scrim.setScrimColor(color);
+ setCurrentScrimAlpha(scrim, alpha);
+ updateScrimColor(scrim);
}
}
- private void startScrimAnimation(final ScrimView scrim, int targetColor) {
- int current = Color.alpha(scrim.getScrimColor());
- int target = Color.alpha(targetColor);
- if (current == target) {
- return;
+ private float getDozeAlpha(View scrim) {
+ return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha;
+ }
+
+ private float getCurrentScrimAlpha(View scrim) {
+ return scrim == mScrimBehind ? mCurrentBehindAlpha : mCurrentInFrontAlpha;
+ }
+
+ private void setCurrentScrimAlpha(View scrim, float alpha) {
+ if (scrim == mScrimBehind) {
+ mCurrentBehindAlpha = alpha;
+ } else {
+ mCurrentInFrontAlpha = alpha;
}
- ValueAnimator anim = ValueAnimator.ofInt(current, target);
+ }
+
+ private void updateScrimColor(ScrimView scrim) {
+ float alpha1 = getCurrentScrimAlpha(scrim);
+ float alpha2 = getDozeAlpha(scrim);
+ float alpha = 1 - (1 - alpha1) * (1 - alpha2);
+ scrim.setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0));
+ }
+
+ private void startScrimAnimation(final ScrimView scrim, float target) {
+ float current = getCurrentScrimAlpha(scrim);
+ ValueAnimator anim = ValueAnimator.ofFloat(current, target);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- int value = (int) animation.getAnimatedValue();
- scrim.setScrimColor(Color.argb(value, 0, 0, 0));
+ float alpha = (float) animation.getAnimatedValue();
+ setCurrentScrimAlpha(scrim, alpha);
+ updateScrimColor(scrim);
}
});
anim.setInterpolator(getInterpolator());
@@ -313,15 +284,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
}
private Interpolator getInterpolator() {
- if (mAnimateKeyguardFadingOut) {
- return mLinearOutSlowInInterpolator;
- } else if (isPulsing() && !mPulsingOut) {
- return mPulseInInterpolator;
- } else if (isPulsing()) {
- return mPulseOutInterpolator;
- } else {
- return mInterpolator;
- }
+ return mAnimateKeyguardFadingOut ? mLinearOutSlowInInterpolator : mInterpolator;
}
@Override
@@ -342,56 +305,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
return true;
}
- private final Runnable mPulseIn = new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing);
- if (!mDozing) return;
- DozeLog.tracePulseStart();
- mDurationOverride = mDozeParameters.getPulseInDuration();
- mAnimationDelay = mDozeParameters.getPulseInDelay();
- mAnimateChange = true;
- mOnAnimationFinished = mPulseInFinished;
- scheduleUpdate();
-
- // Signal that the pulse is ready to turn the screen on and draw.
- pulseStarted();
- }
- };
-
- private final Runnable mPulseInFinished = new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Pulse in finished, mDozing=" + mDozing);
- if (!mDozing) return;
- mScrimInFront.postDelayed(mPulseOut, mDozeParameters.getPulseVisibleDuration());
- }
- };
-
- private final Runnable mPulseOut = new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
- if (!mDozing) return;
- mDurationOverride = mDozeParameters.getPulseOutDuration();
- mAnimateChange = true;
- mOnAnimationFinished = mPulseOutFinished;
- mPulsingOut = true;
- scheduleUpdate();
- }
- };
-
- private final Runnable mPulseOutFinished = new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Pulse out finished");
- DozeLog.tracePulseFinish();
-
- // Signal that the pulse is all finished so we can turn the screen off now.
- pulseFinished();
- }
- };
-
public void setBackDropView(BackDropView backDropView) {
mBackDropView = backDropView;
mBackDropView.setOnVisibilityChangedRunnable(new Runnable() {