Glance

https://developer.android.com/develop/ui/compose/glance
https://developer.android.com/develop/ui/compose/glance/setup
https://developer.android.com/develop/ui/compose/glance/create-app-widget
https://developer.android.com/develop/ui/compose/glance/error-handling
https://developer.android.com/develop/ui/compose/glance/testing
https://developer.android.com/develop/ui/compose/glance/user-interaction
https://developer.android.com/develop/ui/compose/glance/glance-app-widget
https://developer.android.com/develop/ui/compose/glance/build-ui
https://developer.android.com/develop/ui/compose/glance/theme
https://developer.android.com/develop/ui/compose/glance/interoperability
https://developer.android.com/develop/ui/compose/glance/additional-resources
<appwidget-provider/>

XML-файл, описывающий конфигурацию виджета в Android. Он содержит метаданные, указывающие системе, как должен работать виджет.

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:autoAdvanceViewId="@id/view_flipper"
    android:configure=".WidgetConfigActivity"
    android:description="@string/widget_description"
    android:initialLayout="@layout/widget_loading"
    android:initialKeyguardLayout="@layout/widget_loading"
    android:previewLayout="@layout/widget_preview"
    android:previewImage="@drawable/widget_preview"
    android:minWidth="120dp"
    android:minHeight="64dp"
    android:minResizeWidth="120dp"
    android:minResizeHeight="64dp"
    android:maxResizeWidth="480dp"
    android:maxResizeHeight="120dp"
    android:targetCellWidth="2"
    android:targetCellHeight="1"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="1800000"
    android:widgetCategory="home_screen|keyguard"
    android:widgetFeatures="reconfigurable|configuration_optional|hide_from_picker" />

autoAdvanceViewId используется для указания View, который будет автоматически анимироваться системой. Обычно это AdapterView, такой как StackView или ViewFlipper, который поддерживает автоматическое переключение содержимого.

configure класс Activity, который будет использоваться для настройки виджета при его добавлении на экран. Это позволяет открыть экран настроек, где пользователь может выбрать параметры виджета перед его созданием.

description текстовое описание виджета. Отображается пользователю в системном интерфейсе при выборе виджета на домашнем экране.

initialLayout используется для отображения виджета сразу после его добавления на экран. Это первый макет, который пользователь видит до обновления виджета данными из приложения.

initialKeyguardLayout используется для указания макета, который будет отображаться на экране блокировки (keyguard) сразу после добавления виджета. Это аналог параметра initialLayout, но для экрана блокировки.

previewLayout отображается в интерфейсе выбора виджетов (widget picker). Это ресурс макета, показывающей пользователю, как будет выглядеть виджет на экране до его добавления.

previewImage отображается в интерфейсе выбора виджетов (widget picker). Это статическая картинка, показывающая пользователю, как будет выглядеть виджет на экране до его добавления.

minWidth минимальная ширина виджета в dp.

minHeight минимальная высота виджета в dp.

minResizeWidth минимальная ширина в dp, до которой можно уменьшить виджет при изменении его размера.

minResizeHeight минимальная высота в dp, до которой можно уменьшить виджет.

maxResizeWidth максимальная ширина в dp, до которой можно растянуть виджет.

maxResizeHeight максимальная высота в dp, до которой можно растянуть виджет.

targetCellWidth количество ячеек по ширине, которые должен занимать виджет (например, 2 клетки).

targetCellHeight количество ячеек по высоте (например, 1 клетка).

resizeMode указывает, можно ли изменять размер виджета, и если да, то в каком направлении. Этот параметр позволяет пользователю растягивать или уменьшать виджет после его добавления на экран.

updatePeriodMillis интервал в миллисекундах, через который виджет будет автоматически обновляться системой. Минимальное значение — 30 минут (1800000 мс).

widgetCategory указывает, где может отображаться виджет: на домашнем экране (home_screen), на экране блокировки (keyguard) или в обоих местах.

widgetFeatures используется для указания специальных возможностей виджета, поддерживаемых хостом виджетов. Это позволяет системе понимать, какие функции можно использовать для улучшения взаимодействия с виджетом.

GlanceAppWidget

Базовый класс в Jetpack Glance, который используется для создания виджетов в Android. Вместо традиционного XML-макета, интерфейс виджета создаётся с помощью декларативного подхода, схожего с Jetpack Compose.

class MyGlanceWidget: GlanceAppWidget() {
    override suspend fun provideGlance(context: Context, id: GlanceId) {}
}
provideGlance

Позволяет динамически генерировать содержимое виджета.

override suspend fun provideGlance(context: Context, id: GlanceId) {
    provideContent {
        GlanceTheme {
            Column(
                modifier = GlanceModifier.fillMaxSize().padding(16.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text(text = "Привет, мир!", style = TextStyle(fontSize = 18.sp))
                Button(text = "Обновить", onClick = actionRunCallback<UpdateCallback>())
            }
        }
    }
}
sizeMode

Определяет, как виджет реагирует на изменение размеров.

SizeMode.Single

Виджет имеет фиксированный размер, не реагирует на изменения.

override val sizeMode: SizeMode
    get() = SizeMode.Single
SizeMode.Exact

Виджет реагирует на изменение размеров, и система передаёт точные значения ширины и высоты.

override val sizeMode: SizeMode
    get() = SizeMode.Exact
SizeMode.Responsive

Позволяет адаптировать виджет к нескольким предустановленным размерам, обеспечивая разные макеты для разных диапазонов размеров.

override val sizeMode: SizeMode
    get() = SizeMode.Responsive(
        sizes = setOf(
            DpSize(120.dp, 56.dp),
            DpSize(480.dp, 120.dp)
        )
    )
stateDefinition

Определяет, как виджет сохраняет и получает данные состояния, такие как настройки или данные, специфичные для каждого экземпляра виджета. Он позволяет сохранять состояние виджета между обновлениями и даже перезагрузками устройства.

override val stateDefinition: GlanceStateDefinition<*>
    get() = MyGlanceStateDefinition
onDelete

Вызывается, когда пользователь удаляет виджет с домашнего экрана.

override suspend fun onDelete(context: Context, glanceId: GlanceId) {
    super.onDelete(context, glanceId)
    Log.d("MyWidget", "Виджет удалён: $glanceId")
}
onCompositionError

Вызывается, если при создании содержимого виджета (provideGlance()) произошла ошибка композиции.

override fun onCompositionError(context: Context, glanceId: GlanceId, appWidgetId: Int, throwable: Throwable) {
    super.onCompositionError(context, glanceId, appWidgetId, throwable)
    Timber.e("Ошибка композиции виджета $glanceId: ${throwable.message}")
}
GlanceStateDefinition

Интерфейс, определяющий, как сохраняется состояние виджета. Он позволяет задать механизм хранения данных для GlanceAppWidget, обеспечивая сохранение и восстановление состояния между обновлениями и перезагрузками устройства.

PreferencesGlanceStateDefinition

Реализация интерфейса GlanceStateDefinition, используемая для хранения состояния виджета с помощью DataStore и Preferences. Она позволяет сохранять данные в формате «ключ-значение» и обеспечивает их восстановление при обновлении или перезагрузке виджета. Позволяет сохранять простые типы данных: String Int Long Boolean.

override val stateDefinition = PreferencesGlanceStateDefinition