ui: add shortcut for adding quick settings tile

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld
2023-05-10 20:48:11 +02:00
parent e53a8d76f9
commit 70f8e5ab3a
5 changed files with 81 additions and 1 deletions
@@ -75,6 +75,7 @@ class QuickTileService : TileService() {
}
override fun onCreate() {
isAdded = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
iconOn = Icon.createWithResource(this, R.drawable.ic_tile)
iconOff = iconOn
@@ -98,6 +99,11 @@ class QuickTileService : TileService() {
iconOff = Icon.createWithBitmap(b)
}
override fun onDestroy() {
super.onDestroy()
isAdded = false
}
override fun onStartListening() {
Application.getTunnelManager().addOnPropertyChangedCallback(onTunnelChangedCallback)
if (tunnel != null) tunnel!!.addOnPropertyChangedCallback(onStateChangedCallback)
@@ -109,6 +115,14 @@ class QuickTileService : TileService() {
Application.getTunnelManager().removeOnPropertyChangedCallback(onTunnelChangedCallback)
}
override fun onTileAdded() {
isAdded = true
}
override fun onTileRemoved() {
isAdded = false
}
private fun updateTile() {
// Update the tunnel.
val newTunnel = Application.getTunnelManager().lastUsedTunnel
@@ -157,5 +171,7 @@ class QuickTileService : TileService() {
companion object {
private const val TAG = "WireGuard/QuickTileService"
var isAdded: Boolean = false
private set
}
}
@@ -4,9 +4,11 @@
*/
package com.wireguard.android.activity
import android.content.ComponentName
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.service.quicksettings.TileService
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit
@@ -14,6 +16,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.wireguard.android.Application
import com.wireguard.android.QuickTileService
import com.wireguard.android.R
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.preference.PreferencesPreferenceDataStore
@@ -47,7 +50,13 @@ class SettingsActivity : AppCompatActivity() {
override fun onCreatePreferences(savedInstanceState: Bundle?, key: String?) {
preferenceManager.preferenceDataStore = PreferencesPreferenceDataStore(lifecycleScope, Application.getPreferencesDataStore())
addPreferencesFromResource(R.xml.preferences)
preferenceScreen.initialExpandedChildrenCount = 4
preferenceScreen.initialExpandedChildrenCount = 5
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || QuickTileService.isAdded) {
val quickTile = preferenceManager.findPreference<Preference>("quick_tile")
quickTile?.parent?.removePreference(quickTile)
--preferenceScreen.initialExpandedChildrenCount
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val darkTheme = preferenceManager.findPreference<Preference>("dark_theme")
darkTheme?.parent?.removePreference(darkTheme)
@@ -0,0 +1,50 @@
/*
* Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference
import android.app.StatusBarManager
import android.content.ComponentName
import android.content.Context
import android.graphics.drawable.Icon
import android.os.Build
import android.util.AttributeSet
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.preference.Preference
import com.wireguard.android.QuickTileService
import com.wireguard.android.R
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
class QuickTilePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
override fun getSummary() = context.getString(R.string.quick_settings_tile_add_summary)
override fun getTitle() = context.getString(R.string.quick_settings_tile_add_title)
override fun onClick() {
val statusBarManager = context.getSystemService(StatusBarManager::class.java)
statusBarManager.requestAddTileService(
ComponentName(context, QuickTileService::class.java),
context.getString(R.string.quick_settings_tile_action),
Icon.createWithResource(context, R.drawable.ic_tile),
context.mainExecutor
) {
when (it) {
StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ALREADY_ADDED,
StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ADDED -> {
parent?.removePreference(this)
--preferenceManager.preferenceScreen.initialExpandedChildrenCount
}
StatusBarManager.TILE_ADD_REQUEST_ERROR_MISMATCHED_PACKAGE,
StatusBarManager.TILE_ADD_REQUEST_ERROR_REQUEST_IN_PROGRESS,
StatusBarManager.TILE_ADD_REQUEST_ERROR_BAD_COMPONENT,
StatusBarManager.TILE_ADD_REQUEST_ERROR_NOT_CURRENT_USER,
StatusBarManager.TILE_ADD_REQUEST_ERROR_APP_NOT_IN_FOREGROUND,
StatusBarManager.TILE_ADD_REQUEST_ERROR_NO_STATUS_BAR_SERVICE ->
Toast.makeText(context, context.getString(R.string.quick_settings_tile_add_failure, it), Toast.LENGTH_SHORT).show()
}
}
}
}