Layoulib updates for new prebuilts

Test: N/A
Change-Id: I9f8731e087aa931a7d0bec28125c8f66c7530118
diff --git a/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index c191f79..d334ba9 100644
--- a/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -22,6 +22,8 @@
 import com.android.ide.common.rendering.api.LayoutLog;
 import com.android.ide.common.rendering.api.LayoutlibCallback;
 import com.android.ide.common.rendering.api.RenderResources;
+import com.android.ide.common.rendering.api.ResourceNamespace;
+import com.android.ide.common.rendering.api.ResourceNamespace.Resolver;
 import com.android.ide.common.rendering.api.ResourceReference;
 import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.ide.common.rendering.api.StyleResourceValue;
@@ -99,6 +101,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -117,6 +120,9 @@
     private static final Map<String, ResourceValue> FRAMEWORK_PATCHED_VALUES = new HashMap<>(2);
     private static final Map<String, ResourceValue> FRAMEWORK_REPLACE_VALUES = new HashMap<>(3);
 
+    private static final Resolver LEGACY_NAMESPACE_RESOLVER =
+            Collections.singletonMap(SdkConstants.TOOLS_PREFIX, SdkConstants.TOOLS_URI)::get;
+
     static {
         FRAMEWORK_PATCHED_VALUES.put("animateFirstView", new ResourceValue(
                 ResourceType.BOOL, "animateFirstView", "false", false));
@@ -714,6 +720,13 @@
         PropertiesMap defaultPropMap = null;
         boolean isPlatformFile = true;
 
+        // TODO(namespaces): We need to figure out how to keep track of the namespace of the current
+        // layout file.
+        ResourceNamespace currentFileNamespace = ResourceNamespace.TODO;
+
+        // TODO(namespaces): get this through the callback, only in non-namespaced projects.
+        ResourceNamespace.Resolver resolver = LEGACY_NAMESPACE_RESOLVER;
+
         // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
         if (set instanceof BridgeXmlBlockParser) {
             BridgeXmlBlockParser parser;
@@ -726,6 +739,8 @@
                 defaultPropMap = mDefaultPropMaps.computeIfAbsent(key, k -> new PropertiesMap());
             }
 
+            resolver = parser::getNamespace;
+            currentFileNamespace = ResourceNamespace.fromBoolean(parser.isPlatformFile());
         } else if (set instanceof BridgeLayoutParamsMapAttributes) {
             // this is only for temp layout params generated dynamically, so this is never
             // platform content.
@@ -957,10 +972,19 @@
                     ta.bridgeSetValue(index, attrName, frameworkAttr, attributeHolder.resourceId,
                             defaultValue);
                 } else {
-                    // there is a value in the XML, but we need to resolve it in case it's
+                    // There is a value in the XML, but we need to resolve it in case it's
                     // referencing another resource or a theme value.
-                    ta.bridgeSetValue(index, attrName, frameworkAttr, attributeHolder.resourceId,
-                            mRenderResources.resolveValue(null, attrName, value, isPlatformFile));
+                    ResourceValue dummy =
+                            new ResourceValue(
+                                    currentFileNamespace,
+                                    null,
+                                    attrName,
+                                    value);
+                    dummy.setNamespaceLookup(resolver);
+
+                    ta.bridgeSetValue(
+                            index, attrName, frameworkAttr, attributeHolder.resourceId,
+                            mRenderResources.resolveResValue(dummy));
                 }
             }
         }
diff --git a/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java b/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
index f18cd48..d50117e 100644
--- a/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
+++ b/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
@@ -159,7 +159,7 @@
 
     @Override
     public String getNamespace(String prefix) {
-        throw new RuntimeException("getNamespace() not supported");
+        return mParser.getNamespace(prefix);
     }
 
     @Override
diff --git a/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTestBase.java b/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTestBase.java
index eb34f3c..399997b 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTestBase.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTestBase.java
@@ -18,6 +18,7 @@
 
 import com.android.ide.common.rendering.api.LayoutLog;
 import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.ResourceNamespace;
 import com.android.ide.common.rendering.api.Result;
 import com.android.ide.common.rendering.api.SessionParams;
 import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
@@ -59,6 +60,7 @@
 import java.util.concurrent.TimeUnit;
 
 import com.google.android.collect.Lists;
+import com.google.common.collect.ImmutableMap;
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
@@ -418,9 +420,8 @@
                 }
 
                 @Override
-                public void fidelityWarning(@Nullable String tag, String message,
-                        Throwable throwable, Object data) {
-
+                public void fidelityWarning(String tag, String message, Throwable throwable,
+                        Object viewCookie, Object data) {
                     System.out.println("FidelityWarning " + tag + ": " + message);
                     if (throwable != null) {
                         throwable.printStackTrace();
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 9ecf1ce..3b4851f 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
@@ -17,6 +17,7 @@
 package com.android.layoutlib.bridge.intensive;
 
 import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.ResourceNamespace;
 import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.ide.common.rendering.api.SessionParams;
 import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
@@ -800,8 +801,13 @@
 
         try {
             ColorStateList stateList = ResourceHelper.getColorStateList(
-                    new ResourceValue(ResourceUrl.create(null, ResourceType.COLOR, "test_list"),
-                            tmpColorList.getAbsolutePath()), mContext, null);
+                    new ResourceValue(
+                            ResourceNamespace.RES_AUTO,
+                            ResourceType.COLOR,
+                            "test_list",
+                            tmpColorList.getAbsolutePath()),
+                    mContext,
+                    null);
             assertNotNull(stateList);
             assertEquals(Color.parseColor("#ffffffff"), stateList.getColorForState(
                     StateSet.get(StateSet.VIEW_STATE_PRESSED),
@@ -817,8 +823,13 @@
             Resources.Theme theme = mContext.getResources().newTheme();
             theme.applyStyle(R.style.ThemeOverlay_Material_Light, true);
             stateList = ResourceHelper.getColorStateList(
-                    new ResourceValue(ResourceUrl.create(null, ResourceType.COLOR, "test_list"),
-                            tmpColorList.getAbsolutePath()), mContext, theme);
+                    new ResourceValue(
+                            ResourceNamespace.RES_AUTO,
+                            ResourceType.COLOR,
+                            "test_list",
+                            tmpColorList.getAbsolutePath()),
+                    mContext,
+                    theme);
             assertNotNull(stateList);
             assertEquals(Color.parseColor("#ff000000"), stateList.getColorForState(
                     StateSet.get(StateSet.VIEW_STATE_PRESSED),
diff --git a/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java b/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java
index 34fc726..684cf12 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java
@@ -163,8 +163,7 @@
     private Navigation mNavigation = Navigation.NONAV;
 
     public FolderConfiguration getFolderConfig() {
-        FolderConfiguration config = new FolderConfiguration();
-        config.createDefault();
+        FolderConfiguration config = FolderConfiguration.createDefault();
         config.setDensityQualifier(new DensityQualifier(mDensity));
         config.setNavigationMethodQualifier(new NavigationMethodQualifier(mNavigation));
         if (mScreenWidth > mScreenHeight) {
diff --git a/bridge/tests/src/com/android/layoutlib/bridge/intensive/util/SessionParamsBuilder.java b/bridge/tests/src/com/android/layoutlib/bridge/intensive/util/SessionParamsBuilder.java
index 4bd3640..058b965 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/intensive/util/SessionParamsBuilder.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/intensive/util/SessionParamsBuilder.java
@@ -20,6 +20,7 @@
 import com.android.ide.common.rendering.api.AssetRepository;
 import com.android.ide.common.rendering.api.LayoutLog;
 import com.android.ide.common.rendering.api.LayoutlibCallback;
+import com.android.ide.common.rendering.api.ResourceNamespace;
 import com.android.ide.common.rendering.api.SessionParams;
 import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
 import com.android.ide.common.resources.ResourceRepository;
@@ -33,6 +34,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  * Builder to help setting up {@link SessionParams} objects.
  */
@@ -149,10 +152,12 @@
         assert mLayoutlibCallback != null;
 
         FolderConfiguration config = mConfigGenerator.getFolderConfig();
-        ResourceResolver resourceResolver =
-                ResourceResolver.create(mProjectResources.getConfiguredResources(config),
-                        mFrameworkResources.getConfiguredResources(config), mThemeName,
-                        isProjectTheme);
+        ResourceResolver resourceResolver = ResourceResolver.create(
+                ImmutableMap.of(
+                        ResourceNamespace.ANDROID, mFrameworkResources.getConfiguredResources(config),
+                        ResourceNamespace.TODO, mProjectResources.getConfiguredResources(config)),
+                mThemeName,
+                isProjectTheme);
 
         SessionParams params = new SessionParams(mLayoutParser, mRenderingMode, mProjectKey /* for
         caching */, mConfigGenerator.getHardwareConfig(), resourceResolver, mLayoutlibCallback,
diff --git a/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteLayoutLogAdapter.java b/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteLayoutLogAdapter.java
index e87a0e0..c5dbfab 100644
--- a/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteLayoutLogAdapter.java
+++ b/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteLayoutLogAdapter.java
@@ -42,9 +42,9 @@
     }
 
     @Override
-    public void fidelityWarning(String tag, String message, Throwable throwable,
-            Serializable data) {
-        mLog.fidelityWarning(tag, message, throwable, null);
+    public void fidelityWarning(String tag, String message, Throwable throwable, Object viewCookie,
+            Object data) {
+        mLog.fidelityWarning(tag, message, throwable, viewCookie, data);
     }
 
     @Override
diff --git a/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteRenderResourcesAdapter.java b/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteRenderResourcesAdapter.java
index 4303b77..6434df1 100644
--- a/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteRenderResourcesAdapter.java
+++ b/remote/client/src/com/android/layoutlib/bridge/remote/client/adapters/RemoteRenderResourcesAdapter.java
@@ -17,6 +17,7 @@
 package com.android.layoutlib.bridge.remote.client.adapters;
 
 import com.android.ide.common.rendering.api.RenderResources;
+import com.android.ide.common.rendering.api.ResourceReference;
 import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.ide.common.rendering.api.StyleResourceValue;
 import com.android.layout.remote.api.RemoteRenderResources;
@@ -92,11 +93,6 @@
     }
 
     @Override
-    public ResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
-        return mDelegate.findResValue(reference, forceFrameworkOnly);
-    }
-
-    @Override
     public ResourceValue resolveValue(ResourceValue value) {
         return mDelegate.resolveResValue(value);
     }
@@ -116,4 +112,14 @@
     public StyleResourceValue getStyle(String styleName, boolean isFramework) {
         return mDelegate.getStyle(styleName, isFramework);
     }
+
+    @Override
+    public ResourceValue dereference(ResourceValue resourceValue) throws RemoteException {
+        return mDelegate.dereference(resourceValue);
+    }
+
+    @Override
+    public ResourceValue getUnresolvedResource(ResourceReference reference) {
+        return mDelegate.getUnresolvedResource(reference);
+    }
 }
diff --git a/remote/common/src/com/android/layout/remote/api/RemoteLayoutLog.java b/remote/common/src/com/android/layout/remote/api/RemoteLayoutLog.java
index 6240036..c3b5c61 100644
--- a/remote/common/src/com/android/layout/remote/api/RemoteLayoutLog.java
+++ b/remote/common/src/com/android/layout/remote/api/RemoteLayoutLog.java
@@ -44,10 +44,11 @@
      * @param tag a tag describing the type of the warning
      * @param message the message of the warning
      * @param throwable an optional Throwable that triggered the warning
+     * @param viewCookie optional cookie of the view associated to this error
      * @param data an optional data bundle that the client can use to improve the warning display.
      */
-    void fidelityWarning(String tag, String message, Throwable throwable, Serializable data)
-            throws RemoteException;
+    void fidelityWarning(String tag, String message, Throwable throwable, Object viewCookie,
+            Object data) throws RemoteException;
 
     /**
      * Logs an error.
diff --git a/remote/common/src/com/android/layout/remote/api/RemoteRenderResources.java b/remote/common/src/com/android/layout/remote/api/RemoteRenderResources.java
index f7341dc..0ec5652 100644
--- a/remote/common/src/com/android/layout/remote/api/RemoteRenderResources.java
+++ b/remote/common/src/com/android/layout/remote/api/RemoteRenderResources.java
@@ -17,6 +17,7 @@
 package com.android.layout.remote.api;
 
 import com.android.ide.common.rendering.api.RenderResources;
+import com.android.ide.common.rendering.api.ResourceReference;
 import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.ide.common.rendering.api.StyleResourceValue;
 import com.android.resources.ResourceType;
@@ -57,9 +58,6 @@
     ResourceValue findItemInStyle(StyleResourceValue style, String attrName,
             boolean isFrameworkAttr) throws RemoteException;
 
-
-    ResourceValue findResValue(String reference, boolean forceFrameworkOnly) throws RemoteException;
-
     ResourceValue resolveValue(ResourceValue value) throws RemoteException;
 
     ResourceValue resolveValue(ResourceType type, String name, String value,
@@ -68,4 +66,8 @@
     StyleResourceValue getParent(StyleResourceValue style) throws RemoteException;
 
     StyleResourceValue getStyle(String styleName, boolean isFramework) throws RemoteException;
+
+    ResourceValue dereference(ResourceValue resourceValue) throws RemoteException;
+
+    ResourceValue getUnresolvedResource(ResourceReference reference) throws RemoteException;
 }
diff --git a/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteLayoutLogAdapter.java b/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteLayoutLogAdapter.java
index 7a3fcfa..6878d46 100644
--- a/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteLayoutLogAdapter.java
+++ b/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteLayoutLogAdapter.java
@@ -39,9 +39,10 @@
     }
 
     @Override
-    public void fidelityWarning(String tag, String message, Throwable throwable, Object data) {
+    public void fidelityWarning(String tag, String message, Throwable throwable, Object viewCookie,
+            Object data) {
         try {
-            mLog.fidelityWarning(tag, message, throwable, null);
+            mLog.fidelityWarning(tag, message, throwable, viewCookie, data);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }
diff --git a/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteRenderResourcesAdapter.java b/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteRenderResourcesAdapter.java
index 61ab170..2fa5b04 100644
--- a/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteRenderResourcesAdapter.java
+++ b/remote/server/src/com/android/layoutlib/bridge/remote/server/adapters/RemoteRenderResourcesAdapter.java
@@ -18,6 +18,7 @@
 
 import com.android.ide.common.rendering.api.LayoutLog;
 import com.android.ide.common.rendering.api.RenderResources;
+import com.android.ide.common.rendering.api.ResourceReference;
 import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.ide.common.rendering.api.StyleResourceValue;
 import com.android.layout.remote.api.RemoteRenderResources;
@@ -154,9 +155,19 @@
     }
 
     @Override
-    public ResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
+    public ResourceValue dereference(ResourceValue resourceValue) {
         try {
-            return mDelegate.findResValue(reference, forceFrameworkOnly);
+            return mDelegate.dereference(resourceValue);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** Returns a resource by namespace, type and name. The returned resource is unresolved. */
+    @Override
+    public ResourceValue getUnresolvedResource(ResourceReference reference) {
+        try {
+            return mDelegate.getUnresolvedResource(reference);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }