Remove reflection from wallpaper manager for wallpaper colors.
Bug: 65016704 Change-Id: I36bac7a3cd9cd4911657e693a424c9960cb9d042
This commit is contained in:
@@ -16,96 +16,65 @@
|
||||
package com.android.launcher3.compat;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.WallpaperColors;
|
||||
import android.app.WallpaperManager;
|
||||
import android.app.WallpaperManager.OnColorsChangedListener;
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.util.Log;
|
||||
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.O)
|
||||
|
||||
@TargetApi(27)
|
||||
public class WallpaperManagerCompatVOMR1 extends WallpaperManagerCompat {
|
||||
|
||||
private static final String TAG = "WMCompatVOMR1";
|
||||
|
||||
private final WallpaperManager mWm;
|
||||
|
||||
private final Class mOCLClass;
|
||||
private final Method mAddOCLMethod;
|
||||
|
||||
private final Method mWCGetMethod;
|
||||
private final Method mWCGetPrimaryColorMethod;
|
||||
private final Method mWCGetSecondaryColorMethod;
|
||||
private final Method mWCGetTertiaryColorMethod;
|
||||
private final Method mWCColorHintsMethod;
|
||||
|
||||
WallpaperManagerCompatVOMR1(Context context) throws Exception {
|
||||
mWm = context.getSystemService(WallpaperManager.class);
|
||||
|
||||
mOCLClass = Class.forName("android.app.WallpaperManager$OnColorsChangedListener");
|
||||
mAddOCLMethod = WallpaperManager.class.getDeclaredMethod(
|
||||
"addOnColorsChangedListener", mOCLClass, Handler.class);
|
||||
mWCGetMethod = WallpaperManager.class.getDeclaredMethod("getWallpaperColors", int.class);
|
||||
Class wallpaperColorsClass = mWCGetMethod.getReturnType();
|
||||
mWCGetPrimaryColorMethod = wallpaperColorsClass.getDeclaredMethod("getPrimaryColor");
|
||||
mWCGetSecondaryColorMethod = wallpaperColorsClass.getDeclaredMethod("getSecondaryColor");
|
||||
mWCGetTertiaryColorMethod = wallpaperColorsClass.getDeclaredMethod("getTertiaryColor");
|
||||
mWCColorHintsMethod = wallpaperColorsClass.getDeclaredMethod("getColorHints");
|
||||
mWCColorHintsMethod = WallpaperColors.class.getDeclaredMethod("getColorHints");
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public WallpaperColorsCompat getWallpaperColors(int which) {
|
||||
try {
|
||||
return convertColorsObject(mWCGetMethod.invoke(mWm, which));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling wallpaper API", e);
|
||||
return null;
|
||||
}
|
||||
return convertColorsObject(mWm.getWallpaperColors(which));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addOnColorsChangedListener(final OnColorsChangedListenerCompat listener) {
|
||||
Object onChangeListener = Proxy.newProxyInstance(
|
||||
WallpaperManager.class.getClassLoader(),
|
||||
new Class[]{mOCLClass},
|
||||
new InvocationHandler() {
|
||||
@Override
|
||||
public Object invoke(Object o, Method method, Object[] objects)
|
||||
throws Throwable {
|
||||
String methodName = method.getName();
|
||||
if ("onColorsChanged".equals(methodName)) {
|
||||
listener.onColorsChanged(
|
||||
convertColorsObject(objects[0]), (Integer) objects[1]);
|
||||
} else if ("toString".equals(methodName)) {
|
||||
return listener.toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
try {
|
||||
mAddOCLMethod.invoke(mWm, onChangeListener, null);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling wallpaper API", e);
|
||||
}
|
||||
OnColorsChangedListener onChangeListener = new OnColorsChangedListener() {
|
||||
public void onColorsChanged(WallpaperColors colors, int which) {
|
||||
listener.onColorsChanged(convertColorsObject(colors), which);
|
||||
}
|
||||
public void onColorsChanged(WallpaperColors colors, int which, int userId) {
|
||||
onColorsChanged(colors, which);
|
||||
}
|
||||
};
|
||||
mWm.addOnColorsChangedListener(onChangeListener, null);
|
||||
}
|
||||
|
||||
private WallpaperColorsCompat convertColorsObject(Object colors) throws Exception {
|
||||
private WallpaperColorsCompat convertColorsObject(WallpaperColors colors) {
|
||||
if (colors == null) {
|
||||
return null;
|
||||
}
|
||||
Color primary = (Color) mWCGetPrimaryColorMethod.invoke(colors);
|
||||
Color secondary = (Color) mWCGetSecondaryColorMethod.invoke(colors);
|
||||
Color tertiary = (Color) mWCGetTertiaryColorMethod.invoke(colors);
|
||||
Color primary = colors.getPrimaryColor();
|
||||
Color secondary = colors.getSecondaryColor();
|
||||
Color tertiary = colors.getTertiaryColor();
|
||||
int primaryVal = primary != null ? primary.toArgb() : 0;
|
||||
int secondaryVal = secondary != null ? secondary.toArgb() : 0;
|
||||
int tertiaryVal = tertiary != null ? tertiary.toArgb() : 0;
|
||||
int colorHints = (Integer) mWCColorHintsMethod.invoke(colors);
|
||||
int colorHints = 0;
|
||||
try {
|
||||
colorHints = (Integer) mWCColorHintsMethod.invoke(colors);
|
||||
} catch (Exception exc) {
|
||||
Log.e(TAG, "error calling color hints", exc);
|
||||
}
|
||||
return new WallpaperColorsCompat(primaryVal, secondaryVal, tertiaryVal, colorHints);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user