ViewModel refactoring: Settings part

User restriction shortcuts
Optimize ShortcutUtils
Fix Private DNS bug
This commit is contained in:
BinTianqi
2025-10-12 13:16:50 +08:00
parent 44aad18814
commit 9e1d18b8e7
22 changed files with 420 additions and 266 deletions

View File

@@ -122,6 +122,7 @@ import kotlin.reflect.jvm.jvmErasure
class MyViewModel(application: Application): AndroidViewModel(application) {
val myRepo = getApplication<MyApplication>().myRepo
val PM = application.packageManager
val theme = MutableStateFlow(ThemeSettings(SP.materialYou, SP.darkTheme, SP.blackTheme))
fun changeTheme(newTheme: ThemeSettings) {
theme.value = newTheme
@@ -129,6 +130,54 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
SP.darkTheme = newTheme.darkTheme
SP.blackTheme = newTheme.blackTheme
}
fun getDisplayDangerousFeatures(): Boolean {
return SP.displayDangerousFeatures
}
fun getShortcutsEnabled(): Boolean {
return SP.shortcuts
}
fun setDisplayDangerousFeatures(state: Boolean) {
SP.displayDangerousFeatures = state
}
fun setShortcutsEnabled(enabled: Boolean) {
SP.shortcuts = enabled
ShortcutUtils.setAllShortcuts(application, enabled)
}
fun getAppLockConfig(): AppLockConfig {
val passwordHash = SP.lockPasswordHash
return AppLockConfig(passwordHash?.ifEmpty { null }, SP.biometricsUnlock, SP.lockWhenLeaving)
}
fun setAppLockConfig(config: AppLockConfig) {
SP.lockPasswordHash = if (config.password == null) {
""
} else {
config.password.hash()
}
SP.biometricsUnlock = config.biometrics
SP.lockWhenLeaving = config.whenLeaving
}
fun getApiEnabled(): Boolean {
return SP.apiKeyHash?.isNotEmpty() ?: false
}
fun setApiKey(key: String) {
SP.apiKeyHash = if (key.isEmpty()) "" else key.hash()
}
fun getEnabledNotifications(): List<NotificationType> {
val list = SP.notifications?.split(',')?.mapNotNull { it.toIntOrNull() }
return if (list == null) {
NotificationType.entries
} else {
NotificationType.entries.filter { it.id in list }
}
}
fun setNotificationEnabled(type: NotificationType, enabled: Boolean) {
val list = SP.notifications?.split(',')?.mapNotNull { it.toIntOrNull() }
SP.notifications = if (list == null) {
NotificationType.entries.minus(type).map { it.id }
} else {
list.run { if (enabled) plus(type.id) else minus(type.id) }
}.joinToString { it.toString() }
}
val chosenPackage = Channel<String>(1, BufferOverflow.DROP_LATEST)
@@ -1083,11 +1132,17 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
DPM.clearUserRestriction(DAR, name)
}
userRestrictions.update { it.plus(name to state) }
ShortcutUtils.updateUserRestrictionShortcut(application, name, !state, true)
true
} catch (_: SecurityException) {
false
}
}
fun createUserRestrictionShortcut(id: String): Boolean {
return ShortcutUtils.setUserRestrictionShortcut(
application, id, userRestrictions.value[id] ?: true
)
}
fun createWorkProfile(options: CreateWorkProfileOptions): Intent {
val intent = Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)
if (VERSION.SDK_INT >= 23) {
@@ -1478,7 +1533,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
fun getPrivateDns(): PrivateDnsConfiguration {
val mode = DPM.getGlobalPrivateDnsMode(DAR)
return PrivateDnsConfiguration(
PrivateDnsMode.entries.find { it.id == mode }!!, DPM.getGlobalPrivateDnsHost(DAR) ?: ""
PrivateDnsMode.entries.find { it.id == mode }, DPM.getGlobalPrivateDnsHost(DAR) ?: ""
)
}
@Suppress("PrivateApi")
@@ -1489,7 +1544,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
field.isAccessible = true
val dpm = field.get(DPM) as IDevicePolicyManager
val host = if (conf.mode == PrivateDnsMode.Host) conf.host else null
val result = dpm.setGlobalPrivateDns(DAR, conf.mode.id, host)
val result = dpm.setGlobalPrivateDns(DAR, conf.mode!!.id, host)
result == DevicePolicyManager.PRIVATE_DNS_SET_NO_ERROR
} catch (e: Exception) {
e.printStackTrace()
@@ -1669,7 +1724,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
fun getRpTokenState(): RpTokenState {
return try {
RpTokenState(true, DPM.isResetPasswordTokenActive(DAR))
} catch (_: IllegalArgumentException) {
} catch (_: IllegalStateException) {
RpTokenState(false, false)
}
}