- Android Nのクイック設定タイル を読んで自分でも使ってみた。
- APIリファレンスはこちら: TileService, Tile
- 今回の全体コードはこちら DeveloperOptionsTile | GitHub
環境
*記事更新にあたり最新環境に更新しました。
Android O Developer Preview 4 (API level 26)
Android Studio 3.0.0 Beta2
Nexus 5X
試したところ
-
onClick
,onTileAdded
,onTileRemoved
,onStartListening
,onStopListening
の呼ばれるタイミング -
getQsTile()
を利用したTileのupdate
Tile
state
ACTIVE
, INACTIVE
, UNAVAILABLE
の3状態。
こんな感じ
state | icon color | text color | click |
---|---|---|---|
ACTIVE | white | white | enable |
INACTIVE | gray | white | enable |
UNAVAILABLE | gray | gray | disable |
TileServiceの各種コールバック
onTileAdded
ユーザーがタイルをドラッグ&ドロップして追加した時に呼ばれる
onTileRemoved
ユーザーがタイルを削除した時に呼ばれる
onStartListening
タイルが追加された状態でNotificationScreenが降りると呼ばれる
onStopListening
タイルが追加された状態でNotificationScreenが閉じると呼ばれる
onClick
タイルが追加かつ有効な状態でタイルをタップすると呼ばれる
前述のとおりTileStateがUNAVAILABLEの時は呼ばれない。
作ったコード
タイルがクリックされたら開発者オプションを開く。
本当はモードを変えたいところだがSystemAppにしか許されていないのでこれで。
onClick
override fun onClick() {
val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS).apply {
addCategory(Intent.CATEGORY_DEFAULT)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
// Activityを開始してNotificationパネルを閉じる
startActivityAndCollapse(intent)
}
Listeningを開始したらタイルの状態を更新する
設定変更も監視する
onStartListening&onStopListening
override fun onStartListening() {
super.onStartListening()
contentResolver.notifyChange(Settings.Global.getUriFor(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED), developSettingsObserver)
contentResolver.notifyChange(Settings.Global.getUriFor(Settings.Global.ADB_ENABLED), developSettingsObserver)
updateAppTile()
}
override fun onStopListening() {
super.onStopListening()
contentResolver.unregisterContentObserver(developSettingsObserver)
}
設定に応じたタイルの更新
開発者オプションが有効なときはACTIVEになるようにした。
オレ得。
TileUpdate
fun updateAppTile() {
qsTile?.apply {
state = tileState()
updateTile()
}
}
fun tileState(): Int {
val enabled = Settings.Global.getInt(contentResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED)
val adb = Settings.Global.getInt(contentResolver, Settings.Global.ADB_ENABLED, 0)
return when {
enabled == 1 && adb == 1 -> Tile.STATE_ACTIVE
enabled == 1 -> Tile.STATE_INACTIVE
else -> Tile.STATE_UNAVAILABLE
}
}
まとめ
- パネルを閉じてActivity開くところまでAPIが用意されていて簡単(最初気づかなくて自分で閉じてたんだけど。。
- Dialogを開くAPIもあったよ(試してない
- Kotlin本は予約しました。