Skip to content

Commit 302095d

Browse files
committed
feat: WRITE_SECURE_SETTINGS permission dialog now directs the user to PRO mode
1 parent 9a92925 commit 302095d

File tree

4 files changed

+45
-37
lines changed

4 files changed

+45
-37
lines changed

base/src/main/java/io/github/sds100/keymapper/base/BaseMainActivity.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import androidx.lifecycle.Lifecycle
2121
import androidx.lifecycle.flowWithLifecycle
2222
import androidx.lifecycle.lifecycleScope
2323
import androidx.lifecycle.withStateAtLeast
24-
import androidx.navigation.findNavController
2524
import com.anggrayudi.storage.extension.openInputStream
2625
import com.anggrayudi.storage.extension.openOutputStream
2726
import com.anggrayudi.storage.extension.toDocumentFile
@@ -32,6 +31,7 @@ import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
3231
import io.github.sds100.keymapper.base.system.accessibility.AccessibilityServiceAdapterImpl
3332
import io.github.sds100.keymapper.base.system.permissions.RequestPermissionDelegate
3433
import io.github.sds100.keymapper.base.trigger.RecordTriggerControllerImpl
34+
import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
3535
import io.github.sds100.keymapper.base.utils.ui.ResourceProviderImpl
3636
import io.github.sds100.keymapper.common.BuildConfigProvider
3737
import io.github.sds100.keymapper.sysbridge.service.SystemBridgeSetupControllerImpl
@@ -43,12 +43,12 @@ import io.github.sds100.keymapper.system.notifications.NotificationReceiverAdapt
4343
import io.github.sds100.keymapper.system.permissions.AndroidPermissionAdapter
4444
import io.github.sds100.keymapper.system.root.SuAdapterImpl
4545
import io.github.sds100.keymapper.system.shizuku.ShizukuAdapter
46-
import javax.inject.Inject
4746
import kotlinx.coroutines.Dispatchers
4847
import kotlinx.coroutines.flow.launchIn
4948
import kotlinx.coroutines.flow.onEach
5049
import kotlinx.coroutines.launch
5150
import timber.log.Timber
51+
import javax.inject.Inject
5252

5353
abstract class BaseMainActivity : AppCompatActivity() {
5454

@@ -105,6 +105,9 @@ abstract class BaseMainActivity : AppCompatActivity() {
105105
@Inject
106106
lateinit var inputEventHub: InputEventHubImpl
107107

108+
@Inject
109+
lateinit var navigationProvider: NavigationProvider
110+
108111
private lateinit var requestPermissionDelegate: RequestPermissionDelegate
109112

110113
private val currentNightMode: Int
@@ -162,15 +165,14 @@ abstract class BaseMainActivity : AppCompatActivity() {
162165
notificationReceiverAdapter = notificationReceiverAdapter,
163166
buildConfigProvider = buildConfigProvider,
164167
shizukuAdapter = shizukuAdapter,
168+
navigationProvider = navigationProvider,
169+
coroutineScope = lifecycleScope,
165170
)
166171

167172
permissionAdapter.request
168173
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
169174
.onEach { permission ->
170-
requestPermissionDelegate.requestPermission(
171-
permission,
172-
findNavController(R.id.container),
173-
)
175+
requestPermissionDelegate.requestPermission(permission)
174176
}
175177
.launchIn(lifecycleScope)
176178

base/src/main/java/io/github/sds100/keymapper/base/shortcuts/CreateKeyMapShortcutActivity.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ import androidx.activity.viewModels
88
import androidx.appcompat.app.AppCompatActivity
99
import androidx.compose.ui.graphics.toArgb
1010
import androidx.lifecycle.Lifecycle
11-
import androidx.navigation.findNavController
11+
import androidx.lifecycle.lifecycleScope
1212
import dagger.hilt.android.AndroidEntryPoint
13-
import io.github.sds100.keymapper.base.R
1413
import io.github.sds100.keymapper.base.compose.ComposeColors
1514
import io.github.sds100.keymapper.base.compose.KeyMapperTheme
1615
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
1716
import io.github.sds100.keymapper.base.system.accessibility.AccessibilityServiceAdapterImpl
1817
import io.github.sds100.keymapper.base.system.permissions.RequestPermissionDelegate
1918
import io.github.sds100.keymapper.base.trigger.RecordTriggerControllerImpl
19+
import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
2020
import io.github.sds100.keymapper.base.utils.ui.ResourceProviderImpl
2121
import io.github.sds100.keymapper.base.utils.ui.launchRepeatOnLifecycle
2222
import io.github.sds100.keymapper.common.BuildConfigProvider
2323
import io.github.sds100.keymapper.system.notifications.NotificationReceiverAdapterImpl
2424
import io.github.sds100.keymapper.system.permissions.AndroidPermissionAdapter
2525
import io.github.sds100.keymapper.system.shizuku.ShizukuAdapter
26-
import javax.inject.Inject
2726
import kotlinx.coroutines.flow.collectLatest
27+
import javax.inject.Inject
2828

2929
@AndroidEntryPoint
3030
class CreateKeyMapShortcutActivity : AppCompatActivity() {
@@ -53,6 +53,9 @@ class CreateKeyMapShortcutActivity : AppCompatActivity() {
5353
@Inject
5454
lateinit var buildConfigProvider: BuildConfigProvider
5555

56+
@Inject
57+
lateinit var navigationProvider: NavigationProvider
58+
5659
private lateinit var requestPermissionDelegate: RequestPermissionDelegate
5760

5861
private val viewModel by viewModels<CreateKeyMapShortcutViewModel>()
@@ -86,15 +89,14 @@ class CreateKeyMapShortcutActivity : AppCompatActivity() {
8689
notificationReceiverAdapter = notificationReceiverAdapter,
8790
buildConfigProvider = buildConfigProvider,
8891
shizukuAdapter = shizukuAdapter,
92+
navigationProvider = navigationProvider,
93+
coroutineScope = lifecycleScope,
8994
)
9095

9196
launchRepeatOnLifecycle(Lifecycle.State.STARTED) {
9297
permissionAdapter.request
9398
.collectLatest { permission ->
94-
requestPermissionDelegate.requestPermission(
95-
permission,
96-
findNavController(R.id.container),
97-
)
99+
requestPermissionDelegate.requestPermission(permission)
98100
}
99101
}
100102

base/src/main/java/io/github/sds100/keymapper/base/system/permissions/RequestPermissionDelegate.kt

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,21 @@ import androidx.activity.result.contract.ActivityResultContracts
1313
import androidx.annotation.RequiresApi
1414
import androidx.appcompat.app.AppCompatActivity
1515
import androidx.core.app.ActivityCompat
16-
import androidx.navigation.NavController
1716
import io.github.sds100.keymapper.base.R
17+
import io.github.sds100.keymapper.base.utils.navigation.NavDestination
18+
import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
19+
import io.github.sds100.keymapper.base.utils.navigation.navigate
1820
import io.github.sds100.keymapper.base.utils.ui.str
1921
import io.github.sds100.keymapper.common.BuildConfigProvider
22+
import io.github.sds100.keymapper.common.utils.onFailure
2023
import io.github.sds100.keymapper.system.DeviceAdmin
2124
import io.github.sds100.keymapper.system.notifications.NotificationReceiverAdapterImpl
2225
import io.github.sds100.keymapper.system.permissions.AndroidPermissionAdapter
2326
import io.github.sds100.keymapper.system.permissions.Permission
2427
import io.github.sds100.keymapper.system.shizuku.ShizukuAdapter
2528
import io.github.sds100.keymapper.system.url.UrlUtils
29+
import kotlinx.coroutines.CoroutineScope
30+
import kotlinx.coroutines.launch
2631
import splitties.alertdialog.appcompat.messageResource
2732
import splitties.alertdialog.appcompat.negativeButton
2833
import splitties.alertdialog.appcompat.neutralButton
@@ -38,6 +43,8 @@ class RequestPermissionDelegate(
3843
private val notificationReceiverAdapter: NotificationReceiverAdapterImpl,
3944
private val buildConfigProvider: BuildConfigProvider,
4045
private val shizukuAdapter: ShizukuAdapter,
46+
private val navigationProvider: NavigationProvider,
47+
private val coroutineScope: CoroutineScope,
4148
) {
4249

4350
private val startActivityForResultLauncher =
@@ -58,7 +65,7 @@ class RequestPermissionDelegate(
5865
permissionAdapter.onPermissionsChanged()
5966
}
6067

61-
fun requestPermission(permission: Permission, navController: NavController?) {
68+
fun requestPermission(permission: Permission) {
6269
when (permission) {
6370
Permission.WRITE_SETTINGS -> requestWriteSettings()
6471
Permission.CAMERA -> requestPermissionLauncher.launch(Manifest.permission.CAMERA)
@@ -162,30 +169,29 @@ class RequestPermissionDelegate(
162169
}
163170

164171
private fun requestWriteSecureSettings() {
165-
if (permissionAdapter.isGranted(Permission.SHIZUKU) ||
166-
permissionAdapter.isGranted(Permission.ROOT)
167-
) {
168-
permissionAdapter.grant(Manifest.permission.WRITE_SECURE_SETTINGS)
172+
// Try granting with Shizuku, Root, or System Bridge
173+
permissionAdapter.grant(Manifest.permission.WRITE_SECURE_SETTINGS).onFailure { error ->
174+
activity.materialAlertDialog {
175+
titleResource = R.string.dialog_title_write_secure_settings
176+
messageResource = R.string.dialog_message_write_secure_settings
169177

170-
return
171-
}
178+
positiveButton(R.string.pos_proceed) {
179+
val destination = NavDestination.ProMode
172180

173-
activity.materialAlertDialog {
174-
titleResource = R.string.dialog_title_write_secure_settings
175-
messageResource = R.string.dialog_message_write_secure_settings
181+
coroutineScope.launch {
182+
navigationProvider.navigate(
183+
"grant_write_secure_settings_pro_mode",
184+
destination,
185+
)
186+
}
187+
}
176188

177-
positiveButton(R.string.pos_grant_write_secure_settings_guide) {
178-
UrlUtils.openUrl(
179-
activity,
180-
activity.str(R.string.url_grant_write_secure_settings_guide),
181-
)
182-
}
189+
negativeButton(R.string.neg_cancel) {
190+
it.cancel()
191+
}
183192

184-
negativeButton(R.string.neg_cancel) {
185-
it.cancel()
193+
show()
186194
}
187-
188-
show()
189195
}
190196
}
191197

base/src/main/res/values/strings.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,6 @@
328328
<string name="url_fingerprint_map_options_guide" translatable="false">https://docs.keymapper.club/redirects/fingerprint-map-options</string>
329329
<string name="url_quick_start_guide" translatable="false">https://docs.keymapper.club/redirects/quick-start</string>
330330
<string name="url_faq" translatable="false">https://docs.keymapper.club/redirects/faq</string>
331-
<string name="url_grant_write_secure_settings_guide" translatable="false">https://docs.keymapper.club/redirects/grant-write-secure-settings</string>
332331
<string name="url_dont_kill_my_app" translatable="false">https://dontkillmyapp.com</string>
333332
<string name="url_keymap_action_options_guide" translatable="false">https://docs.keymapper.club/redirects/keymap-action-options</string>
334333
<string name="url_trigger_key_options_guide" translatable="false">https://docs.keymapper.club/redirects/trigger-key-options</string>
@@ -427,7 +426,7 @@
427426
<string name="dialog_message_root_prompt">Please grant Key Mapper root permission in your root management app, such as Magisk.</string>
428427

429428
<string name="dialog_title_write_secure_settings">Grant WRITE_SECURE_SETTINGS permission</string>
430-
<string name="dialog_message_write_secure_settings">A PC/Mac is required to grant this permission. Read the online guide.</string>
429+
<string name="dialog_message_write_secure_settings">You will need to use PRO mode to grant this permission.</string>
431430

432431
<string name="dialog_message_cant_find_accessibility_settings_page">Your device doesn\'t seem to have an accessibility services settings page. Tap \"guide\" to read the online guide that explains how to fix this.</string>
433432
<string name="dialog_message_parallel_trigger_order">You must hold down the keys in the order that they are listed.</string>
@@ -487,7 +486,6 @@
487486

488487
<string name="pos_done">Done</string>
489488
<string name="pos_kill">Kill</string>
490-
<string name="pos_grant_write_secure_settings_guide">Guide</string>
491489
<string name="pos_start_service_with_adb_guide">Guide</string>
492490
<string name="pos_change_location">Change</string>
493491
<string name="pos_turn_off_stock_battery_optimisation">Fix partially</string>

0 commit comments

Comments
 (0)