Dialog still show when activity destroyed will cause leak. Dismiss dialog when activity onDestroy to fix this issue. Fix: 279522922 Test: Manually with "Don't keep activities" Test: Robolectric Test Change-Id: I445f4b160020823a6f6e2883055218c1224e2c48
99 lines
3.7 KiB
Kotlin
99 lines
3.7 KiB
Kotlin
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings.bluetooth
|
|
|
|
import android.content.Context
|
|
import android.os.UserManager
|
|
import androidx.appcompat.app.AlertDialog
|
|
import com.android.settings.R
|
|
import com.android.settingslib.spaprivileged.framework.common.devicePolicyManager
|
|
import com.android.settingslib.spaprivileged.framework.common.userManager
|
|
|
|
object RequestPermissionHelper {
|
|
fun requestEnable(
|
|
context: Context,
|
|
appLabel: CharSequence?,
|
|
timeout: Int,
|
|
onAllow: () -> Unit,
|
|
onDeny: () -> Unit,
|
|
): AlertDialog? {
|
|
if (context.resources.getBoolean(R.bool.auto_confirm_bluetooth_activation_dialog)) {
|
|
// Don't even show the dialog if configured this way
|
|
onAllow()
|
|
return null
|
|
}
|
|
return AlertDialog.Builder(context).apply {
|
|
setMessage(context.getEnableMessage(timeout, appLabel))
|
|
setPositiveButton(R.string.allow) { _, _ ->
|
|
if (context.isDisallowBluetooth()) onDeny() else onAllow()
|
|
}
|
|
setNegativeButton(R.string.deny) { _, _ -> onDeny() }
|
|
setOnCancelListener { onDeny() }
|
|
}.create()
|
|
}
|
|
|
|
fun requestDisable(
|
|
context: Context,
|
|
appLabel: CharSequence?,
|
|
onAllow: () -> Unit,
|
|
onDeny: () -> Unit,
|
|
): AlertDialog? {
|
|
if (context.resources.getBoolean(R.bool.auto_confirm_bluetooth_activation_dialog)) {
|
|
// Don't even show the dialog if configured this way
|
|
onAllow()
|
|
return null
|
|
}
|
|
return AlertDialog.Builder(context).apply {
|
|
setMessage(context.getDisableMessage(appLabel))
|
|
setPositiveButton(R.string.allow) { _, _ -> onAllow() }
|
|
setNegativeButton(R.string.deny) { _, _ -> onDeny() }
|
|
setOnCancelListener { onDeny() }
|
|
}.create()
|
|
}
|
|
}
|
|
|
|
// If Bluetooth is disallowed, don't try to enable it, show policy transparency message instead.
|
|
private fun Context.isDisallowBluetooth() =
|
|
if (userManager.hasUserRestriction(UserManager.DISALLOW_BLUETOOTH)) {
|
|
devicePolicyManager.createAdminSupportIntent(UserManager.DISALLOW_BLUETOOTH)
|
|
?.let { startActivity(it) }
|
|
true
|
|
} else false
|
|
|
|
private fun Context.getEnableMessage(timeout: Int, name: CharSequence?): String = when {
|
|
timeout < 0 -> when (name) {
|
|
null -> getString(R.string.bluetooth_ask_enablement_no_name)
|
|
else -> getString(R.string.bluetooth_ask_enablement, name)
|
|
}
|
|
|
|
timeout == BluetoothDiscoverableEnabler.DISCOVERABLE_TIMEOUT_NEVER -> when (name) {
|
|
null -> getString(R.string.bluetooth_ask_enablement_and_lasting_discovery_no_name)
|
|
else -> getString(R.string.bluetooth_ask_enablement_and_lasting_discovery, name)
|
|
}
|
|
|
|
else -> when (name) {
|
|
null -> getString(R.string.bluetooth_ask_enablement_and_discovery_no_name, timeout)
|
|
else -> getString(R.string.bluetooth_ask_enablement_and_discovery, name, timeout)
|
|
}
|
|
}
|
|
|
|
private fun Context.getDisableMessage(name: CharSequence?): String =
|
|
when (name) {
|
|
null -> getString(R.string.bluetooth_ask_disablement_no_name)
|
|
else -> getString(R.string.bluetooth_ask_disablement, name)
|
|
}
|