LoginSignup
5
1

More than 5 years have passed since last update.

Android Nのクイック設定タイル(TileService)を使って開発者オプションをサクッと開くやつ

Last updated at Posted at 2016-06-19

環境

*記事更新にあたり最新環境に更新しました。

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本は予約しました。
5
1
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
5
1