Added Calendar Tile Sample

Relnote: n/a
Test: build and install this sample demo on emulator or watch
Change-Id: I7308616b57fbcdd8001da8e9bc422e4b68b5cb0d
diff --git a/glance/glance-wear-tiles/integration-tests/demos/build.gradle b/glance/glance-wear-tiles/integration-tests/demos/build.gradle
index 82afead..e5d36ea 100644
--- a/glance/glance-wear-tiles/integration-tests/demos/build.gradle
+++ b/glance/glance-wear-tiles/integration-tests/demos/build.gradle
@@ -29,6 +29,8 @@
     implementation(project(":glance:glance-wear-tiles"))
     implementation("androidx.activity:activity:1.4.0")
     implementation("androidx.wear.tiles:tiles-renderer:1.0.0")
+    implementation("androidx.viewpager2:viewpager2:1.0.0")
+    implementation("androidx.wear:wear:1.2.0")
 }
 
 android {
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/AndroidManifest.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/AndroidManifest.xml
index 82ac932..e599715 100644
--- a/glance/glance-wear-tiles/integration-tests/demos/src/main/AndroidManifest.xml
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/AndroidManifest.xml
@@ -24,13 +24,13 @@
     <application
         android:allowBackup="false"
         android:icon="@mipmap/ic_launcher"
-        android:label="Glance Wear Tiles Demos"
+        android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true">
 
         <activity
             android:name="androidx.glance.wear.tiles.demos.TilePreviewActivity"
-            android:label="Tile preview"
+            android:label="@string/tiles_preview_name"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -38,16 +38,31 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name="androidx.glance.wear.tiles.demos.CalendarActivity"
+            android:exported="true"
+            android:label="@string/calendar_activity_name" />
+
         <service
             android:name="androidx.glance.wear.tiles.demos.HelloTileService"
-            android:description="@string/app_name"
+            android:description="@string/hello_tile_name"
             android:exported="true"
-            android:label="@string/app_name"
-            android:permission="com.android.wearable.permission.BIND_TILE_PROVIDER">
+            android:label="@string/hello_tile_name"
+            android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">
             <intent-filter>
                 <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" />
             </intent-filter>
+        </service>
 
+        <service
+            android:name="androidx.glance.wear.tiles.demos.CalendarTileService"
+            android:description="@string/calendar_tile_name"
+            android:exported="true"
+            android:label="@string/calendar_tile_name"
+            android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">
+            <intent-filter>
+                <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" />
+            </intent-filter>
         </service>
     </application>
 </manifest>
\ No newline at end of file
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarActivity.kt b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarActivity.kt
new file mode 100644
index 0000000..54fe5bc
--- /dev/null
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarActivity.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.glance.wear.tiles.demos
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.wear.widget.SwipeDismissFrameLayout
+
+class CalendarActivity : Activity() {
+    override fun onCreate(savedInstanceBundle: Bundle?) {
+        super.onCreate(savedInstanceBundle)
+        setContentView(R.layout.activity_calendar)
+
+        val frame = findViewById<SwipeDismissFrameLayout>(R.id.frame)
+        frame.addCallback(
+            object : SwipeDismissFrameLayout.Callback() {
+                override fun onDismissed(layout: SwipeDismissFrameLayout) {
+                    finish()
+                }
+            }
+        )
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarTileService.kt b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarTileService.kt
new file mode 100644
index 0000000..f178143
--- /dev/null
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/CalendarTileService.kt
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.glance.wear.tiles.demos
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.glance.GlanceModifier
+import androidx.glance.Image
+import androidx.glance.ImageProvider
+import androidx.glance.action.actionStartActivity
+import androidx.glance.action.clickable
+import androidx.glance.layout.Alignment
+import androidx.glance.layout.Column
+import androidx.glance.layout.ContentScale
+import androidx.glance.layout.Spacer
+import androidx.glance.layout.height
+import androidx.glance.layout.size
+import androidx.glance.text.FontWeight
+import androidx.glance.text.Text
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.ColorProvider
+import androidx.glance.wear.tiles.GlanceTileService
+import androidx.glance.wear.tiles.LocalTimeInterval
+import androidx.glance.wear.tiles.TimeInterval
+import androidx.glance.wear.tiles.TimelineMode
+import java.time.Instant
+
+class CalendarTileService : GlanceTileService() {
+    private val timeInstant = Instant.now()
+    override val timelineMode = TimelineMode.TimeBoundEntries(
+       setOf(
+           TimeInterval(),
+           TimeInterval(
+               timeInstant,
+               timeInstant.plusSeconds(60)
+           ),
+           TimeInterval(
+               timeInstant.plusSeconds(60),
+               timeInstant.plusSeconds(120)
+           )
+       )
+    )
+
+    @Composable
+    override fun Content() {
+        val eventTextStyle = TextStyle(
+            fontWeight = FontWeight.Bold,
+            fontSize = 20.sp
+        )
+        val locationTextStyle = TextStyle(
+            color = ColorProvider(Color.Gray),
+            fontSize = 15.sp
+        )
+        Column(
+            horizontalAlignment = Alignment.CenterHorizontally
+        ) {
+            when (LocalTimeInterval.current) {
+                timelineMode.timeIntervals.elementAt(0) -> {
+                    Text(text = "No event", style = eventTextStyle)
+                }
+                timelineMode.timeIntervals.elementAt(1) -> {
+                    Text(text = "Coffee", style = eventTextStyle)
+                    Spacer(GlanceModifier.height(5.dp))
+                    Text(text = "Micro Kitchen", style = locationTextStyle)
+                }
+                timelineMode.timeIntervals.elementAt(2) -> {
+                    Text(text = "Work", style = eventTextStyle)
+                    Spacer(GlanceModifier.height(5.dp))
+                    Text(text = "Remote from home", style = locationTextStyle)
+                }
+            }
+
+            Spacer(GlanceModifier.height(15.dp))
+
+            Image(
+                provider = ImageProvider(R.drawable.ic_calendar),
+                modifier = GlanceModifier
+                    .size(24.dp)
+                    .clickable(actionStartActivity(CalendarActivity::class.java)),
+                contentScale = ContentScale.Fit,
+                contentDescription = "launch calendar activity"
+
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/TilePreviewActivity.kt b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/TilePreviewActivity.kt
index 534e564..bb318db 100644
--- a/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/TilePreviewActivity.kt
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/java/androidx/glance/wear/tiles/demos/TilePreviewActivity.kt
@@ -17,25 +17,45 @@
 package androidx.glance.wear.tiles.demos
 
 import android.content.ComponentName
+import android.content.Context
 import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
 import android.widget.FrameLayout
-import androidx.activity.ComponentActivity
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
 import androidx.wear.tiles.manager.TileUiClient
+import androidx.viewpager2.widget.ViewPager2
+import androidx.viewpager2.adapter.FragmentStateAdapter
 
-class TilePreviewActivity : ComponentActivity() {
+private const val NUM_PAGES = 2
+private val TILE_PROVIDERS_NAME = arrayOf(
+    HelloTileService::class.java,
+    CalendarTileService::class.java
+)
+
+class TilePageFragment(
+    private val activityContext: Context,
+    private val position: Int
+) : Fragment() {
     lateinit var tileUiClient: TileUiClient
 
-    override fun onCreate(savedInstanceBunde: Bundle?) {
-        super.onCreate(savedInstanceBunde)
-        setContentView(R.layout.activity_main)
-        val rootLayout = findViewById<FrameLayout>(R.id.tile_container)
+    override fun onCreateView(
+        inflator: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceBundle: Bundle?
+    ): View = inflator.inflate(R.layout.fragment_page, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        val rootLayout = requireView().findViewById<FrameLayout>(R.id.tile_container)
 
         tileUiClient = TileUiClient(
-            context = this,
-            component = ComponentName(this, HelloTileService::class.java),
+            context = activityContext,
+            component = ComponentName(activityContext, TILE_PROVIDERS_NAME[position]),
             parentView = rootLayout
         )
-
         tileUiClient.connect()
     }
 
@@ -43,4 +63,25 @@
         super.onDestroy()
         tileUiClient.close()
     }
+}
+
+class TilePreviewActivity : FragmentActivity() {
+
+    private lateinit var viewPager: ViewPager2
+
+    override fun onCreate(savedInstanceBundle: Bundle?) {
+        super.onCreate(savedInstanceBundle)
+        setContentView(R.layout.activity_main)
+        viewPager = findViewById(R.id.carousel)
+
+        val pagerAdapter = TilePagerAdaptor(this)
+        viewPager.adapter = pagerAdapter
+    }
+
+    private inner class TilePagerAdaptor(
+        private val fa: FragmentActivity
+    ) : FragmentStateAdapter(fa) {
+        override fun getItemCount(): Int = NUM_PAGES
+        override fun createFragment(position: Int): Fragment = TilePageFragment(fa, position)
+    }
 }
\ No newline at end of file
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/drawable/ic_calendar.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/drawable/ic_calendar.xml
new file mode 100644
index 0000000..5743926
--- /dev/null
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/drawable/ic_calendar.xml
@@ -0,0 +1,24 @@
+<!--
+  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.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M17,12h-5v5h5v-5zM16,1v2H8V1H6v2H5c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-1V1h-2zm3,18H5V8h14v11z"/>
+</vector>
\ No newline at end of file
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_calendar.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_calendar.xml
new file mode 100644
index 0000000..1c30f7c
--- /dev/null
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_calendar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2021 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.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<androidx.wear.widget.SwipeDismissFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/frame"
+    android:gravity="center"
+>
+    <TextView
+        android:id="@+id/calendar"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="@color/black"
+        android:layout_gravity="center"
+        android:text="Calendar Activity"/>
+</androidx.wear.widget.SwipeDismissFrameLayout>
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_main.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_main.xml
index d520bfe..0bf9557 100644
--- a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_main.xml
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/activity_main.xml
@@ -14,9 +14,11 @@
   limitations under the License.
   -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.viewpager2.widget.ViewPager2
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/black"
-    android:id="@+id/tile_container">
-</FrameLayout>
+    android:id="@+id/carousel"
+    android:translationZ="-1px"
+/>
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/fragment_page.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/fragment_page.xml
new file mode 100644
index 0000000..d520bfe
--- /dev/null
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/layout/fragment_page.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2021 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.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/black"
+    android:id="@+id/tile_container">
+</FrameLayout>
diff --git a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/values/strings.xml b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/values/strings.xml
index b4645ad..4185180 100644
--- a/glance/glance-wear-tiles/integration-tests/demos/src/main/res/values/strings.xml
+++ b/glance/glance-wear-tiles/integration-tests/demos/src/main/res/values/strings.xml
@@ -1,3 +1,7 @@
 <resources>
-    <string name="app_name">demos</string>
+    <string name="app_name">Glance Wear Tiles Demo</string>
+    <string name="hello_tile_name">Hello Tile</string>
+    <string name="calendar_tile_name">Calendar Tile</string>
+    <string name="tiles_preview_name">Tiles Preview</string>
+    <string name="calendar_activity_name">Calendar Activity</string>
 </resources>
\ No newline at end of file