diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java index 6c775b906d1e9..ea320c701c241 100644 --- a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java +++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java @@ -647,15 +647,15 @@ public class Resources_Delegate { static String getResourceName(Resources resources, int resid) throws NotFoundException { boolean[] platformOut = new boolean[1]; Pair resourceInfo = getResourceInfo(resources, resid, platformOut); - String namespace; + String packageName; if (resourceInfo != null) { if (platformOut[0]) { - namespace = SdkConstants.ANDROID_NS_NAME; + packageName = SdkConstants.ANDROID_NS_NAME; } else { - namespace = resources.mContext.getPackageName(); - namespace = namespace == null ? SdkConstants.APP_PREFIX : namespace; + packageName = resources.mContext.getPackageName(); + packageName = packageName == null ? SdkConstants.APP_PREFIX : packageName; } - return namespace + ':' + resourceInfo.getFirst().getName() + '/' + + return packageName + ':' + resourceInfo.getFirst().getName() + '/' + resourceInfo.getSecond(); } throwException(resid, null); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index 4e4fcd0aff2d7..0c537533479ea 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -122,7 +122,7 @@ public abstract class RenderAction extends FrameworkReso // build the context mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources, - mParams.getAssets(), mParams.getLayoutlibCallback(), getConfiguration(), + mParams.getAssets(), mParams.getLayoutlibCallback(), getConfiguration(mParams), mParams.getTargetSdkVersion(), mParams.isRtlSupported()); setUp(); @@ -130,7 +130,6 @@ public abstract class RenderAction extends FrameworkReso return SUCCESS.createResult(); } - /** * Prepares the scene for action. *

@@ -320,10 +319,11 @@ public abstract class RenderAction extends FrameworkReso } } - private Configuration getConfiguration() { + // VisibleForTesting + public static Configuration getConfiguration(RenderParams params) { Configuration config = new Configuration(); - HardwareConfig hardwareConfig = mParams.getHardwareConfig(); + HardwareConfig hardwareConfig = params.getHardwareConfig(); ScreenSize screenSize = hardwareConfig.getScreenSize(); if (screenSize != null) { @@ -392,7 +392,7 @@ public abstract class RenderAction extends FrameworkReso } else { config.screenLayout |= Configuration.SCREENLAYOUT_ROUND_UNDEFINED; } - String locale = getParams().getLocale(); + String locale = params.getLocale(); if (locale != null && !locale.isEmpty()) config.locale = new Locale(locale); // TODO: fill in more config info. diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index c2f06e8b9aa24..a5561fab953c6 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -29,11 +29,14 @@ import com.android.ide.common.resources.ResourceResolver; import com.android.ide.common.resources.configuration.FolderConfiguration; import com.android.io.FolderWrapper; import com.android.layoutlib.bridge.Bridge; +import com.android.layoutlib.bridge.android.BridgeContext; +import com.android.layoutlib.bridge.impl.RenderAction; import com.android.layoutlib.bridge.intensive.setup.ConfigGenerator; import com.android.layoutlib.bridge.intensive.setup.LayoutLibTestCallback; import com.android.layoutlib.bridge.intensive.setup.LayoutPullParser; import com.android.resources.Density; import com.android.resources.Navigation; +import com.android.resources.ResourceType; import com.android.utils.ILogger; import org.junit.AfterClass; @@ -42,13 +45,15 @@ import org.junit.Test; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.util.DisplayMetrics; import java.io.File; -import java.io.FileFilter; import java.io.IOException; import java.net.URL; import java.util.Arrays; -import java.util.Comparator; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; @@ -160,13 +165,8 @@ public class Main { if (!host.isDirectory()) { return null; } - File[] hosts = host.listFiles(new FileFilter() { - @Override - public boolean accept(File path) { - return path.isDirectory() && (path.getName().startsWith("linux-") || path.getName() - .startsWith("darwin-")); - } - }); + File[] hosts = host.listFiles(path -> path.isDirectory() && + (path.getName().startsWith("linux-") || path.getName().startsWith("darwin-"))); for (File hostOut : hosts) { String platformDir = getPlatformDirFromHostOut(hostOut); if (platformDir != null) { @@ -184,12 +184,9 @@ public class Main { if (!sdkDir.isDirectory()) { return null; } - File[] sdkDirs = sdkDir.listFiles(new FileFilter() { - @Override - public boolean accept(File path) { - // We need to search for $TARGET_PRODUCT (usually, sdk_phone_armv7) - return path.isDirectory() && path.getName().startsWith("sdk"); - } + File[] sdkDirs = sdkDir.listFiles(path -> { + // We need to search for $TARGET_PRODUCT (usually, sdk_phone_armv7) + return path.isDirectory() && path.getName().startsWith("sdk"); }); for (File dir : sdkDirs) { String platformDir = getPlatformDirFromHostOutSdkSdk(dir); @@ -201,46 +198,34 @@ public class Main { } private static String getPlatformDirFromHostOutSdkSdk(File sdkDir) { - File[] possibleSdks = sdkDir.listFiles(new FileFilter() { - @Override - public boolean accept(File path) { - return path.isDirectory() && path.getName().contains("android-sdk"); - } - }); + File[] possibleSdks = sdkDir.listFiles( + path -> path.isDirectory() && path.getName().contains("android-sdk")); for (File possibleSdk : possibleSdks) { File platformsDir = new File(possibleSdk, "platforms"); - File[] platforms = platformsDir.listFiles(new FileFilter() { - @Override - public boolean accept(File path) { - return path.isDirectory() && path.getName().startsWith("android-"); - } - }); + File[] platforms = platformsDir.listFiles( + path -> path.isDirectory() && path.getName().startsWith("android-")); if (platforms == null || platforms.length == 0) { continue; } - Arrays.sort(platforms, new Comparator() { - // Codenames before ints. Higher APIs precede lower. - @Override - public int compare(File o1, File o2) { - final int MAX_VALUE = 1000; - String suffix1 = o1.getName().substring("android-".length()); - String suffix2 = o2.getName().substring("android-".length()); - int suff1, suff2; - try { - suff1 = Integer.parseInt(suffix1); - } catch (NumberFormatException e) { - suff1 = MAX_VALUE; - } - try { - suff2 = Integer.parseInt(suffix2); - } catch (NumberFormatException e) { - suff2 = MAX_VALUE; - } - if (suff1 != MAX_VALUE || suff2 != MAX_VALUE) { - return suff2 - suff1; - } - return suffix2.compareTo(suffix1); + Arrays.sort(platforms, (o1, o2) -> { + final int MAX_VALUE = 1000; + String suffix1 = o1.getName().substring("android-".length()); + String suffix2 = o2.getName().substring("android-".length()); + int suff1, suff2; + try { + suff1 = Integer.parseInt(suffix1); + } catch (NumberFormatException e) { + suff1 = MAX_VALUE; } + try { + suff2 = Integer.parseInt(suffix2); + } catch (NumberFormatException e) { + suff2 = MAX_VALUE; + } + if (suff1 != MAX_VALUE || suff2 != MAX_VALUE) { + return suff2 - suff1; + } + return suffix2.compareTo(suffix1); }); return platforms[0].getAbsolutePath(); } @@ -261,6 +246,7 @@ public class Main { return null; } } + /** * Initialize the bridge and the resource maps. */ @@ -325,8 +311,7 @@ public class Main { @Test public void testExpand() throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "expand_vert_layout.xml"); + LayoutPullParser parser = createLayoutPullParser("expand_vert_layout.xml"); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); @@ -348,8 +333,7 @@ public class Main { .setScreenHeight(300) .setDensity(Density.XHIGH) .setNavigation(Navigation.NONAV); - parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "expand_horz_layout.xml"); + parser = createLayoutPullParser("expand_horz_layout.xml"); params = getSessionParams(parser, customConfigGenerator, layoutLibCallback, "Theme.Material.Light.NoActionBar.Fullscreen", false, RenderingMode.H_SCROLL, 22); @@ -361,8 +345,7 @@ public class Main { @Test public void testVectorAnimation() throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "indeterminate_progressbar.xml"); + LayoutPullParser parser = createLayoutPullParser("indeterminate_progressbar.xml"); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); @@ -373,8 +356,7 @@ public class Main { renderAndVerify(params, "animated_vector.png", TimeUnit.SECONDS.toNanos(2)); - parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "indeterminate_progressbar.xml"); + parser = createLayoutPullParser("indeterminate_progressbar.xml"); params = getSessionParams(parser, ConfigGenerator.NEXUS_5, layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", false, RenderingMode.V_SCROLL, 22); @@ -388,8 +370,7 @@ public class Main { @Test public void testVectorDrawable() throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "vector_drawable.xml"); + LayoutPullParser parser = createLayoutPullParser("vector_drawable.xml"); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); @@ -405,8 +386,7 @@ public class Main { @Test public void testScrolling() throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + - "scrolled.xml"); + LayoutPullParser parser = createLayoutPullParser("scrolled.xml"); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); @@ -435,6 +415,39 @@ public class Main { assertEquals(690, rootLayout.getChildren().get(5).getChildren().get(0).getRight()); } + @Test + public void testGetResourceNameVariants() throws Exception { + // Setup + SessionParams params = createSessionParams("", ConfigGenerator.NEXUS_4); + AssetManager assetManager = AssetManager.getSystem(); + DisplayMetrics metrics = new DisplayMetrics(); + Configuration configuration = RenderAction.getConfiguration(params); + Resources resources = new Resources(assetManager, metrics, configuration); + resources.mLayoutlibCallback = params.getLayoutlibCallback(); + resources.mContext = + new BridgeContext(params.getProjectKey(), metrics, params.getResources(), + params.getAssets(), params.getLayoutlibCallback(), configuration, + params.getTargetSdkVersion(), params.isRtlSupported()); + // Test + assertEquals("android:style/ButtonBar", + resources.getResourceName(android.R.style.ButtonBar)); + assertEquals("android", resources.getResourcePackageName(android.R.style.ButtonBar)); + assertEquals("ButtonBar", resources.getResourceEntryName(android.R.style.ButtonBar)); + assertEquals("style", resources.getResourceTypeName(android.R.style.ButtonBar)); + int id = resources.mLayoutlibCallback.getResourceId(ResourceType.STRING, "app_name"); + assertEquals("com.android.layoutlib.test.myapplication:string/app_name", + resources.getResourceName(id)); + assertEquals("com.android.layoutlib.test.myapplication", + resources.getResourcePackageName(id)); + assertEquals("string", resources.getResourceTypeName(id)); + assertEquals("app_name", resources.getResourceEntryName(id)); + } + + @NonNull + private LayoutPullParser createLayoutPullParser(String layoutPath) { + return new LayoutPullParser(APP_TEST_RES + "/layout/" + layoutPath); + } + /** * Create a new rendering session and test that rendering the given layout doesn't throw any * exceptions and matches the provided image. @@ -505,16 +518,21 @@ public class Main { private RenderResult renderAndVerify(String layoutFileName, String goldenFileName, ConfigGenerator deviceConfig) throws ClassNotFoundException { + SessionParams params = createSessionParams(layoutFileName, deviceConfig); + return renderAndVerify(params, goldenFileName); + } + + private SessionParams createSessionParams(String layoutFileName, ConfigGenerator deviceConfig) + throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + layoutFileName); + LayoutPullParser parser = createLayoutPullParser(layoutFileName); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); // TODO: Set up action bar handler properly to test menu rendering. // Create session params. - SessionParams params = getSessionParams(parser, deviceConfig, + return getSessionParams(parser, deviceConfig, layoutLibCallback, "AppTheme", true, RenderingMode.NORMAL, 22); - return renderAndVerify(params, goldenFileName); } /** diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java index 6c16ed01ca543..96ae523006b39 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java @@ -24,7 +24,9 @@ import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.ide.common.rendering.api.ParserFactory; import com.android.ide.common.rendering.api.ResourceReference; import com.android.ide.common.rendering.api.ResourceValue; +import com.android.ide.common.rendering.api.SessionParams.Key; import com.android.ide.common.resources.IntArrayWrapper; +import com.android.layoutlib.bridge.android.RenderParamsFlags; import com.android.resources.ResourceType; import com.android.util.Pair; import com.android.utils.ILogger; @@ -176,4 +178,12 @@ public class LayoutLibTestCallback extends LayoutlibCallback { } }; } + + @Override + public T getFlag(Key key) { + if (key.equals(RenderParamsFlags.FLAG_KEY_APPLICATION_PACKAGE)) { + return (T) PACKAGE_NAME; + } + return null; + } } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutPullParser.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutPullParser.java index c79b66281efc8..111049474461a 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutPullParser.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutPullParser.java @@ -56,9 +56,7 @@ public class LayoutPullParser extends KXmlParser implements ILayoutPullParser{ public LayoutPullParser(File layoutFile) { try { init(new FileInputStream(layoutFile)); - } catch (XmlPullParserException e) { - throw new IOError(e); - } catch (FileNotFoundException e) { + } catch (XmlPullParserException | FileNotFoundException e) { throw new IOError(e); } }