GlanceTemplateAppWidget.kt

/*
 * 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.
 */

package androidx.glance.appwidget.template

import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.unit.Dp
import androidx.glance.GlanceComposable
import androidx.glance.LocalSize
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.SizeMode
import androidx.glance.color.dynamicThemeColorProviders
import androidx.glance.state.GlanceStateDefinition
import androidx.glance.state.PreferencesGlanceStateDefinition
import androidx.glance.template.LocalTemplateColors
import androidx.glance.template.LocalTemplateMode
import androidx.glance.template.TemplateMode

/**
 * A [GlanceAppWidget] that provides template local values.
 */
abstract class GlanceTemplateAppWidget : GlanceAppWidget() {

    /** Default widget size mode is [SizeMode.Exact] */
    override val sizeMode = SizeMode.Exact

    /** Default widget state definition is [PreferencesGlanceStateDefinition] */
    override val stateDefinition: GlanceStateDefinition<*>? = PreferencesGlanceStateDefinition

    @Composable
    final override fun Content() {
        // TODO: Add other local values
        val mode = mode()
        val colors = dynamicThemeColorProviders()
        CompositionLocalProvider(
            LocalTemplateMode provides mode,
            LocalTemplateColors provides colors
        ) {
            TemplateContent()
        }
    }

    @Composable
    @GlanceComposable
    abstract fun TemplateContent()

    /** Resolves the current display mode */
    @Composable
    private fun mode(): TemplateMode {
        val height = LocalSize.current.height
        val width = LocalSize.current.width
        return if (height <= Dp(240f) && width <= Dp(240f)) {
            TemplateMode.Collapsed
        } else if ((width / height) < (3.0 / 2.0)) {
            TemplateMode.Vertical
        } else {
            TemplateMode.Horizontal
        }
    }
}