Код: Выделить всё
class ComingEventComplication : SuspendingComplicationDataSourceService() {
override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
val nextEvent = getNextCalendarEvents(this.contentResolver)[0]
return if (nextEvent != null) {
//Expose data to the complication
} else {
//Show a placeholder
}
}
//Preview data
override fun getPreviewData(type: ComplicationType): ComplicationData? {
[...]
}
}
< /code>
Я не показываю код, чтобы разоблачить данные, чтобы сделать его короче (но это работает). Функция getNextCalendARevents () Код: Выделить всё
fun getNextCalendarEvents(contentResolver: ContentResolver): List {
val events = mutableListOf()
// Define the projection (columns you want to retrieve)
val projection = arrayOf(
CalendarContract.Instances.EVENT_ID,
CalendarContract.Instances.TITLE,
CalendarContract.Instances.DESCRIPTION,
CalendarContract.Instances.EVENT_LOCATION,
CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END,
CalendarContract.Instances.ALL_DAY
)
val startMillis = System.currentTimeMillis()
val endMillis = startMillis + TimeUnit.DAYS.toMillis(5)
val uriBuilder = WearableCalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(uriBuilder, startMillis)
ContentUris.appendId(uriBuilder, endMillis)
val uri = uriBuilder.build()
// Query the Content Provider
val cursor = contentResolver.query(
uri,
projection,
null,
null,
null
)
cursor?.use {
while (it.moveToNext()) {
val eventId = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.EVENT_ID))
val title = it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.TITLE))
val description =
it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.DESCRIPTION))
val location =
it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.EVENT_LOCATION))
val beginTime = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.BEGIN))
val endTime = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.END))
val isAllDay =
it.getInt(it.getColumnIndexOrThrow(CalendarContract.Instances.ALL_DAY)) == 1
events.add(
CalendarEvent(
id = eventId,
title = title,
description = description,
location = location,
startTime = Instant.ofEpochMilli(beginTime),
endTime = Instant.ofEpochMilli(endTime),
isAllDay = isAllDay
)
)
}
}
return events.sortedBy { it.startTime }
}
< /code>
С помощью моего пользовательского класса данных: < /p>
data class CalendarEvent(
val title: String,
val startTime: Instant,
val endTime: Instant,
val isAllDay: Boolean,
val description: String?,
val location: String?,
val id: Long
)
Код: Выделить всё
< /code>
Эта часть работает, как и ожидалось: я добавляю осложнение и показывает имя следующего события в моем календаре. Проблема возникает, когда я меняю следующее событие в своем календаре на своем телефоне. Встроенные обновления осложнений, но не мои (я должен снова его заново добавить). До сих пор я пытался добавить workmanager Код: Выделить всё
class ContentObserver(
private val context: Context,
private val componentName: ComponentName
) : ContentObserver(Handler(Looper.getMainLooper())) {
override fun onChange(selfChange: Boolean, uri: Uri?) {
super.onChange(selfChange, uri)
Log.d("DEBUG_", "onChange: Changed!")
requestComplicationUpdate()
}
private fun requestComplicationUpdate() {
val requester = ComplicationDataSourceUpdateRequester.create(
context = context,
complicationDataSourceComponent = componentName
)
requester.requestUpdateAll()
}
}
Код: Выделить всё
override fun onCreate() {
super.onCreate()
val calendarUri: Uri = WearableCalendarContract.CONTENT_URI
// Create the ContentObserver instance.
calendarObserver = ContentObserver(
context = applicationContext,
componentName = ComponentName(applicationContext, ComingEventComplication::class.java)
)
// Register the observer.
contentResolver.registerContentObserver(
calendarUri,
true,
calendarObserver
)
}
override fun onDestroy() {
super.onDestroy()
// Unregister the observer to prevent memory leaks.
contentResolver.unregisterContentObserver(calendarObserver)
}
Код: Выделить всё
Подробнее здесь: https://stackoverflow.com/questions/797 ... mplication
Мобильная версия