@@ -21,7 +21,12 @@ import android.content.Context
2121import androidx.annotation.RequiresPermission
2222import androidx.wear.protolayout.ColorBuilders.argb
2323import androidx.wear.protolayout.DimensionBuilders
24+ import androidx.wear.protolayout.DimensionBuilders.degrees
25+ import androidx.wear.protolayout.DimensionBuilders.dp
2426import androidx.wear.protolayout.LayoutElementBuilders
27+ import androidx.wear.protolayout.LayoutElementBuilders.Arc
28+ import androidx.wear.protolayout.LayoutElementBuilders.ArcLine
29+ import androidx.wear.protolayout.LayoutElementBuilders.DashedArcLine
2530import androidx.wear.protolayout.ResourceBuilders.Resources
2631import androidx.wear.protolayout.TimelineBuilders
2732import androidx.wear.protolayout.TimelineBuilders.Timeline
@@ -30,6 +35,8 @@ import androidx.wear.protolayout.expression.DynamicBuilders
3035import androidx.wear.protolayout.expression.PlatformHealthSources
3136import androidx.wear.protolayout.material.Text
3237import androidx.wear.protolayout.material.Typography
38+ import androidx.wear.protolayout.material3.materialScope
39+ import androidx.wear.protolayout.material3.primaryLayout
3340import androidx.wear.tiles.RequestBuilders
3441import androidx.wear.tiles.RequestBuilders.ResourcesRequest
3542import androidx.wear.tiles.TileBuilders.Tile
@@ -200,3 +207,44 @@ class DynamicHeartRate : TileService() {
200207 )
201208 // [END android_wear_tile_dynamic_heart_rate]
202209}
210+
211+ class FeatureFallback : TileService () {
212+ override fun onTileRequest (requestParams : RequestBuilders .TileRequest ): ListenableFuture <Tile > {
213+
214+ // [START android_wear_tile_version_fallback]
215+ val rendererVersion = requestParams.deviceConfiguration.rendererSchemaVersion
216+
217+ val arcElement =
218+ // DashedArcLine has the annotation @RequiresSchemaVersion(major = 1, minor = 500)
219+ // and so is supported by renderer versions 1.500 and greater
220+ if (
221+ rendererVersion.major > 1 ||
222+ (rendererVersion.major == 1 && rendererVersion.minor >= 500 )
223+ ) {
224+ // Use DashedArcLine if the renderer supports it …
225+ DashedArcLine .Builder ()
226+ .setLength(degrees(270f ))
227+ .setThickness(8f )
228+ .setLinePattern(
229+ LayoutElementBuilders .DashedLinePattern .Builder ()
230+ .setGapSize(8f )
231+ .setGapInterval(10f )
232+ .build()
233+ )
234+ .build()
235+ } else {
236+ // … otherwise use ArcLine.
237+ ArcLine .Builder ().setLength(degrees(270f )).setThickness(dp(8f )).build()
238+ }
239+ // [END android_wear_tile_version_fallback]
240+
241+ val layout =
242+ materialScope(this , requestParams.deviceConfiguration) {
243+ primaryLayout(mainSlot = { Arc .Builder ().addContent(arcElement).build() })
244+ }
245+
246+ return Futures .immediateFuture(
247+ Tile .Builder ().setTileTimeline(Timeline .fromLayoutElement(layout)).build()
248+ )
249+ }
250+ }
0 commit comments