Merge "Update Resource Builders." into androidx-main
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
index 17e5741..71b74da 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 The Android Open Source Project
+ * Copyright 2022 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,28 +25,46 @@
 public final class EventBuilders {
     private EventBuilders() {}
 
-    /** Event fired when a tile has been added to the carousel. */
+    /**
+     * Event fired when a tile has been added to the carousel.
+     *
+     * @since 1.0
+     */
     public static final class TileAddEvent {
         private final EventProto.TileAddEvent mImpl;
 
-        private TileAddEvent(EventProto.TileAddEvent impl) {
+        TileAddEvent(EventProto.TileAddEvent impl) {
             this.mImpl = impl;
         }
 
-        /** @hide */
+        /**
+         * Creates a new wrapper instance from the proto.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public static TileAddEvent fromProto(@NonNull EventProto.TileAddEvent proto) {
             return new TileAddEvent(proto);
         }
 
-        /** @hide */
+        /**
+         * Returns the internal proto instance.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public EventProto.TileAddEvent toProto() {
             return mImpl;
         }
 
+        @Override
+        @NonNull
+        public String toString() {
+            return "TileAddEvent{" + "}";
+        }
+
         /** Builder for {@link TileAddEvent} */
         public static final class Builder {
             private final EventProto.TileAddEvent.Builder mImpl =
@@ -62,28 +80,46 @@
         }
     }
 
-    /** Event fired when a tile has been removed from the carousel. */
+    /**
+     * Event fired when a tile has been removed from the carousel.
+     *
+     * @since 1.0
+     */
     public static final class TileRemoveEvent {
         private final EventProto.TileRemoveEvent mImpl;
 
-        private TileRemoveEvent(EventProto.TileRemoveEvent impl) {
+        TileRemoveEvent(EventProto.TileRemoveEvent impl) {
             this.mImpl = impl;
         }
 
-        /** @hide */
+        /**
+         * Creates a new wrapper instance from the proto.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public static TileRemoveEvent fromProto(@NonNull EventProto.TileRemoveEvent proto) {
             return new TileRemoveEvent(proto);
         }
 
-        /** @hide */
+        /**
+         * Returns the internal proto instance.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public EventProto.TileRemoveEvent toProto() {
             return mImpl;
         }
 
+        @Override
+        @NonNull
+        public String toString() {
+            return "TileRemoveEvent{" + "}";
+        }
+
         /** Builder for {@link TileRemoveEvent} */
         public static final class Builder {
             private final EventProto.TileRemoveEvent.Builder mImpl =
@@ -99,28 +135,46 @@
         }
     }
 
-    /** Event fired when a tile is swiped to by the user (i.e. it's visible on screen). */
+    /**
+     * Event fired when a tile is swiped to by the user (i.e. it's visible on screen).
+     *
+     * @since 1.0
+     */
     public static final class TileEnterEvent {
         private final EventProto.TileEnterEvent mImpl;
 
-        private TileEnterEvent(EventProto.TileEnterEvent impl) {
+        TileEnterEvent(EventProto.TileEnterEvent impl) {
             this.mImpl = impl;
         }
 
-        /** @hide */
+        /**
+         * Creates a new wrapper instance from the proto.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public static TileEnterEvent fromProto(@NonNull EventProto.TileEnterEvent proto) {
             return new TileEnterEvent(proto);
         }
 
-        /** @hide */
+        /**
+         * Returns the internal proto instance.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public EventProto.TileEnterEvent toProto() {
             return mImpl;
         }
 
+        @Override
+        @NonNull
+        public String toString() {
+            return "TileEnterEvent{" + "}";
+        }
+
         /** Builder for {@link TileEnterEvent} */
         public static final class Builder {
             private final EventProto.TileEnterEvent.Builder mImpl =
@@ -139,28 +193,44 @@
     /**
      * Event fired when a tile is swiped away from by the user (i.e. it's no longer visible on
      * screen).
+     *
+     * @since 1.0
      */
     public static final class TileLeaveEvent {
         private final EventProto.TileLeaveEvent mImpl;
 
-        private TileLeaveEvent(EventProto.TileLeaveEvent impl) {
+        TileLeaveEvent(EventProto.TileLeaveEvent impl) {
             this.mImpl = impl;
         }
 
-        /** @hide */
+        /**
+         * Creates a new wrapper instance from the proto.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public static TileLeaveEvent fromProto(@NonNull EventProto.TileLeaveEvent proto) {
             return new TileLeaveEvent(proto);
         }
 
-        /** @hide */
+        /**
+         * Returns the internal proto instance.
+         *
+         * @hide
+         */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
         public EventProto.TileLeaveEvent toProto() {
             return mImpl;
         }
 
+        @Override
+        @NonNull
+        public String toString() {
+            return "TileLeaveEvent{" + "}";
+        }
+
         /** Builder for {@link TileLeaveEvent} */
         public static final class Builder {
             private final EventProto.TileLeaveEvent.Builder mImpl =
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
index feef838..f296d5b 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a tile service.
+ * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a Tile Service.
  *
  * <p>All this does is to serialize TileAddEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
index 4dae195..fda2841 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a tile service.
+ * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a Tile Service.
  *
  * <p>All this does is to serialize TileEnterEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
index 921a74b..9bccf59 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a tile service.
+ * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a Tile Service.
  *
  * <p>All this does is to serialize TileRemoveEvent as a protobuf and transmit it.
  *
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index a2ab862..c6c602b 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -592,8 +592,30 @@
         previewScreenshotParams: PreviewScreenshotParams? = null
     ): ActivityScenario<OnWatchFaceEditingTestActivity> {
         val userStyleRepository = CurrentUserStyleRepository(UserStyleSchema(userStyleSettings))
+        val mockSurfaceHolder = `mock`(SurfaceHolder::class.java)
+        `when`(mockSurfaceHolder.surfaceFrame).thenReturn(screenBounds)
+        @Suppress("Deprecation")
+        val fakeRenderer = object : Renderer.CanvasRenderer(
+            mockSurfaceHolder,
+            userStyleRepository,
+            MutableWatchState().asWatchState(),
+            CanvasType.HARDWARE,
+            interactiveDrawModeUpdateDelayMillis = 16,
+            clearWithBackgroundTintBeforeRenderingHighlightLayer = false
+        ) {
+            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+            }
+
+            override fun renderHighlightLayer(
+                canvas: Canvas,
+                bounds: Rect,
+                zonedDateTime: ZonedDateTime
+            ) {
+            }
+        }
+
         val complicationSlotsManager =
-            ComplicationSlotsManager(complicationSlots, userStyleRepository)
+            ComplicationSlotsManager(complicationSlots, userStyleRepository, fakeRenderer)
         complicationSlotsManager.watchState = placeholderWatchState
         complicationSlotsManager.listenForStyleChanges(CoroutineScope(Dispatchers.Main.immediate))
 
diff --git a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index 5e52e91..53832df 100644
--- a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -632,21 +632,6 @@
             ?.key
     }
 
-    override fun getComplicationSlotIdAt(@Px x: Int, @Px y: Int): Int? {
-        requireNotClosed()
-        return complicationSlotsState.value.entries
-            .firstOrNull {
-                it.value.isEnabled &&
-                    when (it.value.boundsType) {
-                        ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
-                        ComplicationSlotBoundsType.BACKGROUND -> false
-                        ComplicationSlotBoundsType.EDGE -> false
-                        else -> false
-                    }
-            }
-            ?.key
-    }
-
     /**
      * Returns the complication data source's preview [ComplicationData] if possible or fallback
      * preview data based on complication data source icon and name if not. If the slot is
@@ -1041,6 +1026,11 @@
 
     override val showComplicationRationaleDialogIntent
         get() = editorDelegate.complicationRationaleDialogIntent
+
+    override fun getComplicationSlotIdAt(@Px x: Int, @Px y: Int): Int? {
+        requireNotClosed()
+        return editorDelegate.complicationSlotsManager.getComplicationSlotAt(x, y)?.id
+    }
 }
 
 @RequiresApi(27)
@@ -1130,6 +1120,21 @@
     init {
         fetchComplicationsData(coroutineScope)
     }
+
+    override fun getComplicationSlotIdAt(@Px x: Int, @Px y: Int): Int? {
+        requireNotClosed()
+        return complicationSlotsState.value.entries
+            .firstOrNull {
+                it.value.isEnabled &&
+                    when (it.value.boundsType) {
+                        ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
+                        ComplicationSlotBoundsType.BACKGROUND -> false
+                        ComplicationSlotBoundsType.EDGE -> false
+                        else -> false
+                    }
+            }
+            ?.key
+    }
 }
 
 internal class ComplicationDataSourceChooserRequest(
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
index ea17261..bd4843b 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
@@ -133,8 +133,10 @@
     public var configExtrasChangeCallback: WatchFace.ComplicationSlotConfigExtrasChangeCallback? =
         null
 
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @VisibleForTesting
-    internal constructor(
+    public constructor(
         complicationSlotCollection: Collection<ComplicationSlot>,
         currentUserStyleRepository: CurrentUserStyleRepository,
         renderer: Renderer