Merge "Import translations. DO NOT MERGE" into oc-dr1-dev
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 5237244..0c067ff 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -40,6 +40,8 @@
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.volume.VolumeDialogControllerImpl;
+import java.util.function.Consumer;
+
/**
* Class factory to provide customizable SystemUI components.
*/
@@ -84,8 +86,10 @@
public ScrimController createScrimController(LightBarController lightBarController,
ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
- LockscreenWallpaper lockscreenWallpaper) {
- return new ScrimController(lightBarController, scrimBehind, scrimInFront, headsUpScrim);
+ LockscreenWallpaper lockscreenWallpaper,
+ Consumer<Boolean> scrimVisibleListener) {
+ return new ScrimController(lightBarController, scrimBehind, scrimInFront, headsUpScrim,
+ scrimVisibleListener);
}
public NotificationIconAreaController createNotificationIconAreaController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 05d47ec..f5dc038 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -23,11 +23,12 @@
import android.app.Notification;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -54,9 +55,16 @@
import com.android.systemui.statusbar.notification.NotificationUtils;
import java.text.NumberFormat;
+import java.util.Arrays;
public class StatusBarIconView extends AnimatedImageView {
public static final int NO_COLOR = 0;
+
+ /**
+ * Multiply alpha values with (1+DARK_ALPHA_BOOST) when dozing. The chosen value boosts
+ * everything above 30% to 50%, making it appear on 1bit color depths.
+ */
+ private static final float DARK_ALPHA_BOOST = 0.67f;
private final int ANIMATION_DURATION_FAST = 100;
public static final int STATE_ICON = 0;
@@ -131,6 +139,8 @@
private final NotificationIconDozeHelper mDozer;
private int mContrastedDrawableColor;
private int mCachedContrastBackgroundColor = NO_COLOR;
+ private float[] mMatrix;
+ private ColorMatrixColorFilter mMatrixColorFilter;
public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) {
this(context, slot, sbn, false);
@@ -544,14 +554,33 @@
private void updateIconColor() {
if (mCurrentSetColor != NO_COLOR) {
- setImageTintList(ColorStateList.valueOf(NotificationUtils.interpolateColors(
- mCurrentSetColor, Color.WHITE, mDarkAmount)));
+ if (mMatrixColorFilter == null) {
+ mMatrix = new float[4 * 5];
+ mMatrixColorFilter = new ColorMatrixColorFilter(mMatrix);
+ }
+ int color = NotificationUtils.interpolateColors(
+ mCurrentSetColor, Color.WHITE, mDarkAmount);
+ updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDarkAmount);
+ mMatrixColorFilter.setColorMatrixArray(mMatrix);
+ setColorFilter(mMatrixColorFilter);
+ invalidate(); // setColorFilter only invalidates if the filter instance changed.
} else {
- setImageTintList(null);
mDozer.updateGrayscale(this, mDarkAmount);
}
}
+ /**
+ * Updates {@param array} such that it represents a matrix that changes RGB to {@param color}
+ * and multiplies A with 1+{@param alphaBoost}.
+ */
+ private static void updateTintMatrix(float[] array, int color, float alphaBoost) {
+ Arrays.fill(array, 0);
+ array[4] = Color.red(color);
+ array[9] = Color.green(color);
+ array[14] = Color.blue(color);
+ array[18] = 1 + alphaBoost;
+ }
+
public void setIconColor(int iconColor, boolean animate) {
if (mIconColor != iconColor) {
mIconColor = iconColor;
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 62d4b73..eabf07b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -25,6 +25,7 @@
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.os.Trace;
import android.util.MathUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -46,6 +47,8 @@
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.stack.ViewState;
+import java.util.function.Consumer;
+
/**
* Controls both the scrim behind the notifications and in front of the notifications (when a
* security method gets shown).
@@ -125,12 +128,16 @@
private boolean mWakingUpFromAodInProgress;
/** Wake up from AOD transition is animating; need to reset when animation finishes */
private boolean mWakingUpFromAodAnimationRunning;
+ private boolean mScrimsVisble;
+ private final Consumer<Boolean> mScrimVisibleListener;
public ScrimController(LightBarController lightBarController, ScrimView scrimBehind,
- ScrimView scrimInFront, View headsUpScrim) {
+ ScrimView scrimInFront, View headsUpScrim,
+ Consumer<Boolean> scrimVisibleListener) {
mScrimBehind = scrimBehind;
mScrimInFront = scrimInFront;
mHeadsUpScrim = headsUpScrim;
+ mScrimVisibleListener = scrimVisibleListener;
final Context context = scrimBehind.getContext();
mUnlockMethodCache = UnlockMethodCache.getInstance(context);
mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
@@ -192,7 +199,11 @@
scheduleUpdate();
}
+ /** Prepares the wakeUpFromAod animation (while turning on screen); Forces black scrims. */
public void prepareWakeUpFromAod() {
+ if (mWakingUpFromAodInProgress) {
+ return;
+ }
mWakingUpFromAodInProgress = true;
mWakingUpFromAodStarting = true;
mAnimateChange = false;
@@ -200,10 +211,12 @@
onPreDraw();
}
+ /** Starts the wakeUpFromAod animation (once screen is on); animate to transparent scrims. */
public void wakeUpFromAod() {
if (mWakeAndUnlocking || mAnimateKeyguardFadingOut) {
// Wake and unlocking has a separate transition that must not be interfered with.
mWakingUpFromAodStarting = false;
+ mWakingUpFromAodInProgress = false;
return;
}
if (mWakingUpFromAodStarting) {
@@ -218,6 +231,7 @@
mWakeAndUnlocking = true;
mAnimatingDozeUnlock = true;
mWakingUpFromAodStarting = false;
+ mWakingUpFromAodInProgress = false;
scheduleUpdate();
}
@@ -328,7 +342,6 @@
}
protected void updateScrims() {
-
// Make sure we have the right gradients
if (mNeedsDrawableColorUpdate) {
mNeedsDrawableColorUpdate = false;
@@ -359,13 +372,24 @@
setScrimInFrontAlpha(1f);
setScrimBehindAlpha(0f);
}
- } else if (!mKeyguardShowing && !mBouncerShowing) {
+ } else if (!mKeyguardShowing && !mBouncerShowing && !mWakingUpFromAodStarting) {
updateScrimNormal();
setScrimInFrontAlpha(0);
} else {
updateScrimKeyguard();
}
mAnimateChange = false;
+ dispatchScrimsVisible();
+ }
+
+ private void dispatchScrimsVisible() {
+ boolean scrimsVisible = mScrimBehind.getViewAlpha() > 0 || mScrimInFront.getViewAlpha() > 0;
+
+ if (mScrimsVisble != scrimsVisible) {
+ mScrimsVisble = scrimsVisible;
+
+ mScrimVisibleListener.accept(scrimsVisible);
+ }
}
private void updateScrimKeyguard() {
@@ -457,6 +481,10 @@
alpha = Math.max(0, Math.min(1.0f, alpha));
scrimView.setViewAlpha(alpha);
+ Trace.traceCounter(Trace.TRACE_TAG_APP,
+ scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha",
+ (int) (alpha * 255));
+
int dozeTint = Color.TRANSPARENT;
boolean dozing = mAnimatingDozeUnlock || mDozing;
@@ -464,6 +492,10 @@
if (dozing || frontScrimDozing && scrim == mScrimInFront) {
dozeTint = Color.BLACK;
}
+ Trace.traceCounter(Trace.TRACE_TAG_APP,
+ scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint",
+ dozeTint == Color.BLACK ? 1 : 0);
+
scrimView.setTint(dozeTint);
} else {
scrim.setAlpha(alpha1);
@@ -477,6 +509,7 @@
float alpha = (float) animation.getAnimatedValue();
setCurrentScrimAlpha(scrim, alpha);
updateScrimColor(scrim);
+ dispatchScrimsVisible();
});
anim.setInterpolator(getInterpolator());
anim.setStartDelay(mAnimationDelay);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 136c158..0b57e7c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1132,7 +1132,12 @@
ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front);
View headsUpScrim = mStatusBarWindow.findViewById(R.id.heads_up_scrim);
mScrimController = SystemUIFactory.getInstance().createScrimController(mLightBarController,
- scrimBehind, scrimInFront, headsUpScrim, mLockscreenWallpaper);
+ scrimBehind, scrimInFront, headsUpScrim, mLockscreenWallpaper,
+ scrimsVisible -> {
+ if (mStatusBarWindowManager != null) {
+ mStatusBarWindowManager.setScrimsVisible(scrimsVisible);
+ }
+ });
if (mScrimSrcModeEnabled) {
Runnable runnable = new Runnable() {
@Override
@@ -5171,6 +5176,9 @@
mStackScroller.setAnimationsEnabled(true);
mVisualStabilityManager.setScreenOn(true);
mNotificationPanel.setTouchDisabled(false);
+
+ maybePrepareWakeUpFromAod();
+
mDozeServiceHost.stopDozing();
updateVisibleToUser();
updateIsKeyguard();
@@ -5183,11 +5191,7 @@
mFalsingManager.onScreenTurningOn();
mNotificationPanel.onScreenTurningOn();
- int wakefulness = mWakefulnessLifecycle.getWakefulness();
- if (mDozing && (wakefulness == WAKEFULNESS_WAKING
- || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) {
- mScrimController.prepareWakeUpFromAod();
- }
+ maybePrepareWakeUpFromAod();
if (mLaunchCameraOnScreenTurningOn) {
mNotificationPanel.launchCamera(false, mLastCameraLaunchSource);
@@ -5216,6 +5220,14 @@
return mWakefulnessLifecycle.getWakefulness();
}
+ private void maybePrepareWakeUpFromAod() {
+ int wakefulness = mWakefulnessLifecycle.getWakefulness();
+ if (mDozing && (wakefulness == WAKEFULNESS_WAKING
+ || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) {
+ mScrimController.prepareWakeUpFromAod();
+ }
+ }
+
private void vibrateForCameraGesture() {
// Make sure to pass -1 for repeat so VibratorService doesn't stop us when going to sleep.
mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index 836b2ef..d886508 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -186,7 +186,7 @@
private boolean isExpanded(State state) {
return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
|| state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
- || state.headsUpShowing);
+ || state.headsUpShowing || state.scrimsVisible);
}
private void applyFitsSystemWindows(State state) {
@@ -325,6 +325,11 @@
apply(mCurrentState);
}
+ public void setScrimsVisible(boolean scrimsVisible) {
+ mCurrentState.scrimsVisible = scrimsVisible;
+ apply(mCurrentState);
+ }
+
public void setHeadsUpShowing(boolean showing) {
mCurrentState.headsUpShowing = showing;
apply(mCurrentState);
@@ -426,6 +431,7 @@
boolean remoteInputActive;
boolean forcePluginOpen;
boolean dozing;
+ boolean scrimsVisible;
private boolean isKeyguardShowingAndNotOccluded() {
return keyguardShowing && !keyguardOccluded;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 5bd5e21..2caac7a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6003,9 +6003,9 @@
return;
}
- if (!displayContent.isReady() || !mPolicy.isScreenOn()) {
- // No need to freeze the screen before the display is ready, system is ready, or if
- // the screen is off.
+ if (!displayContent.isReady() || !mPolicy.isScreenOn() || !okToAnimate()) {
+ // No need to freeze the screen before the display is ready, if the screen is off,
+ // or we can't currently animate.
return;
}