1+ /* 
2+  * Copyright 2025 The Android Open Source Project 
3+  * 
4+  * Licensed under the Apache License, Version 2.0 (the "License"); 
5+  * you may not use this file except in compliance with the License. 
6+  * You may obtain a copy of the License at 
7+  * 
8+  *     https://www.apache.org/licenses/LICENSE-2.0 
9+  * 
10+  * Unless required by applicable law or agreed to in writing, software 
11+  * distributed under the License is distributed on an "AS IS" BASIS, 
12+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
13+  * See the License for the specific language governing permissions and 
14+  * limitations under the License. 
15+  */  
16+ package  com.example.wear.snippets.complication 
17+ 
18+ import  androidx.wear.watchface.complications.data.ComplicationData 
19+ import  androidx.wear.watchface.complications.data.ComplicationType 
20+ import  androidx.wear.watchface.complications.data.NoDataComplicationData 
21+ import  androidx.wear.watchface.complications.data.PlainComplicationText 
22+ import  androidx.wear.watchface.complications.data.ShortTextComplicationData 
23+ import  androidx.wear.watchface.complications.datasource.ComplicationDataTimeline 
24+ import  androidx.wear.watchface.complications.datasource.ComplicationRequest 
25+ import  androidx.wear.watchface.complications.datasource.SuspendingTimelineComplicationDataSourceService 
26+ import  androidx.wear.watchface.complications.datasource.TimeInterval 
27+ import  androidx.wear.watchface.complications.datasource.TimelineEntry 
28+ import  java.time.Instant 
29+ import  java.time.temporal.ChronoUnit 
30+ 
31+ data class  CalendarEntry (
32+     val  start :  Instant ,
33+     val  end :  Instant ,
34+     val  name :  String 
35+ )
36+ 
37+ //  [START android_wear_timeline_complication]
38+ class  MyTimelineComplicationDataSourceService  : SuspendingTimelineComplicationDataSourceService () {
39+     override  suspend  fun  onComplicationRequest (request :  ComplicationRequest ): ComplicationDataTimeline ?  {
40+         if  (request.complicationType !=  ComplicationType .SHORT_TEXT ) {
41+             return  ComplicationDataTimeline (
42+                 defaultComplicationData =  NoDataComplicationData (),
43+                 timelineEntries =  emptyList()
44+             )
45+         }
46+         //  Retrieve list of events from your own datasource / database.
47+         val  events =  getCalendarEvents()
48+         return  ComplicationDataTimeline (
49+             defaultComplicationData =  shortTextComplicationData(" No event" 
50+             timelineEntries =  events.map {
51+                 TimelineEntry (
52+                     validity =  TimeInterval (it.start, it.end),
53+                     complicationData =  shortTextComplicationData(it.name)
54+                 )
55+             }
56+         )
57+     }
58+ 
59+     override  fun  getPreviewData (type :  ComplicationType ): ComplicationData ?  {
60+         return  shortTextComplicationData(" Event 1" 
61+     }
62+ 
63+     private  fun  shortTextComplicationData (text :  String ) = 
64+         ShortTextComplicationData .Builder (
65+             text =  PlainComplicationText .Builder (text).build(),
66+             contentDescription =  PlainComplicationText .Builder (text).build()
67+         )
68+             //  Add further optional details here such as icon, tap action, title etc
69+             .build()
70+ 
71+     //  [START_EXCLUDE]
72+     private  fun  getCalendarEvents (): List <CalendarEntry > {
73+         val  now =  Instant .now()
74+         return  listOf (
75+             CalendarEntry (now, now.plus(1 , ChronoUnit .HOURS ), " Event 1" 
76+             CalendarEntry (now.plus(2 , ChronoUnit .HOURS ), now.plus(3 , ChronoUnit .HOURS ), " Event 2" 
77+             CalendarEntry (now.plus(4 , ChronoUnit .HOURS ), now.plus(5 , ChronoUnit .HOURS ), " Event 3" 
78+         )
79+     }
80+     //  [END_EXCLUDE]
81+ }
82+ //  [END android_wear_timeline_complication]
0 commit comments