Scrims should be grey when in-app
Bug: 38164389
Test: runtest -x colorextraction/tests/src/com/google/android/colorextraction/ColorExtractorTest.java
Test: runtest -x tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
Change-Id: Ifcc04a8562e46b4f65bce0470ccd6c02dffcf377
(cherry picked from commit e1571705e6ea8367e7ee93d61104ce27035492dc)
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 73a2a43..1b694b3 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -28,6 +28,7 @@
import com.android.internal.util.Preconditions;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.assist.AssistManager;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.PluginDependencyProvider;
@@ -38,9 +39,9 @@
import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
-import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
+import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -77,7 +78,6 @@
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
-import com.android.systemui.tuner.TunablePadding;
import com.android.systemui.tuner.TunablePadding.TunablePaddingService;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerServiceImpl;
@@ -86,8 +86,6 @@
import com.android.systemui.util.leak.LeakReporter;
import com.android.systemui.volume.VolumeDialogControllerImpl;
-import com.google.android.colorextraction.ColorExtractor;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
@@ -109,6 +107,7 @@
* services, registered receivers, etc.
*/
public class Dependency extends SystemUI {
+ private static final String TAG = "Dependency";
/**
* Key for getting a background Looper for background work.
@@ -268,7 +267,7 @@
mProviders.put(AccessibilityManagerWrapper.class,
() -> new AccessibilityManagerWrapper(mContext));
- mProviders.put(ColorExtractor.class, () -> new ColorExtractor(mContext));
+ mProviders.put(SysuiColorExtractor.class, () -> new SysuiColorExtractor(mContext));
mProviders.put(TunablePaddingService.class, () -> new TunablePaddingService());
diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
new file mode 100644
index 0000000..5f393d0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2017 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.colorextraction;
+
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.Display;
+import android.view.IWallpaperVisibilityListener;
+import android.view.IWindowManager;
+import android.view.WindowManagerGlobal;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import com.google.android.colorextraction.ColorExtractor;
+import com.google.android.colorextraction.types.ExtractionType;
+import com.google.android.colorextraction.types.Tonal;
+
+/**
+ * ColorExtractor aware of wallpaper visibility
+ */
+public class SysuiColorExtractor extends ColorExtractor {
+ private static final String TAG = "SysuiColorExtractor";
+ private boolean mWallpaperVisible;
+ // Colors to return when the wallpaper isn't visible
+ private final GradientColors mWpHiddenColors;
+
+ public SysuiColorExtractor(Context context) {
+ this(context, new Tonal(), true);
+ }
+
+ @VisibleForTesting
+ public SysuiColorExtractor(Context context, ExtractionType type, boolean registerVisibility) {
+ super(context, type);
+
+ mWpHiddenColors = new GradientColors();
+ mWpHiddenColors.setMainColor(FALLBACK_COLOR);
+ mWpHiddenColors.setSecondaryColor(FALLBACK_COLOR);
+
+ if (registerVisibility) {
+ try {
+ IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
+ Handler handler = Handler.getMain();
+ boolean visible = windowManagerService.registerWallpaperVisibilityListener(
+ new IWallpaperVisibilityListener.Stub() {
+ @Override
+ public void onWallpaperVisibilityChanged(boolean newVisibility,
+ int displayId) throws RemoteException {
+ handler.post(() -> setWallpaperVisible(newVisibility));
+ }
+ }, Display.DEFAULT_DISPLAY);
+ setWallpaperVisible(visible);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Can't listen to wallpaper visibility changes", e);
+ }
+ }
+ }
+
+ /**
+ * Get TYPE_NORMAL colors when wallpaper is visible, or fallback otherwise.
+ *
+ * @param which FLAG_LOCK or FLAG_SYSTEM
+ * @return colors
+ */
+ @Override
+ public GradientColors getColors(int which) {
+ return getColors(which, TYPE_NORMAL);
+ }
+
+ /**
+ * Wallpaper colors when the wallpaper is visible, fallback otherwise.
+ *
+ * @param which FLAG_LOCK or FLAG_SYSTEM
+ * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK
+ * @return colors
+ */
+ @Override
+ public GradientColors getColors(int which, int type) {
+ return getColors(which, type, false /* ignoreVisibility */);
+ }
+
+ /**
+ * Get TYPE_NORMAL colors, possibly ignoring wallpaper visibility.
+ *
+ * @param which FLAG_LOCK or FLAG_SYSTEM
+ * @param ignoreWallpaperVisibility whether you want fallback colors or not if the wallpaper
+ * isn't visible
+ * @return
+ */
+ public GradientColors getColors(int which, boolean ignoreWallpaperVisibility) {
+ return getColors(which, TYPE_NORMAL, ignoreWallpaperVisibility);
+ }
+
+ /**
+ *
+ * @param which FLAG_LOCK or FLAG_SYSTEM
+ * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK
+ * @param ignoreWallpaperVisibility true if true wallpaper colors should be returning
+ * if it's visible or not
+ * @return colors
+ */
+ public GradientColors getColors(int which, int type, boolean ignoreWallpaperVisibility) {
+ if (mWallpaperVisible || ignoreWallpaperVisibility) {
+ return super.getColors(which, type);
+ } else {
+ return mWpHiddenColors;
+ }
+ }
+
+ @VisibleForTesting
+ void setWallpaperVisible(boolean visible) {
+ if (mWallpaperVisible != visible) {
+ mWallpaperVisible = visible;
+ triggerColorsChanged(WallpaperManager.FLAG_SYSTEM);
+ }
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index e8dcf6c..80a6418 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -25,6 +25,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
import com.android.systemui.HardwareUiLayout;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.volume.VolumeDialogImpl;
@@ -1227,7 +1228,7 @@
mClickListener = clickListener;
mLongClickListener = longClickListener;
mGradientDrawable = new GradientDrawable(mContext);
- mColorExtractor = Dependency.get(ColorExtractor.class);
+ mColorExtractor = Dependency.get(SysuiColorExtractor.class);
// Window initialization
Window window = getWindow();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 319b463..d710244 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -46,6 +46,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivity;
import com.android.systemui.recents.RecentsActivityLaunchState;
@@ -113,7 +114,7 @@
private final float mScrimAlpha;
private GradientDrawable mBackgroundScrim;
- private final ColorExtractor mColorExtractor;
+ private final SysuiColorExtractor mColorExtractor;
private Animator mBackgroundScrimAnimator;
private RecentsTransitionHelper mTransitionHelper;
@@ -146,7 +147,7 @@
mBackgroundScrim = new GradientDrawable(context);
mBackgroundScrim.setCallback(this);
mBackgroundScrim.setAlpha((int) (mScrimAlpha * 255));
- mColorExtractor = Dependency.get(ColorExtractor.class);
+ mColorExtractor = Dependency.get(SysuiColorExtractor.class);
LayoutInflater inflater = LayoutInflater.from(context);
if (RecentsDebugFlags.Static.EnableStackActionButton) {
@@ -829,17 +830,23 @@
}
@Override
- public void onColorsChanged(ColorExtractor extractor, int which) {
+ public void onColorsChanged(ColorExtractor colorExtractor, int which) {
if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
- mBackgroundScrim.setColors(extractor.getColors(WallpaperManager.FLAG_SYSTEM));
+ // Recents doesn't care about the wallpaper being visible or not, it always
+ // wants to scrim with wallpaper colors
+ mBackgroundScrim.setColors(
+ mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, true));
}
}
public void onStart() {
mColorExtractor.addOnColorsChangedListener(this);
+ // Getting system scrim colors ignoring wallpaper visibility since it should never be grey.
+ ColorExtractor.GradientColors systemColors = mColorExtractor.getColors(
+ WallpaperManager.FLAG_SYSTEM, true);
// We don't want to interpolate colors because we're defining the initial state.
// Gradient should be set/ready when you open "Recents".
- mBackgroundScrim.setColors(mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM), false);
+ mBackgroundScrim.setColors(systemColors, false);
}
public void onStop() {
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 f502bb5..bc278e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -36,6 +36,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.ScrimView;
@@ -78,7 +79,7 @@
private final View mHeadsUpScrim;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
- private final ColorExtractor mColorExtractor;
+ private final SysuiColorExtractor mColorExtractor;
private ColorExtractor.GradientColors mLockColors;
private ColorExtractor.GradientColors mLockColorsDark;
private ColorExtractor.GradientColors mSystemColors;
@@ -131,15 +132,17 @@
mLightBarController = lightBarController;
mScrimBehindAlpha = context.getResources().getFloat(R.dimen.scrim_behind_alpha);
- mColorExtractor = Dependency.get(ColorExtractor.class);
+ mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mColorExtractor.addOnColorsChangedListener(this);
- mLockColors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK);
- mSystemColors = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM);
+ mLockColors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK,
+ ColorExtractor.TYPE_NORMAL, true /* ignoreVisibility */);
+ mSystemColors = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
+ ColorExtractor.TYPE_NORMAL, true /* ignoreVisibility */);
// Darker gradient for the top scrim (mScrimInFront)
mLockColorsDark = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK,
- ColorExtractor.TYPE_DARK);
+ ColorExtractor.TYPE_DARK, true /* ignoreVisibility */);
mSystemColorsDark = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
- ColorExtractor.TYPE_DARK);
+ ColorExtractor.TYPE_DARK, true /* ignoreVisibility */);
mNeedsDrawableColorUpdate = true;
updateHeadsUpScrim(false);
@@ -659,18 +662,18 @@
@Override
public void onColorsChanged(ColorExtractor colorExtractor, int which) {
if ((which & WallpaperManager.FLAG_LOCK) != 0) {
- mLockColors = colorExtractor.getColors(WallpaperManager.FLAG_LOCK,
- ColorExtractor.TYPE_NORMAL);
- mLockColorsDark = colorExtractor.getColors(WallpaperManager.FLAG_LOCK,
- ColorExtractor.TYPE_DARK);
+ mLockColors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK,
+ ColorExtractor.TYPE_NORMAL, true /* ignoreVisibility */);
+ mLockColorsDark = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK,
+ ColorExtractor.TYPE_DARK, true /* ignoreVisibility */);
mNeedsDrawableColorUpdate = true;
scheduleUpdate();
}
if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
- mSystemColors = colorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
- ColorExtractor.TYPE_NORMAL);
- mSystemColorsDark = colorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
- ColorExtractor.TYPE_DARK);
+ mSystemColors = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
+ ColorExtractor.TYPE_NORMAL, mKeyguardShowing);
+ mSystemColorsDark = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM,
+ ColorExtractor.TYPE_DARK, mKeyguardShowing);
mNeedsDrawableColorUpdate = true;
scheduleUpdate();
}
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 908de1c..c9d450d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -168,6 +168,7 @@
import com.android.systemui.assist.AssistManager;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.classifier.FalsingManager;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.fragments.ExtensionFragmentListener;
@@ -733,7 +734,7 @@
private HashMap<String, Entry> mPendingNotifications = new HashMap<>();
private boolean mClearAllEnabled;
@Nullable private View mAmbientIndicationContainer;
- private ColorExtractor mColorExtractor;
+ private SysuiColorExtractor mColorExtractor;
private ForegroundServiceController mForegroundServiceController;
private void recycleAllVisibilityObjects(ArraySet<NotificationVisibility> array) {
@@ -780,7 +781,7 @@
mOverlayManager = IOverlayManager.Stub.asInterface(
ServiceManager.getService(Context.OVERLAY_SERVICE));
- mColorExtractor = Dependency.get(ColorExtractor.class);
+ mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mColorExtractor.addOnColorsChangedListener(this);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
@@ -4515,10 +4516,10 @@
// Ignore visibility since we calculate the theme based on the real colors,
// not the current state.
if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
- useDarkTheme = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK)
+ useDarkTheme = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, true /* vis */)
.supportsDarkText();
} else {
- useDarkTheme = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM)
+ useDarkTheme = mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, true /* vis */)
.supportsDarkText();
}