Android Wear 5.0 Watch Face API 対応と互換性

Android Wear 5.0 の新しい Witch Face API に載せ替えました。

3D imclock for Android Wear
Google play

Activity ではなく Service を使用しています。LiveWallpaper と同じです。
OpenGL 初期化や描画タイミング ( onTimeTick() ) の管理もほぼお任せで、
System UI, Card のレイアウトなどの設定も可能。
新しい API を使用したことで全体的にバッテリー消費量も減りました。

対応する描画モードは 4種類あります。

Interactive mode  通常の描画、秒針などアニメーション付き
Ambient mode      スリープ状態、1分に一度の描画更新
Protect mode      Ambient mode 時に描画面積を最小に
LowBit mode       Ambient mode 時に白黒 2階調

Protect/LowBit が有効かどうかはデバイス依存で onPropertiesChanged() によって判定します。

// G2WatchService.java
@Override
public void onPropertiesChanged( Bundle properties )
{
    super.onPropertiesChanged( properties );
    boolean protect= properties.getBoolean( PROPERTY_BURN_IN_PROTECTION, false );
    boolean lowbit=  properties.getBoolean( PROPERTY_LOW_BIT_AMBIENT, false );
    ~
}

OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。

// G2WatchService.java
@Override
public void onApplyWindowInsets( WindowInsets insets )
{
    super.onApplyWindowInsets( insets );
    boolean round_style= insets.isRound();
    ~
}

Watch Face 以外のアプリでは自分で Listener を登録できます。

// GAScreen.java
public class GAScreenView extends GLSurfaceView
          implements View.OnApplyWindowInsetsListener {
    public GAScreenView( Context context ) {
        super( context );
	setOnApplyWindowInsetsListener( this );
    }
    ~
}

Gles2WatchFaceService を使うと簡単に描画できる反面、EGL 初期化は
内部で行われており、任意の GLES Context を選べないなどいくつか制限も出てきます。

im-clock でもいくつか問題が生じていたので、LiveWallpaper のように
GLSurfaceView を使った方法も試しました。
最終的にはデバイス互換性を維持するのが難しくて断念。
結局 Gles2WatchFaceService を使い MSAA は自前で処理しています。

ChiRaKS for Android Wear では Moto 360 で画面が 90度回転してしまうとの報告を
かなり多数いただきました。
原因は Android 版で指定していた screenOrientation=”portrait” が残っていたこと。
Moto 360 だけ画面が landscape 扱いとなっているようです。
ちなみに画面だけでなく使用している SoC も Moto 360 だけ異なります。

Device         SoC             GPU             CPU
--------------------------------------------------------------------
Moto 360       TI OMAP3630     PowerVR SGX530  Cortex-A8
LG G Watch 他  Snapdragon 400  Adreno 305      Cortex-A7 (1~4 core)

より詳しいスペック比較表は下記よりどうぞ

Smart Watch のスペック比較

Device             Display              Viewport
-----------------------------------------------------------
Moto 360           320x290 Landscape    (0,-30,320,320)
LG G Watch W100    280x280 Portrait     (0,0,280,280)
Galaxy Gear Live   320x320 Portrait     (0,0,320,320)
LG G Watch R W110  320x320 Portrait     (0,0,320,320)
SmartWatch SWR50   320x320 Portrait     (0,0,320,320)
ZenWatch WI500Q    320x320 Portrait     (0,0,320,320)

上記のように Moto 360 だけ 320×290 と画面が横長です。
ただしアプリケーションからは他のデバイス同様 320×320 の正方形画面に見えます。

OpenGL ES の場合どうやらデフォルトで設定されている Viewport でハードの違いを
吸収しているようです。
OpenGL は左下原点なので y に -30 のオフセットが入っています。
これを知らずに自分で Viewport を設定し (0,0,width,height) で上書きしていたため、
Moto 360 で動かした場合だけ描画が上に 30pix ずれていたことが後から判明しました。
互換性の対処のためにも日本で発売して欲しいデバイスです。

関連エントリ
Android Wear Sony SmartWatch 3 SWR50 は速い
Android Wear 3D のアナログ時計 (Watch Face)
Android Wear にゲームを移植