package com.android.systemui.colorextraction;
import android.app.WallpaperColors;
import android.app.WallpaperManager;
import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
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.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.types.ExtractionType;
import com.android.internal.colorextraction.types.Tonal;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dumpable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
public class SysuiColorExtractor extends ColorExtractor implements Dumpable {
private static final String TAG = "SysuiColorExtractor";
private boolean mWallpaperVisible;
private boolean mHasBackdrop;
private final GradientColors mWpHiddenColors;
public SysuiColorExtractor(Context context) {
this(context, new Tonal(context), true);
}
@VisibleForTesting
public SysuiColorExtractor(Context context, ExtractionType type, boolean registerVisibility) {
super(context, type);
mWpHiddenColors = new GradientColors();
WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
updateDefaultGradients(systemColors);
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);
}
}
WallpaperManager wallpaperManager = context.getSystemService(WallpaperManager.class);
if (wallpaperManager != null) {
wallpaperManager.removeOnColorsChangedListener(this);
wallpaperManager.addOnColorsChangedListener(this, null ,
UserHandle.USER_ALL);
}
}
private void updateDefaultGradients(WallpaperColors colors) {
Tonal.applyFallback(colors, mWpHiddenColors);
}
@Override
public void onColorsChanged(WallpaperColors colors, int which, int userId) {
if (userId != KeyguardUpdateMonitor.getCurrentUser()) {
return;
}
super.onColorsChanged(colors, which);
if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
updateDefaultGradients(colors);
}
}
@VisibleForTesting
GradientColors getFallbackColors() {
return mWpHiddenColors;
}
@Override
public GradientColors getColors(int which) {
return getColors(which, TYPE_DARK);
}
@Override
public GradientColors getColors(int which, int type) {
return getColors(which, type, false );
}
public GradientColors getColors(int which, boolean ignoreWallpaperVisibility) {
return getColors(which, TYPE_NORMAL, ignoreWallpaperVisibility);
}
public GradientColors getColors(int which, int type, boolean ignoreWallpaperVisibility) {
if (which == WallpaperManager.FLAG_SYSTEM) {
if (mWallpaperVisible || ignoreWallpaperVisibility) {
return super.getColors(which, type);
} else {
return mWpHiddenColors;
}
} else {
if (mHasBackdrop) {
return mWpHiddenColors;
} else {
return super.getColors(which, type);
}
}
}
@VisibleForTesting
void setWallpaperVisible(boolean visible) {
if (mWallpaperVisible != visible) {
mWallpaperVisible = visible;
triggerColorsChanged(WallpaperManager.FLAG_SYSTEM);
}
}
public void setHasBackdrop(boolean hasBackdrop) {
if (mHasBackdrop != hasBackdrop) {
mHasBackdrop = hasBackdrop;
triggerColorsChanged(WallpaperManager.FLAG_LOCK);
}
}
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("SysuiColorExtractor:");
pw.println(" Current wallpaper colors:");
pw.println(" system: " + mSystemColors);
pw.println(" lock: " + mLockColors);
GradientColors[] system = mGradientColors.get(WallpaperManager.FLAG_SYSTEM);
GradientColors[] lock = mGradientColors.get(WallpaperManager.FLAG_LOCK);
pw.println(" Gradients:");
pw.println(" system: " + Arrays.toString(system));
pw.println(" lock: " + Arrays.toString(lock));
pw.println(" Default scrim: " + mWpHiddenColors);
}
}