LoginSignup
8
2

Glanceがbetaになったぞ

Posted at

はじめに

こんにちは、どすこいです。
先日Glanceのbeta-01がリリースされましたね。

Glanceを早くプロダクションで使いたい身としては、とても嬉しいことです。
ということで早速触っていきましょう。
alphaからの違いやbetaになってできるようになったことを紹介していこうと思います。

setup

app/build.gradle
dependencies {
    ...
    implementation "androidx.glance:glance-appwidget:1.0.0-beta01"
    ...
}

ContentからprovideGlanceへ

Glanceのエントリポイントが以下のような変更になりました。

変更点

  • エントリポイントがComposable関数じゃなくなった
  • ContextとGlanceIdが引数で渡されるように
    • GlanceIdはAppWidgetIdのwrapper
  • overrideするメソッド自体がComposable関数ではなくなったため、provideContentを使ってComposableを呼び出す必要がある

Beta版

override suspend fun provideGlance(context: Context, id: GlanceId) = provideContent {
  ...
}

Alpha版

@Composable
override fun Content() {
  ...
}

GlanceThemeの追加

Themeが追加されました。
Composeを触ってる方ならわかると思いますが、Compose側にはMaterialThemeというものがありアプリ全体でのテーマを統一することができました。
alphaまでのGlanceにはThemeを指定するものがありませんでしたが、betaになりGlanceThemeというものが追加されました。

コード

override suspend fun provideGlance(context: Context, id: GlanceId) = provideContent {
  GlanceTheme(colors = ...) {
    ...
  }
}

GlanceThemeの引数は

  • colors: ColorProviders
  • content: @GlanceComposable @Composable () -> Unit
    の2つなので、色のThemeのみ指定できるようになっています。

typographyの指定はまだできないようです。

ColorProvider

ColorProviderはGlanceでのみ登場します。
ColorProviderのコンストラクタには、androidx.compose.ui.graphics.Color@ColorResを渡すことができるようになっており、経緯はわかりませんがGlanceでの色の指定に必要になってきます。

ColorProviders

ColorProvidersもGlanceでのみ登場します。
Material3のcolor shemeを提供するためのクラスです。

sealed class ColorProviders(
    val primary: ColorProvider,
    val onPrimary: ColorProvider,
    val primaryContainer: ColorProvider,
    val onPrimaryContainer: ColorProvider,
    val secondary: ColorProvider,
    val onSecondary: ColorProvider,
    ...
)

sealed classとなっており、ColorProvidersを直接インスタンス化することは不可能なようです。
独自のcolor schemeを使いたい場合は以下のメソッドを使ってください。

fun colorProviders(
    primary: ColorProvider,
    onPrimary: ColorProvider,
    primaryContainer: ColorProvider,
    onPrimaryContainer: ColorProvider,
    secondary: ColorProvider,
    onSecondary: ColorProvider,
    ...
)

こちらは中でCustomColorProvidersというクラスを作成しています。CustomColorProvidersは上記のColorProvidersを継承しています。inner classなので、上記のメソッドを通してでないとColorProvidersは作れません。

またDynamicThemeColorProvidersというものも存在します。こちらもColorProvidersを継承しています。

Creates a set of color providers that represents a Material 3 style dynamic color theme. On devices that support it, this theme is derived from the user specific platform colors, on other devices this falls back to the Material baseline theme.

Material 3スタイルのダイナミックカラーテーマを表すカラープロバイダーのセットを作成します。これをサポートするデバイスでは、このテーマはユーザー固有のプラットフォームカラーから派生し、その他のデバイスでは、マテリアル・ベースライン・テーマに戻されます。(DeepL)

デフォルトではDynamicThemeColorProvidersが使われているため、独自のcolor schemeを使っているプロダクトはGlanceThemeを使う際は注意してください。

glance-material, glance-material3の追加

上記のColorProvidersandroidx.glance:glance-appwidgetに含まれているものですが、今回のアップデートで、glance-materialglance-material3も追加されました。
今回の追加ではそれぞれのMaterial Designのカラーパレットに対応した、ColorProviderを提供するだけのものとなっていますが、そのうちTypographyの提供などもしてくれそうですね。

glance-material

導入

app/build.gradle
    ...
    implementation "androidx.compose.material:material:1.4.3"
    implementation "androidx.glance:glance-material:1.0.0-beta01"
    ...

glance-materialの内部でcomposeのmaterialも使っているため追加をお忘れなく。

使ってみる

上記にもありますが、glance-materialができるのはThemeの提供ではなく、あくまでColorProvidersの提供までです。(beta-01時点)
なのでGlanceThemeのcolorsに対して、glance-materialが提供しているColorProvidersを適用する方になります。

GlanceTheme(
    colors = androidx.glance.material.ColorProviders(
        light = Colors(...),
        dark = Colors(...),
    )
) {
}

ダークテーマに対応していない場合は以下でもOKです。

GlanceTheme(
    colors = androidx.glance.material.ColorProviders(
        colors = Colors(...)
    )
) {
}

ここで使っているColorsはComposeのMaterialに内包されているもので、Material2のカラーパレットです。

glance-material3

導入

app/build.gradle
    ...
    implementation "androidx.compose.material3:material3:1.1.0"
    implementation "androidx.glance:glance-material3:1.0.0-beta01"
    ...

glance-material3の内部でcomposeのmaterial3も使っているため追加をお忘れなく。

使ってみる

上記にもありますが、glance-material3ができるのはThemeの提供ではなく、あくまでColorProvidersの提供までです。(beta-01時点)
なのでGlanceThemeのcolorsに対して、glance-material3が提供しているColorProvidersを適用する方になります。

GlanceTheme(
    colors = androidx.glance.material3.ColorProviders(
        light = ColorSheme(...),
        dark = ColorScheme(...),
    )
) {
}

ダークテーマに対応していない場合は以下でもOKです。

GlanceTheme(
    colors = androidx.glance.material3.ColorProviders(
        scheme = ColorSheme(...)
    )
) {
}

ここで使っているColorSchemeはComposeのMaterial3に内包されているもので、Material3のカラーパレットです。

Actionの追加

LambdaActionが追加されました。
alphaまでのGlanceでは単純なactionを実行するだけでもActionCallbackを継承したクラスを作る必要がありました。
しかし今回のアップデータとで、単純なアクションを実行するだけであればLambdaActionを使えばよくなりました。

Button(
    text = "click here!",
    onClick = action {
        ...
    }
)

actionメソッドは、内部でLambdaActionを生成してくれるものです。

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
class LambdaAction(
    val key: String,
    val block: () -> Unit,
) : Action {
    override fun toString() = "LambdaAction($key, ${block.hashCode()})"
}

/**
 * Create an [Action] that runs [block] when triggered.
 *
 * @param key An optional key to be used as a key for the action. If not provided we use the key
 * that is automatically generated by the Compose runtime which is unique for every exact code
 * location in the composition tree.
 * @param block the function to be run when this action is triggered.
 */
@Composable
fun action(
    key: String? = null,
    block: () -> Unit,
): Action {
    val finalKey = if (!key.isNullOrEmpty()) key else currentCompositeKeyHash.toString()
    return LambdaAction(finalKey, block)
}

更新ロジックがWorkManagerへ

これは試せてないのですが、リリースノートに興味深い文がありました。

Moved GlanceAppWidget to a WorkManager session based update mechanism. Users of Glance for AppWidgets should now override GlanceAppWidget.provideGlance instead of the old Content method. As this now happens in a worker, this is now a good place to load resources, database or network items without having to have a separate worker.

GlanceAppWidgetをWorkManagerのセッションベースの更新メカニズムに移行しました。Glance for AppWidgetsのユーザは、従来のContentメソッドではなく、GlanceAppWidget.provideGlanceをオーバーライドする必要があるようになりました。これはワーカーで起こるようになったので、別のワーカーを持つことなく、リソース、データベース、ネットワークアイテムをロードするのに適した場所となりました。(DeepL)

今までAPIコールをしたりデータベースを参照する場合、Workerを起動する必要があったのですが、その必要がなくなったのでしょうか
ここはもっと調査をする必要がありそうですね。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2