Merge "Add overloads for protolayout types to TileRenderer" into androidx-main
diff --git a/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt
index 6ed80ec..00d0f71 100644
--- a/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt
+++ b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt
@@ -87,6 +87,7 @@
             .build()
         val layout = tile.timeline?.timelineEntries?.get(0)?.layout
 
+        @Suppress("DEPRECATION")
         if (layout != null) {
             val renderer = TileRenderer(
                 context,
diff --git a/glance/glance-wear-tiles/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/ScreenshotTests.kt b/glance/glance-wear-tiles/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/ScreenshotTests.kt
index 13e0b39..8f4be28 100644
--- a/glance/glance-wear-tiles/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/ScreenshotTests.kt
+++ b/glance/glance-wear-tiles/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/ScreenshotTests.kt
@@ -399,6 +399,7 @@
                 CompositionResult(errorUiLayout(), ResourceBuilders.Resources.Builder())
             }
 
+        @Suppress("DEPRECATION")
         val renderer = TileRenderer(
             context,
             LayoutElementBuilders.Layout.Builder().setRoot(translatedComposition.layout).build(),
@@ -407,6 +408,7 @@
         ) {}
 
         val frame = FrameLayout(getApplicationContext())
+        @Suppress("DEPRECATION")
         val firstChild = renderer.inflate(frame)
 
         requireNotNull(firstChild) {
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
index 3fd63b3..ecab954 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
@@ -33,11 +33,11 @@
 
 import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
-import androidx.wear.tiles.LayoutElementBuilders;
-import androidx.wear.tiles.LayoutElementBuilders.Layout;
-import androidx.wear.tiles.ResourceBuilders.AndroidImageResourceByResId;
-import androidx.wear.tiles.ResourceBuilders.ImageResource;
-import androidx.wear.tiles.ResourceBuilders.Resources;
+import androidx.wear.protolayout.LayoutElementBuilders;
+import androidx.wear.protolayout.LayoutElementBuilders.Layout;
+import androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId;
+import androidx.wear.protolayout.ResourceBuilders.ImageResource;
+import androidx.wear.protolayout.ResourceBuilders.Resources;
 import androidx.wear.tiles.material.R;
 import androidx.wear.protolayout.proto.LayoutElementProto.LayoutElement;
 import androidx.wear.tiles.renderer.TileRenderer;
@@ -62,7 +62,7 @@
         }
 
         LayoutElementBuilders.LayoutElement rootLayoutElement =
-                LayoutElementBuilders.LayoutElement.fromLayoutElementProto(layoutElementProto);
+                LayoutElementBuilders.layoutElementFromProto(layoutElementProto);
 
         Context appContext = getApplicationContext();
         FrameLayout root = new FrameLayout(appContext);
@@ -75,9 +75,9 @@
 
         Resources resources = generateResources();
         TileRenderer renderer =
-                new TileRenderer(appContext, layout, resources, mainExecutor, i -> {});
+                new TileRenderer(appContext, mainExecutor, i -> {});
 
-        View firstChild = renderer.inflate(root);
+        View firstChild = renderer.inflate(layout, resources, root);
 
         // Simulate what the thing outside the renderer should do. Center the contents.
         LayoutParams layoutParams = (LayoutParams) firstChild.getLayoutParams();
diff --git a/wear/tiles/tiles-renderer/api/current.txt b/wear/tiles/tiles-renderer/api/current.txt
index a162ceb..670ef3a 100644
--- a/wear/tiles/tiles-renderer/api/current.txt
+++ b/wear/tiles/tiles-renderer/api/current.txt
@@ -42,13 +42,15 @@
 package androidx.wear.tiles.renderer {
 
   public final class TileRenderer {
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    method public android.view.View? inflate(android.view.ViewGroup);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor public TileRenderer(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
+    method @Deprecated public android.view.View? inflate(android.view.ViewGroup);
+    method public android.view.View? inflate(androidx.wear.protolayout.LayoutElementBuilders.Layout, androidx.wear.protolayout.ResourceBuilders.Resources, android.view.ViewGroup);
   }
 
-  public static interface TileRenderer.LoadActionListener {
-    method public void onClick(androidx.wear.tiles.StateBuilders.State);
+  @Deprecated public static interface TileRenderer.LoadActionListener {
+    method @Deprecated public void onClick(androidx.wear.tiles.StateBuilders.State);
   }
 
 }
diff --git a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
index a162ceb..670ef3a 100644
--- a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
@@ -42,13 +42,15 @@
 package androidx.wear.tiles.renderer {
 
   public final class TileRenderer {
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    method public android.view.View? inflate(android.view.ViewGroup);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor public TileRenderer(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
+    method @Deprecated public android.view.View? inflate(android.view.ViewGroup);
+    method public android.view.View? inflate(androidx.wear.protolayout.LayoutElementBuilders.Layout, androidx.wear.protolayout.ResourceBuilders.Resources, android.view.ViewGroup);
   }
 
-  public static interface TileRenderer.LoadActionListener {
-    method public void onClick(androidx.wear.tiles.StateBuilders.State);
+  @Deprecated public static interface TileRenderer.LoadActionListener {
+    method @Deprecated public void onClick(androidx.wear.tiles.StateBuilders.State);
   }
 
 }
diff --git a/wear/tiles/tiles-renderer/api/restricted_current.txt b/wear/tiles/tiles-renderer/api/restricted_current.txt
index a162ceb..670ef3a 100644
--- a/wear/tiles/tiles-renderer/api/restricted_current.txt
+++ b/wear/tiles/tiles-renderer/api/restricted_current.txt
@@ -42,13 +42,15 @@
 package androidx.wear.tiles.renderer {
 
   public final class TileRenderer {
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    ctor public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
-    method public android.view.View? inflate(android.view.ViewGroup);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor @Deprecated public TileRenderer(android.content.Context, androidx.wear.tiles.LayoutElementBuilders.Layout, @StyleRes int, androidx.wear.tiles.ResourceBuilders.Resources, java.util.concurrent.Executor, androidx.wear.tiles.renderer.TileRenderer.LoadActionListener);
+    ctor public TileRenderer(android.content.Context, java.util.concurrent.Executor, java.util.function.Consumer<androidx.wear.protolayout.StateBuilders.State!>);
+    method @Deprecated public android.view.View? inflate(android.view.ViewGroup);
+    method public android.view.View? inflate(androidx.wear.protolayout.LayoutElementBuilders.Layout, androidx.wear.protolayout.ResourceBuilders.Resources, android.view.ViewGroup);
   }
 
-  public static interface TileRenderer.LoadActionListener {
-    method public void onClick(androidx.wear.tiles.StateBuilders.State);
+  @Deprecated public static interface TileRenderer.LoadActionListener {
+    method @Deprecated public void onClick(androidx.wear.tiles.StateBuilders.State);
   }
 
 }
diff --git a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
index 8b6ef65..8d16cea 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
+++ b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
@@ -30,8 +30,8 @@
 import androidx.test.filters.LargeTest;
 import androidx.test.screenshot.AndroidXScreenshotTestRule;
 import androidx.test.screenshot.matchers.MSSIMMatcher;
-import androidx.wear.tiles.LayoutElementBuilders;
-import androidx.wear.tiles.ResourceBuilders;
+import androidx.wear.protolayout.LayoutElementBuilders;
+import androidx.wear.protolayout.ResourceBuilders;
 import androidx.wear.protolayout.proto.LayoutElementProto.Layout;
 import androidx.wear.protolayout.proto.LayoutElementProto.LayoutElement;
 import androidx.wear.protolayout.proto.ResourceProto.AndroidImageResourceByResId;
@@ -236,13 +236,12 @@
         TileRenderer renderer =
                 new TileRenderer(
                         appContext,
-                        LayoutElementBuilders.Layout.fromProto(
-                                Layout.newBuilder().setRoot(rootElement).build()),
-                        ResourceBuilders.Resources.fromProto(generateResources()),
                         ContextCompat.getMainExecutor(getApplicationContext()),
                         i -> {});
 
-        View firstChild = renderer.inflate(mainFrame);
+        View firstChild = renderer.inflate(LayoutElementBuilders.Layout.fromProto(
+                Layout.newBuilder().setRoot(rootElement).build()),
+                ResourceBuilders.Resources.fromProto(generateResources()), mainFrame);
 
         if (firstChild == null) {
             throw new RuntimeException("Failed to inflate " + expectedKey);
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
index f814499..525dfcf6 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileUiClient.kt
@@ -31,10 +31,10 @@
 import androidx.concurrent.futures.await
 import androidx.core.content.ContextCompat
 import androidx.wear.tiles.DeviceParametersBuilders
-import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.protolayout.LayoutElementBuilders
+import androidx.wear.protolayout.ResourceBuilders
+import androidx.wear.protolayout.StateBuilders
 import androidx.wear.tiles.RequestBuilders
-import androidx.wear.tiles.ResourceBuilders
-import androidx.wear.tiles.StateBuilders
 import androidx.wear.tiles.TimelineBuilders
 import androidx.wear.tiles.checkers.TimelineChecker
 import androidx.wear.tiles.connection.DefaultTileClient
@@ -140,7 +140,7 @@
         withContext(Dispatchers.Main) {
             val tileRequest = RequestBuilders.TileRequest
                 .Builder()
-                .setState(state)
+                .setState(androidx.wear.tiles.StateBuilders.State.fromProto(state.toProto()))
                 .setDeviceParameters(buildDeviceParameters())
                 .build()
 
@@ -155,7 +155,9 @@
                     .setDeviceParameters(buildDeviceParameters())
                     .build()
 
-                tileResources = tilesConnection.requestResources(resourcesRequest).await()
+                tileResources = ResourceBuilders.Resources.fromProto(
+                    tilesConnection.requestResources(resourcesRequest).await().toProto()
+                )
             }
 
             timelineManager?.apply {
@@ -189,17 +191,19 @@
         }
     }
 
-    private fun updateContents(layout: LayoutElementBuilders.Layout) {
+    private fun updateContents(layout: androidx.wear.tiles.LayoutElementBuilders.Layout) {
         parentView.removeAllViews()
 
         val renderer = TileRenderer(
             context,
-            layout,
-            tileResources!!,
             ContextCompat.getMainExecutor(context),
             { state -> coroutineScope.launch { requestTile(state) } }
         )
-        renderer.inflate(parentView)?.apply {
+        renderer.inflate(
+            LayoutElementBuilders.Layout.fromProto(layout.toProto()),
+            tileResources!!,
+            parentView
+        )?.apply {
             (layoutParams as FrameLayout.LayoutParams).gravity = Gravity.CENTER
         }
     }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
index 0cc77dc..dec1ce9 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
@@ -26,13 +26,12 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 import androidx.wear.protolayout.LayoutElementBuilders;
+import androidx.wear.protolayout.ResourceBuilders;
+import androidx.wear.protolayout.StateBuilders;
 import androidx.wear.protolayout.expression.pipeline.ObservableStateStore;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 import androidx.wear.protolayout.proto.ResourceProto;
-import androidx.wear.protolayout.proto.StateProto;
 import androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance;
-import androidx.wear.tiles.ResourceBuilders;
-import androidx.wear.tiles.StateBuilders;
 import androidx.wear.tiles.TileService;
 
 import com.google.common.collect.ImmutableMap;
@@ -41,6 +40,7 @@
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
 
 /**
  * Renderer for Wear Tiles.
@@ -51,7 +51,11 @@
     /**
      * Listener for clicks on Clickable objects that have an Action to (re)load the contents of a
      * tile.
+     *
+     * @deprecated Use {@link Consumer<StateBuilders.State>} with {@link #TileRenderer(Context,
+     *     Executor, Consumer)}.
      */
+    @Deprecated
     public interface LoadActionListener {
 
         /**
@@ -59,12 +63,12 @@
          *
          * @param nextState The state that the next tile should be in.
          */
-        void onClick(@NonNull StateBuilders.State nextState);
+        void onClick(@NonNull androidx.wear.tiles.StateBuilders.State nextState);
     }
 
     @NonNull private final ProtoLayoutViewInstance mInstance;
-    @NonNull private final LayoutElementProto.Layout mLayout;
-    @NonNull private final ResourceProto.Resources mResources;
+    @Nullable private final LayoutElementProto.Layout mLayout;
+    @Nullable private final ResourceProto.Resources mResources;
     @NonNull private final ListeningExecutorService mUiExecutor;
 
     /**
@@ -73,8 +77,13 @@
      * @param uiContext A {@link Context} suitable for interacting with the UI.
      * @param layout The portion of the Tile to render.
      * @param resources The resources for the Tile.
+     * @param loadActionExecutor Executor for {@code loadActionListener}.
      * @param loadActionListener Listener for clicks that will cause the contents to be reloaded.
+     * @deprecated Use {@link #TileRenderer(Context, Executor, Consumer)} which accepts Layout and
+     *     Resources in {@link #inflate(LayoutElementBuilders.Layout, ResourceBuilders.Resources,
+     *     ViewGroup)} method.
      */
+    @Deprecated
     public TileRenderer(
             @NonNull Context uiContext,
             @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
@@ -83,11 +92,10 @@
             @NonNull LoadActionListener loadActionListener) {
         this(
                 uiContext,
-                layout,
-                /* tilesTheme= */ 0,
-                resources,
                 loadActionExecutor,
-                loadActionListener);
+                toStateConsumer(loadActionListener),
+                layout.toProto(),
+                resources.toProto());
     }
 
     /**
@@ -98,8 +106,13 @@
      * @param tilesTheme The theme to use for this Tile instance. This can be used to customise
      *     things like the default font family. Pass 0 to use the default theme.
      * @param resources The resources for the Tile.
+     * @param loadActionExecutor Executor for {@code loadActionListener}.
      * @param loadActionListener Listener for clicks that will cause the contents to be reloaded.
+     * @deprecated Use {@link #TileRenderer(Context, Executor, Consumer)} which accepts Layout and
+     *     Resources in {@link #inflate(LayoutElementBuilders.Layout, ResourceBuilders.Resources,
+     *     ViewGroup)} method.
      */
+    @Deprecated
     public TileRenderer(
             @NonNull Context uiContext,
             @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
@@ -107,16 +120,51 @@
             @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
-        this.mLayout = fromTileLayout(layout);
-        this.mResources = fromTileResources(resources);
+        // TODO(b/272527869): Enable setting theme.
+        this(
+                uiContext,
+                loadActionExecutor,
+                toStateConsumer(loadActionListener),
+                layout.toProto(),
+                resources.toProto());
+    }
+
+    /**
+     * @param uiContext A {@link Context} suitable for interacting with the UI.
+     * @param loadActionExecutor Executor for {@code loadActionListener}.
+     * @param loadActionListener Listener for clicks that will cause the contents to be reloaded.
+     */
+    public TileRenderer(
+            @NonNull Context uiContext,
+            @NonNull Executor loadActionExecutor,
+            @NonNull Consumer<StateBuilders.State> loadActionListener) {
+        this(
+                uiContext,
+                loadActionExecutor,
+                loadActionListener,
+                /* layout= */ null,
+                /* resources= */ null);
+    }
+
+    private TileRenderer(
+            @NonNull Context uiContext,
+            @NonNull Executor loadActionExecutor,
+            @NonNull Consumer<StateBuilders.State> loadActionListener,
+            @Nullable LayoutElementProto.Layout layout,
+            @Nullable ResourceProto.Resources resources) {
+        this.mLayout = layout;
+        this.mResources = resources;
         this.mUiExecutor = MoreExecutors.newDirectExecutorService();
         ProtoLayoutViewInstance.LoadActionListener instanceListener =
-                nextState -> loadActionExecutor.execute(
-                        () -> loadActionListener.onClick(fromProtoLayoutState(nextState)));
+                nextState ->
+                        loadActionExecutor.execute(
+                                () ->
+                                        loadActionListener.accept(
+                                                StateBuilders.State.fromProto(nextState)));
 
         ProtoLayoutViewInstance.Config.Builder config =
-                new ProtoLayoutViewInstance.Config.Builder(uiContext, mUiExecutor, mUiExecutor,
-                        TileService.EXTRA_CLICKABLE_ID)
+                new ProtoLayoutViewInstance.Config.Builder(
+                                uiContext, mUiExecutor, mUiExecutor, TileService.EXTRA_CLICKABLE_ID)
                         .setAnimationEnabled(true)
                         .setIsViewFullyVisible(true)
                         .setStateStore(new ObservableStateStore(ImmutableMap.of()))
@@ -124,35 +172,61 @@
         this.mInstance = new ProtoLayoutViewInstance(config.build());
     }
 
-    @NonNull private ResourceProto.Resources fromTileResources(
-            @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources) {
-        return checkNotNull(
-                ResourceBuilders.Resources
-                        .fromByteArray(resources.toByteArray())).toProto();
-    }
-
-    @NonNull private LayoutElementProto.Layout fromTileLayout(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout) {
-        return checkNotNull(
-                LayoutElementBuilders.Layout
-                        .fromByteArray(layout.toByteArray())).toProto();
-    }
-
-    @NonNull StateBuilders.State fromProtoLayoutState(@NonNull StateProto.State state) {
-        return StateBuilders.State.fromProto(state);
+    @NonNull
+    private static Consumer<StateBuilders.State> toStateConsumer(
+            @NonNull LoadActionListener loadActionListener) {
+        return nextState ->
+                loadActionListener.onClick(
+                        androidx.wear.tiles.StateBuilders.State.fromProto(nextState.toProto()));
     }
 
     /**
      * Inflates a Tile into {@code parent}.
      *
      * @param parent The view to attach the tile into.
-     * @return The first child that was inflated. This may be null if the proto is empty the
+     * @return The first child that was inflated. This may be null if the Layout is empty or the
+     *     top-level LayoutElement has no inner set, or the top-level LayoutElement contains an
+     *     unsupported inner type.
+     * @deprecated Use {@link #inflate(LayoutElementBuilders.Layout, ResourceBuilders.Resources,
+     *     ViewGroup)} instead. Note: This method only works with the deprecated constructors that
+     *     accept Layout and Resources.
+     */
+    @Deprecated
+    @Nullable
+    public View inflate(@NonNull ViewGroup parent) {
+        String errorMessage =
+                "This method only works with the deprecated constructors that accept Layout and"
+                    + " Resources.";
+        return inflateLayout(
+                checkNotNull(mLayout, errorMessage),
+                checkNotNull(mResources, errorMessage),
+                parent);
+    }
+
+    /**
+     * Inflates a Tile into {@code parent}.
+     *
+     * @param layout The portion of the Tile to render.
+     * @param resources The resources for the Tile.
+     * @param parent The view to attach the tile into.
+     * @return The first child that was inflated. This may be null if the Layout is empty or the
      *     top-level LayoutElement has no inner set, or the top-level LayoutElement contains an
      *     unsupported inner type.
      */
     @Nullable
-    public View inflate(@NonNull ViewGroup parent) {
-        mInstance.renderAndAttach(mLayout, mResources, parent);
+    public View inflate(
+            @NonNull LayoutElementBuilders.Layout layout,
+            @NonNull ResourceBuilders.Resources resources,
+            @NonNull ViewGroup parent) {
+        return inflateLayout(layout.toProto(), resources.toProto(), parent);
+    }
+
+    @Nullable
+    private View inflateLayout(
+            @NonNull LayoutElementProto.Layout layout,
+            @NonNull ResourceProto.Resources resources,
+            @NonNull ViewGroup parent) {
+        mInstance.renderAndAttach(layout, resources, parent);
         boolean finished;
         try {
             mUiExecutor.shutdown();
diff --git a/wear/tiles/tiles-tooling/build.gradle b/wear/tiles/tiles-tooling/build.gradle
index 90cf6f0..85252f5 100644
--- a/wear/tiles/tiles-tooling/build.gradle
+++ b/wear/tiles/tiles-tooling/build.gradle
@@ -8,6 +8,7 @@
 }
 
 dependencies {
+    implementation(project(":wear:protolayout:protolayout-proto"))
     implementation(project(":wear:tiles:tiles"))
     implementation(project(":wear:tiles:tiles-renderer"))
 
diff --git a/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt b/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt
index 9ec2000..20202d9 100644
--- a/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt
+++ b/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt
@@ -22,10 +22,10 @@
 import android.view.Gravity
 import android.widget.FrameLayout
 import androidx.core.content.ContextCompat
+import androidx.wear.protolayout.LayoutElementBuilders
+import androidx.wear.protolayout.ResourceBuilders
 import androidx.wear.tiles.DeviceParametersBuilders
-import androidx.wear.tiles.LayoutElementBuilders
 import androidx.wear.tiles.RequestBuilders
-import androidx.wear.tiles.ResourceBuilders
 import androidx.wear.tiles.StateBuilders
 import androidx.wear.tiles.TileBuilders
 import androidx.wear.tiles.TileService
@@ -118,18 +118,19 @@
                 .findMethod("onResourcesRequest", RequestBuilders.ResourcesRequest::class.java)
                 .apply { isAccessible = true }
         val resources =
-            (onResourcesRequestMethod.invoke(tileService, resourceRequest) as
-                ListenableFuture<ResourceBuilders.Resources>).get(1, TimeUnit.SECONDS)
+            ResourceBuilders.Resources.fromProto(
+                (onResourcesRequestMethod.invoke(tileService, resourceRequest) as
+                    ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>)
+                    .get(1, TimeUnit.SECONDS).toProto()
+            )
 
         val layout = tile.timeline?.getCurrentLayout()
         if (layout != null) {
             val renderer = TileRenderer(
                 context,
-                layout,
-                resources,
                 ContextCompat.getMainExecutor(context)
             ) { }
-            renderer.inflate(this)?.apply {
+            renderer.inflate(layout, resources, this)?.apply {
                 (layoutParams as FrameLayout.LayoutParams).gravity = Gravity.CENTER
             }
         }
@@ -141,7 +142,9 @@
     return this?.let {
         val cache = TilesTimelineCache(it)
         cache.findTimelineEntryForTime(now) ?: cache.findClosestTimelineEntry(now)
-    }?.layout
+    }?.layout?.let {
+        LayoutElementBuilders.Layout.fromProto(it.toProto())
+    }
 }
 
 /**