AppWidgetに通知されるサイズ情報が信頼できない件

AppWidgetにはその表示されているサイズ情報が通知されます。
API 31未満では、縦横ぞれぞれのサイズ、API 31以上ではFoldableなどの複数の画面モードの情報も含めて通知されます。

https://qiita.com/ryo_mm2d/items/76a75b4b705e40cb1b2e

Jetpack Glanceにて、`sizeMode = SizeMode.Exact`の設定時は、通知されたそれぞれのサイズのレイアウトをまとめて出力します。`LocalSize.current` は現在構成すべきサイズ情報を参照することができ、この情報に応じてレイアウトを切り替えることでレスポンシブルなWidgetを作成することができます。

しかし、実際にサイズ情報を元に細かな調整を行ったレイアウトを返却してみると、端末によってレイアウトが崩れてしまう場合があります。原因の一つはホームアプリ側がSizedRemoteViewsに対応していないにもかかわらず、複数のサイズを通知してしまっている場合もあります。
が、そもそもサイズ情報がおかしいのでは？ということで調査してみます

# 調査用ウィジェット

というわけで、以下のように枠一杯のBox,指定サイズのBox,指定サイズから16dp小さいBox,指定サイズの半分のBoxを表示させてみます。

```kotlin
class TestAppWidget : GlanceAppWidget() {
    override val sizeMode = SizeMode.Exact

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        provideContent {
            val size = LocalSize.current
            Box(
                modifier = GlanceModifier.fillMaxSize()
                    .appWidgetBackground()
                    .background(color = Color.White)
            ) {
                Box(
                    contentAlignment = Alignment.Center,
                    modifier = GlanceModifier.fillMaxSize(),
                ) {
                    Box(
                        contentAlignment = Alignment.Center,
                        modifier = GlanceModifier
                            .size(
                                width = size.width,
                                height = size.height
                            )
                            .background(Color.Green)
                    ) {
                        Box(
                            contentAlignment = Alignment.Center,
                            modifier = GlanceModifier
                                .size(
                                    width = size.width - 16.dp,
                                    height = size.height - 16.dp,
                                )
                                .background(Color.Yellow)
                        ) {
                            Box(
                                contentAlignment = Alignment.Center,
                                modifier = GlanceModifier
                                    .size(
                                        width = size.width / 2,
                                        height = size.height / 2,
                                    )
                                    .background(Color.Cyan)
                            ) {}
                        }
                    }
                }
                Text(
                    text = "${size.width.value.toInt()}x${size.height.value.toInt()}",
                    modifier = GlanceModifier.padding(16.dp)
                )
            }
        }
    }
}
```

# Pixel Launcher

ホームアプリのリファレンスとも言えるPixel Launcher、きっちりと表示されているものと一致するサイズを通知してくれています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/ebbe3222-ee1d-303f-6b2c-3342ecf8e582.png" />

# Nova Launcher

実際のサイズよりも横幅が大きく、縦幅が小さく通知されているようです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/04483e95-c46a-ee2d-4072-cb1774d3c700.png" />

ただ、これはAndroid 15での現象のようで、Android 12の端末ではきっちり表示サイズと一致するサイズが通知されていました。こちらはいずれ修正されるのではないかと思います。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/9c33e46f-a226-5459-f27b-41cbe9be3341.png" />

# Yahoo!きせかえ

表示サイズと一致するサイズが通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/4d34b39e-d248-7fb9-30b0-c02f7103e189.png" />

# Microsoft Launcher

横幅はあっているようですが、縦が実際のサイズよりも大きな値が通知されるようです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/a941a5c3-12bb-f451-389d-6ec1f32da9b8.png" />

# SmartLauncher

表示サイズと一致するサイズが通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/b519187d-b56a-ed3c-f568-1ed165a7ccf4.png" />

# OPPO システムランチャー

縦横ともにすこし小さな値が通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/5638def0-d2f9-ba82-f970-495d74117156.png" />

さらに、サイズを変更していると、グリッドに沿わなくなり表示サイズが狂っていってしまいます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/9483aa81-19c0-0457-4c3d-8b83062a8187.png" />

仕様と言うにはおかしな挙動なので、バグなのかなとも思いますが、これでも以前よりは改善しているほうで、ウィジェットに関してはあまり力を入れていないのかもしれないです。

# Xiaomi システムランチャー

表示サイズと一致するサイズが通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/a8cd1ff1-7d26-3511-c546-307a6a5fd393.png" />

# Moto App Launcher (motorola)

縦は小さく、横幅は大きく通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/9ce2c286-3557-47bc-b1f8-319dd61c25f5.png" />

# One UI ホーム (Samsung)

表示サイズと一致するサイズが通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/d001ed45-654a-42f2-ab60-db1fe7c51835.png" />

# docomo LIVE UX

ドコモから発売されているスマホに搭載されているランチャーです。
縦方向に白いラインが見えるため、わずかに小さい値が通知されていますが、概ね表示サイズと一致するサイズが通知されています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/66e475b8-32a7-48ef-a510-a00006f1cfba.png" />

# AQUOS Phoneランチャー

シャープのAQUOS Phoneには3種類のランチャーが搭載されていました。
いずれも表示サイズと一致するサイズが通知されています。

## AQUOS Home

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/329d72b9-202e-46c7-b4d2-ee61eb4799de.png" />

## AQUOSかんたんホーム

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/925f106d-7f00-4779-8511-97c252a8d7ab.png" />

## AQUOSジュニアホーム

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/291143de-5d5d-4023-8e77-d0ff3b740690.png" />


---

手持ちの端末のメーカーにバリエーションがないため、あんまり突っ込んだ調査になりませんでしたが、それなりのシェアを持っているだろうホームアプリでも、表示サイズとのズレが発生するものがありました。
ウィジェットのレイアウトが崩れていたら、そのアプリが悪いとユーザーは思うでしょうけど、ホームアプリが信頼できる情報を渡してくれないと適切な調整ができないですね。
何か良い方法はないでしょうか？