aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Gaillard <jgaillard@google.com>2022-02-17 15:35:06 +0000
committerJerome Gaillard <jgaillard@google.com>2022-02-18 13:15:44 +0000
commit98472c27e25f62073d1a9d72484e878ef045c43e (patch)
treef1d3f100eb4a0d48e60c3da199d140b5f8ea80cc
parent6f1cc2af5876bed295a3401019a232efdbca8cd0 (diff)
downloadlayoutlib-98472c27e25f62073d1a9d72484e878ef045c43e.tar.gz
Update handling of adaptive icon mask editing
The constructor of AdaptiveIconDrawable has been modified to get the path mask from resources. This redirects that call to the delegate to allow changing the path through RenderParams. Bug: 153986571 Test: layoutlib tests updated Change-Id: I7ebf17e802bc8e1151635944098f76539067fd2e (cherry picked from commit b49a113b915a1b5f1cf9bcce60c389c188010e87)
-rw-r--r--bridge/src/android/graphics/drawable/AdaptiveIconDrawable_Delegate.java23
-rw-r--r--bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java3
-rw-r--r--bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java5
-rw-r--r--bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java20
-rw-r--r--common/src/com/android/tools/layoutlib/create/NativeConfig.java1
-rw-r--r--create/src/com/android/tools/layoutlib/create/CreateInfo.java19
6 files changed, 46 insertions, 25 deletions
diff --git a/bridge/src/android/graphics/drawable/AdaptiveIconDrawable_Delegate.java b/bridge/src/android/graphics/drawable/AdaptiveIconDrawable_Delegate.java
index ca6bc85ff4..cbcf1fdb56 100644
--- a/bridge/src/android/graphics/drawable/AdaptiveIconDrawable_Delegate.java
+++ b/bridge/src/android/graphics/drawable/AdaptiveIconDrawable_Delegate.java
@@ -16,22 +16,23 @@
package android.graphics.drawable;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+import com.android.internal.R;
import android.content.res.Resources;
-import android.content.res.Resources_Delegate;
-import android.util.PathParser;
-
-import static com.android.layoutlib.bridge.android.RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH;
public class AdaptiveIconDrawable_Delegate {
+ public static String sPath;
- @LayoutlibDelegate
- /*package*/ static void constructor_after(AdaptiveIconDrawable icon) {
- String pathString = Resources_Delegate.getLayoutlibCallback(Resources.getSystem()).getFlag(
- FLAG_KEY_ADAPTIVE_ICON_MASK_PATH);
- if (pathString != null) {
- AdaptiveIconDrawable.sMask = PathParser.createPathFromPathData(pathString);
+ /**
+ * Delegate that replaces a call to Resources.getString in
+ * the constructor of AdaptiveIconDrawable.
+ * This allows to pass a non-default value for the mask for adaptive icons.
+ */
+ @SuppressWarnings("unused")
+ public static String getResourceString(int resId) {
+ if (resId == R.string.config_icon_mask) {
+ return sPath;
}
+ return Resources.getSystem().getString(resId);
}
}
diff --git a/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java b/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java
index d88ee39cb8..678b244893 100644
--- a/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java
+++ b/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java
@@ -17,7 +17,6 @@
package com.android.layoutlib.bridge.android;
import com.android.ide.common.rendering.api.IImageFactory;
-import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.RenderParams;
import com.android.ide.common.rendering.api.SessionParams.Key;
@@ -44,7 +43,7 @@ public final class RenderParamsFlags {
public static final Key<Boolean> FLAG_DO_NOT_RENDER_ON_CREATE =
new Key<Boolean>("doNotRenderOnCreate", Boolean.class);
/**
- * The adaptive icon mask path. Used via {@link LayoutlibCallback#getFlag(Key)}
+ * To tell Layoutlib which path to use for the adaptive icon mask.
*/
public static final Key<String> FLAG_KEY_ADAPTIVE_ICON_MASK_PATH =
new Key<>("adaptiveIconMaskPath", String.class);
diff --git a/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
index d444754145..2b87435669 100644
--- a/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
+++ b/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
@@ -34,6 +34,7 @@ import com.android.tools.layoutlib.annotations.VisibleForTesting;
import android.animation.PropertyValuesHolder_Accessor;
import android.content.res.Configuration;
+import android.graphics.drawable.AdaptiveIconDrawable_Delegate;
import android.os.HandlerThread_Delegate;
import android.util.DisplayMetrics;
import android.view.IWindowManager;
@@ -138,6 +139,10 @@ public abstract class RenderAction<T extends RenderParams> {
RenderResources resources = mParams.getResources();
+ // sets the custom adaptive icon path
+ AdaptiveIconDrawable_Delegate.sPath =
+ mParams.getFlag(RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH);
+
// build the context
mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources,
mParams.getAssets(), mParams.getLayoutlibCallback(), getConfiguration(mParams),
diff --git a/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java b/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
index 91c79c9587..3448c015be 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
@@ -915,46 +915,46 @@ public class RenderTests extends RenderTestBase {
new LayoutLibTestCallback(getLogger(), mDefaultClassLoader);
layoutLibCallback.initResources();
- layoutLibCallback.setAdaptiveIconMaskPath("M50,0L100,0 100,100 0,100 0,0z");
SessionParams params = getSessionParamsBuilder()
.setParser(parser)
.setCallback(layoutLibCallback)
.setTheme("Theme.Material.NoActionBar.Fullscreen", false)
.setRenderingMode(RenderingMode.V_SCROLL)
.build();
-
+ params.setFlag(RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH,
+ "M50,0L100,0 100,100 0,100 0,0z");
renderAndVerify(params, "adaptive_icon.png");
- layoutLibCallback.setAdaptiveIconMaskPath(
- "M50 0C77.6 0 100 22.4 100 50C100 77.6 77.6 100 50 100C22.4 100 0 77.6 0 50C0 " +
- "22.4 22.4 0 50 0Z");
params = getSessionParamsBuilder()
.setParser(LayoutPullParser.createFromString(layout))
.setCallback(layoutLibCallback)
.setTheme("Theme.Material.NoActionBar.Fullscreen", false)
.setRenderingMode(RenderingMode.V_SCROLL)
.build();
+ params.setFlag(RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH,
+ "M50 0C77.6 0 100 22.4 100 50C100 77.6 77.6 100 50 100C22.4 100 0 77.6 0 50C0 " +
+ "22.4 22.4 0 50 0Z");
renderAndVerify(params, "adaptive_icon_circle.png");
- layoutLibCallback.setAdaptiveIconMaskPath(
- "M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58," +
- " 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z");
params = getSessionParamsBuilder()
.setParser(LayoutPullParser.createFromString(layout))
.setCallback(layoutLibCallback)
.setTheme("Theme.Material.NoActionBar.Fullscreen", false)
.setRenderingMode(RenderingMode.V_SCROLL)
.build();
+ params.setFlag(RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH,
+ "M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58," +
+ " 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z");
renderAndVerify(params, "adaptive_icon_rounded_corners.png");
- layoutLibCallback.setAdaptiveIconMaskPath(
- "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z");
params = getSessionParamsBuilder()
.setParser(LayoutPullParser.createFromString(layout))
.setCallback(layoutLibCallback)
.setTheme("Theme.Material.NoActionBar.Fullscreen", false)
.setRenderingMode(RenderingMode.V_SCROLL)
.build();
+ params.setFlag(RenderParamsFlags.FLAG_KEY_ADAPTIVE_ICON_MASK_PATH,
+ "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z");
renderAndVerify(params, "adaptive_icon_squircle.png");
}
diff --git a/common/src/com/android/tools/layoutlib/create/NativeConfig.java b/common/src/com/android/tools/layoutlib/create/NativeConfig.java
index 9c05df2ab2..cc778d1dc9 100644
--- a/common/src/com/android/tools/layoutlib/create/NativeConfig.java
+++ b/common/src/com/android/tools/layoutlib/create/NativeConfig.java
@@ -87,7 +87,6 @@ public class NativeConfig {
"android.graphics.ImageDecoder#decodeBitmapImpl",
"android.graphics.Typeface#create",
"android.graphics.Typeface$Builder#createAssetUid",
- "android.graphics.drawable.AdaptiveIconDrawable#<init>",
"android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorUI#onDraw",
"android.graphics.drawable.AnimatedVectorDrawable#draw",
"android.graphics.drawable.DrawableInflater#inflateFromClass",
diff --git a/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index 66a22d1fa5..035af66b8a 100644
--- a/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -149,6 +149,7 @@ public final class CreateInfo implements ICreateInfo {
new NioUtilsFreeBufferReplacer(),
new ProcessInitializerInitSchedReplacer(),
new NativeInitPathReplacer(),
+ new AdaptiveIconMaskReplacer(),
new ActivityThreadInAnimationReplacer(),
new ReferenceRefersToReplacer(),
};
@@ -337,7 +338,6 @@ public final class CreateInfo implements ICreateInfo {
"android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorUI#mSet",
"android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT#mPendingAnimationActions",
"android.graphics.drawable.AnimatedVectorDrawable#mAnimatorSet",
- "android.graphics.drawable.AdaptiveIconDrawable#sMask",
"android.graphics.drawable.DrawableInflater#mRes",
"android.view.Choreographer#mCallbackQueues", // required for tests only
"android.view.Choreographer$CallbackQueue#mHead", // required for tests only
@@ -640,6 +640,23 @@ public final class CreateInfo implements ICreateInfo {
}
}
+ public static class AdaptiveIconMaskReplacer implements MethodReplacer {
+ @Override
+ public boolean isNeeded(String owner, String name, String desc, String sourceClass) {
+ return "android/graphics/drawable/AdaptiveIconDrawable".equals(sourceClass) &&
+ "android/content/res/Resources".equals(owner) &&
+ name.equals("getString");
+ }
+
+ @Override
+ public void replace(MethodInformation mi) {
+ mi.owner = "android/graphics/drawable/AdaptiveIconDrawable_Delegate";
+ mi.name = "getResourceString";
+ mi.opcode = Opcodes.INVOKESTATIC;
+ mi.desc = Type.getMethodDescriptor(Type.getType(String.class), Type.INT_TYPE);
+ }
+ }
+
public static class ActivityThreadInAnimationReplacer implements MethodReplacer {
@Override
public boolean isNeeded(String owner, String name, String desc, String sourceClass) {