Android 6.0のSystemUI Tuner（の謎機能）をいじってみる


Android 6.0から、新たな隠し機能？としてSystem UI Tunerというものが現れました。
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/74571/6116b41d-4214-b70c-f953-ff680a375a42.gif "test.gif")


れいによって

* そのうち無くなるかもね、でも文句いわないでね、てきなことが書いてある
* Gitコミットの詳細を見てもわからない
* ソースのコメントもない = **ソースをガリガリ読むしか無い！**w

という非常にてきとーなコンポーネントです。

ぐぐってもなかなか情報がでてこない、
けど、なんとなく使えそうな雰囲気を感じるものがある、のでちょっと触ってみました。

2015/10/30現在、Broadcast TileとDemo modeの説明が、なかなかぐぐっても出てこないので、この記事ではその２つの機能をいじって情報共有してみます。

　
# IntentTile (Broadcast Tile)

あまりにも利用方法が書かれていないので、「未実装だ」とか「機能を持たないものだ」とか言っている記事が世の中に数多くありますが、これじつはすごい機能なんです。

## どんな機能か？

**任意のアプリがクイック通知パネルにボタンを置くことができる!** という画期的な機能なんです。
(ちょっとユーザ操作をしてもらう必要はあるけど...)


図解すると

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/5fe07092-1307-2dd4-355d-284e95f69541.png "Slice 1.png")


あらかじめユーザに「xxxxxという名前のBroadcast Tileを置いてね！」って一言お願いしておき、
アプリからその xxxxxというアクションのインテントをブロードキャストすることで、パネルを追加できる！
という仕組みです。

クリック時のアクションや、クイックパネルのアイコン/ラベルなどは、インテントのextraで付加します。
（どんなextra属性を拾ってくれるかは[このへん](http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java#116)を見ればなんとなくわかります）

## 試しに...
![スクリーンショット 2015-10-30 2.00.45.png](https://qiita-image-store.s3.amazonaws.com/0/74571/04faa509-31bd-501a-ffbc-7a482753f0b2.png "スクリーンショット 2015-10-30 2.00.45.png")

こんな感じでインテント名を入力してコンソールから

```
$ adb shell am broadcast -a jp.co.crowdworks.androidapp.TOGGLE \
     --es label CrowdWorks \
     --es iconPackage jp.co.crowdworks.androidapp \
     --ei iconId `perl -e 'print 0x7f020080'`
```

というかんじのインテントを飛ばすと・・・

ボタンが現れました！
![スクリーンショット 2015-10-30 3.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/74571/a957ffe1-f299-4eea-e56c-e8451be5a762.png "スクリーンショット 2015-10-30 3.05.47.png")


ただ、クリックやロングクリックはさすがにコンソールから動作確認が無理だったので、アプリに以下のようなコードを埋めてみたところアイコンをタップすることでアプリに飛ぶことが確認できました。


```
Intent i = new Intent(getContext(), EntryActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);

Intent intent = new Intent("jp.co.crowdworks.androidapp.TOGGLE");
intent.putExtra("label", "CrowdWorks");
　（略）
intent.putExtra("onClick", pi);
sendBroadcast(intent);
```

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/74571/74f9e83e-f080-b2d0-f64c-0ec40eada6c1.gif "test.gif")



## 使いみちは...

「お試し機能だよ！」っていう現状、一般のアプリで使うのはかなり無理があります。

端末メーカーとかがちょっと改造いれつつ、組み込み機能（カスタム）のトグルを作るのがちょっと省力化されて便利、・・・なのかなぁ・・・　って感じです。

今後に期待ですね…。
　
　
　


# DEMO MODE

## どんな機能か？

「電池残量が１％だろうと、圏外だろうと、電池100％、バリ5の表示状態が今すぐ見たいんだ！」ってときにFake表示するためのものっぽいですね。たぶん。


## 試してみた...

[こんなかんじ](http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java#152)でインテントを送ると、いろいろな見た目が確認できる気がしたので、いろいろやってみました

```bash:時計を９：４１にする
adb shell am broadcast -a com.android.systemui.demo \
    --es command clock \
    --es hhmm 0941
```

```bash:Wifiアイコンを消す
adb shell am broadcast -a com.android.systemui.demo \
    --es command network \
    --es wifi hide
```

※[networkで使える値は結構いっぱいあるっぽい](http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java)です

```bash:バッテリ残量０、充電中を表示してみる
adb shell am broadcast -a com.android.systemui.demo \
    --es command battery \
    --es level 0 \
    --es plugged true
```


## 使いみちは...

これもほぼ端末メーカー向けの補助機能な気がします。
実際の電池残量や電波状態がfakeされるわけではなく、表示だけがfakeされるものなので、一般アプリではほぼ使いみちがありません。

たぶん、イケてるデザインさんが「レイアウト調整をちゃんとしてから開発の人に電池アイコンの画像をつかってもらいたいよ！」って思った時に、ちょっと便利だったりするんでしょうね…。たぶん。


　
　
　
# おわりに

今回の記事は、「Android 6.0の謎機能の情報を世界一早く発信するのが目的で、触ってみた＆書いてみた」、って感じなので、おそらく多くのAndroidアプリエンジニアには何の役にも立たない内容ですね・・・。

まぁごく一部の人だけが「ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!」と思ってくれればそれでいいと思ってます、この記事に関しては…ｗ