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