diff --git a/app/apk-ng/build.gradle.kts b/app/apk-ng/build.gradle.kts index 3270089f9..015931db3 100644 --- a/app/apk-ng/build.gradle.kts +++ b/app/apk-ng/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { // Compose implementation(libs.compose.ui) + implementation(libs.accompanist.drawablepainter) implementation(libs.compose.ui.tooling.preview) debugImplementation(libs.compose.ui.tooling) implementation(libs.compose.material.icons.extended) diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/deny/DenyListScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/deny/DenyListScreen.kt index 21df2ceac..190f2d51e 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/deny/DenyListScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/deny/DenyListScreen.kt @@ -48,7 +48,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.unit.dp -import com.topjohnwu.magisk.ui.util.rememberDrawablePainter +import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.topjohnwu.magisk.core.R as CoreR @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/home/HomeScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/home/HomeScreen.kt index 18c7cc7b5..aa51d15d3 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/home/HomeScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/home/HomeScreen.kt @@ -671,14 +671,14 @@ private fun SupportCard(onLinkClicked: (String) -> Unit) { IconButton(onClick = { onLinkClicked(Const.Url.PATREON_URL) }) { Icon( painter = painterResource(CoreR.drawable.ic_patreon), - contentDescription = "Patreon", + contentDescription = stringResource(CoreR.string.patreon), modifier = Modifier.size(32.dp) ) } IconButton(onClick = { onLinkClicked("https://paypal.me/magiskdonate") }) { Icon( painter = painterResource(CoreR.drawable.ic_paypal), - contentDescription = "PayPal", + contentDescription = stringResource(CoreR.string.paypal), modifier = Modifier.size(32.dp) ) } @@ -687,30 +687,30 @@ private fun SupportCard(onLinkClicked: (String) -> Unit) { } } -private data class LinkInfo(val label: String, val icon: Int, val url: String) +private data class LinkInfo(val label: Int, val icon: Int, val url: String) private data class DeveloperInfo(val name: String, val links: List) private val developers = listOf( DeveloperInfo("topjohnwu", listOf( - LinkInfo("Twitter", CoreR.drawable.ic_twitter, "https://twitter.com/topjohnwu"), - LinkInfo("GitHub", CoreR.drawable.ic_github, Const.Url.SOURCE_CODE_URL), + LinkInfo(CoreR.string.twitter, CoreR.drawable.ic_twitter, "https://twitter.com/topjohnwu"), + LinkInfo(CoreR.string.github, CoreR.drawable.ic_github, Const.Url.SOURCE_CODE_URL), )), DeveloperInfo("vvb2060", listOf( - LinkInfo("Twitter", CoreR.drawable.ic_twitter, "https://twitter.com/vvb2060"), - LinkInfo("GitHub", CoreR.drawable.ic_github, "https://github.com/vvb2060"), + LinkInfo(CoreR.string.twitter, CoreR.drawable.ic_twitter, "https://twitter.com/vvb2060"), + LinkInfo(CoreR.string.github, CoreR.drawable.ic_github, "https://github.com/vvb2060"), )), DeveloperInfo("yujincheng08", listOf( - LinkInfo("Sponsor", CoreR.drawable.ic_favorite, "https://github.com/sponsors/yujincheng08"), - LinkInfo("Twitter", CoreR.drawable.ic_twitter, "https://twitter.com/shanasaimoe"), - LinkInfo("GitHub", CoreR.drawable.ic_github, "https://github.com/yujincheng08"), + LinkInfo(CoreR.string.sponsor, CoreR.drawable.ic_favorite, "https://github.com/sponsors/yujincheng08"), + LinkInfo(CoreR.string.twitter, CoreR.drawable.ic_twitter, "https://twitter.com/shanasaimoe"), + LinkInfo(CoreR.string.github, CoreR.drawable.ic_github, "https://github.com/yujincheng08"), )), DeveloperInfo("rikkawww", listOf( - LinkInfo("Twitter", CoreR.drawable.ic_twitter, "https://twitter.com/rikkawww"), - LinkInfo("GitHub", CoreR.drawable.ic_github, "https://github.com/rikkawww"), + LinkInfo(CoreR.string.twitter, CoreR.drawable.ic_twitter, "https://twitter.com/rikkawww"), + LinkInfo(CoreR.string.github, CoreR.drawable.ic_github, "https://github.com/rikkawww"), )), DeveloperInfo("canyie", listOf( - LinkInfo("Twitter", CoreR.drawable.ic_twitter, "https://twitter.com/canyie2977"), - LinkInfo("GitHub", CoreR.drawable.ic_github, "https://github.com/canyie"), + LinkInfo(CoreR.string.twitter, CoreR.drawable.ic_twitter, "https://twitter.com/canyie2977"), + LinkInfo(CoreR.string.github, CoreR.drawable.ic_github, "https://github.com/canyie"), )), ) @@ -740,7 +740,7 @@ private fun DevelopersCard(onLinkClicked: (String) -> Unit) { IconButton(onClick = { onLinkClicked(link.url) }) { Icon( painter = painterResource(link.icon), - contentDescription = link.label, + contentDescription = stringResource(link.label), modifier = Modifier.size(24.dp) ) } @@ -1051,7 +1051,8 @@ private fun EnvFixComposableDialog( @Composable private fun HideAppDialog(onDismiss: () -> Unit, onConfirm: (String) -> Unit) { val showState = rememberSaveable { mutableStateOf(true) } - var appName by rememberSaveable { mutableStateOf("Settings") } + val defaultName = stringResource(CoreR.string.settings) + var appName by rememberSaveable { mutableStateOf(defaultName) } val isError = appName.length > AppMigration.MAX_LABEL_LENGTH || appName.isBlank() AlertDialog( diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/log/LogScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/log/LogScreen.kt index 7b4d39fdd..4588743d3 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/log/LogScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/log/LogScreen.kt @@ -29,9 +29,9 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.Scaffold import androidx.compose.material3.Tab -import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults @@ -58,10 +58,10 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.topjohnwu.magisk.core.ktx.timeDateFormat import com.topjohnwu.magisk.core.ktx.toTime import com.topjohnwu.magisk.core.model.su.SuLog -import com.topjohnwu.magisk.ui.util.rememberDrawablePainter import com.topjohnwu.magisk.core.R as CoreR @OptIn(ExperimentalMaterial3Api::class) @@ -273,7 +273,7 @@ private fun SuLogCard(log: SuLog) { @Composable private fun SuActionBadge(allowed: Boolean) { val bg = if (allowed) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error - val text = if (allowed) "Approved" else "Rejected" + val text = if (allowed) stringResource(CoreR.string.granted) else stringResource(CoreR.string.denied) Badge( containerColor = bg, ) { Text(text = text) } diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleScreen.kt index a7f1c99d4..037d25ff6 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleScreen.kt @@ -72,6 +72,7 @@ import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.component.ConfirmResult import com.topjohnwu.magisk.ui.component.MarkdownTextAsync import com.topjohnwu.magisk.ui.component.rememberConfirmDialog +import com.topjohnwu.magisk.utils.textHolder import kotlinx.coroutines.launch import com.topjohnwu.magisk.core.R as CoreR @@ -284,7 +285,7 @@ private fun ModuleCard(item: ModuleItem, viewModel: ModuleViewModel, onUpdateCli if (item.showNotice) { Spacer(Modifier.height(4.dp)) Text( - text = item.noticeText, + text = textHolder(item.noticeText), style = MaterialTheme.typography.bodyMedium, color = colorScheme.primary, ) diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index c4facc338..7a7a7a5c2 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -8,9 +8,12 @@ import androidx.compose.runtime.setValue import com.topjohnwu.magisk.arch.AsyncLoadViewModel import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.R as CoreR import com.topjohnwu.magisk.core.download.Subject import com.topjohnwu.magisk.core.model.module.LocalModule import com.topjohnwu.magisk.core.model.module.OnlineModule +import com.topjohnwu.magisk.core.utils.TextHolder +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.ui.flash.FlashUtils import com.topjohnwu.magisk.ui.navigation.Route import com.topjohnwu.magisk.view.Notifications @@ -25,7 +28,7 @@ import kotlinx.parcelize.Parcelize class ModuleItem(val module: LocalModule) { val showNotice: Boolean val showAction: Boolean - val noticeText: String + val noticeText: TextHolder init { val isZygisk = module.isZygisk @@ -36,11 +39,12 @@ class ModuleItem(val module: LocalModule) { (Info.isZygiskEnabled && isRiru) || (!Info.isZygiskEnabled && isZygisk) showAction = module.hasAction && !showNotice - noticeText = when { - zygiskUnloaded -> "Zygisk module not loaded due to incompatibility" - isRiru -> "Module suspended because Zygisk is enabled" - else -> "Module suspended because Zygisk isn't enabled" - } + noticeText = + when { + zygiskUnloaded -> CoreR.string.zygisk_module_unloaded.asText() + isRiru -> CoreR.string.suspend_text_riru.asText(CoreR.string.zygisk.asText()) + else -> CoreR.string.suspend_text_zygisk.asText(CoreR.string.zygisk.asText()) + } } var isEnabled by mutableStateOf(module.enable) diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsScreen.kt index 331ba3304..095983ef5 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsScreen.kt @@ -545,7 +545,8 @@ private fun DownloadPathDialog(show: Boolean, onDismiss: () -> Unit) { private fun HideAppDialog(show: Boolean, onDismiss: () -> Unit, onConfirm: (String) -> Unit) { val showState = rememberSaveable { mutableStateOf(show) } showState.value = show - var appName by rememberSaveable { mutableStateOf("Settings") } + val defaultName = stringResource(CoreR.string.settings) + var appName by rememberSaveable { mutableStateOf(defaultName) } val isError = appName.length > AppMigration.MAX_LABEL_LENGTH || appName.isBlank() if (showState.value) { diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserDetailScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserDetailScreen.kt index 590c9e211..65e9df348 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserDetailScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserDetailScreen.kt @@ -37,10 +37,10 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.topjohnwu.magisk.ui.component.ConfirmResult import com.topjohnwu.magisk.ui.component.SettingsSwitch import com.topjohnwu.magisk.ui.component.rememberConfirmDialog -import com.topjohnwu.magisk.ui.util.rememberDrawablePainter import kotlinx.coroutines.launch import com.topjohnwu.magisk.core.R as CoreR diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserScreen.kt index 894a6bd85..ee3d628fe 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserScreen.kt @@ -38,9 +38,9 @@ import androidx.compose.ui.draw.alpha import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.topjohnwu.magisk.ui.navigation.LocalNavigator import com.topjohnwu.magisk.ui.navigation.Route -import com.topjohnwu.magisk.ui.util.rememberDrawablePainter import com.topjohnwu.magisk.core.R as CoreR @OptIn(ExperimentalMaterial3Api::class) @@ -187,6 +187,6 @@ internal fun SharedUidBadge(modifier: Modifier = Modifier) { modifier = modifier, containerColor = MaterialTheme.colorScheme.primary, ) { - Text("SharedUID") + Text(stringResource(CoreR.string.shared_uid)) } } diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestScreen.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestScreen.kt index b909fab8d..ea59af806 100644 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestScreen.kt +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestScreen.kt @@ -36,9 +36,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.topjohnwu.magisk.core.ktx.toast import com.topjohnwu.magisk.ui.superuser.SharedUidBadge -import com.topjohnwu.magisk.ui.util.rememberDrawablePainter import com.topjohnwu.magisk.core.R as CoreR @OptIn(ExperimentalComposeUiApi::class) @@ -135,7 +135,7 @@ fun SuRequestScreen(viewModel: SuRequestViewModel) { Spacer(Modifier.height(16.dp)) Text( - text = "Permission timeout: $sliderLabel", + text = "${stringResource(CoreR.string.request_timeout)}: $sliderLabel", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.fillMaxWidth().padding(start = 8.dp), diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/util/DrawablePainter.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/util/DrawablePainter.kt deleted file mode 100644 index 51b4f8618..000000000 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/util/DrawablePainter.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.topjohnwu.magisk.ui.util - -import android.graphics.Bitmap -import android.graphics.drawable.Drawable -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.graphics.painter.Painter - -@Composable -fun rememberDrawablePainter(drawable: Drawable): Painter { - return remember(drawable) { - val w = drawable.intrinsicWidth.coerceAtLeast(1) - val h = drawable.intrinsicHeight.coerceAtLeast(1) - val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) - val canvas = android.graphics.Canvas(bitmap) - drawable.setBounds(0, 0, w, h) - drawable.draw(canvas) - BitmapPainter(bitmap.asImageBitmap()) - } -} diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/AccessibilityUtils.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/AccessibilityUtils.kt deleted file mode 100644 index 4ac85267f..000000000 --- a/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/AccessibilityUtils.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.topjohnwu.magisk.utils - -import android.content.ContentResolver -import android.provider.Settings - -class AccessibilityUtils { - companion object { - fun isAnimationEnabled(cr: ContentResolver): Boolean { - return !(Settings.Global.getFloat(cr, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) == 0.0f - && Settings.Global.getFloat(cr, Settings.Global.TRANSITION_ANIMATION_SCALE, 1.0f) == 0.0f - && Settings.Global.getFloat(cr, Settings.Global.WINDOW_ANIMATION_SCALE, 1.0f) == 0.0f) - } - } -} diff --git a/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/Compose.kt b/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/Compose.kt new file mode 100644 index 000000000..bd842e509 --- /dev/null +++ b/app/apk-ng/src/main/java/com/topjohnwu/magisk/utils/Compose.kt @@ -0,0 +1,8 @@ +package com.topjohnwu.magisk.utils + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalResources +import com.topjohnwu.magisk.core.utils.TextHolder + +@Composable +fun textHolder(holder: TextHolder) = holder.getText(LocalResources.current) diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt b/app/apk/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt index 9cc6084d9..b8d37c419 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt @@ -39,7 +39,7 @@ import com.google.android.material.textfield.TextInputLayout import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.di.ServiceLocator import com.topjohnwu.magisk.core.model.su.SuPolicy -import com.topjohnwu.magisk.utils.TextHolder +import com.topjohnwu.magisk.core.utils.TextHolder import com.topjohnwu.superuser.internal.UiThreadHandler import com.topjohnwu.widget.IndeterminateCheckBox import kotlin.math.roundToInt diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt b/app/apk/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt index c73fd31f6..fc230a7a7 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt @@ -12,8 +12,8 @@ import com.topjohnwu.magisk.arch.UIActivity import com.topjohnwu.magisk.arch.ViewEvent import com.topjohnwu.magisk.core.base.ContentResultCallback import com.topjohnwu.magisk.core.base.relaunch -import com.topjohnwu.magisk.utils.TextHolder -import com.topjohnwu.magisk.utils.asText +import com.topjohnwu.magisk.core.utils.TextHolder +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.magisk.view.Shortcuts diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index a82b6cc20..4a0aa8275 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -21,13 +21,13 @@ import com.topjohnwu.magisk.core.download.Subject.App import com.topjohnwu.magisk.core.ktx.await import com.topjohnwu.magisk.core.ktx.toast import com.topjohnwu.magisk.core.repository.NetworkService +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.databinding.bindExtra import com.topjohnwu.magisk.databinding.set import com.topjohnwu.magisk.dialog.EnvFixDialog import com.topjohnwu.magisk.dialog.ManagerInstallDialog import com.topjohnwu.magisk.dialog.UninstallDialog import com.topjohnwu.magisk.events.SnackbarEvent -import com.topjohnwu.magisk.utils.asText import com.topjohnwu.superuser.Shell import kotlin.math.roundToInt import com.topjohnwu.magisk.core.R as CoreR diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/module/ModuleRvItem.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/module/ModuleRvItem.kt index 97c164db0..69310c4b9 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/module/ModuleRvItem.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/module/ModuleRvItem.kt @@ -5,13 +5,13 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.model.module.LocalModule +import com.topjohnwu.magisk.core.utils.TextHolder +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.databinding.DiffItem import com.topjohnwu.magisk.databinding.ItemWrapper import com.topjohnwu.magisk.databinding.ObservableRvItem import com.topjohnwu.magisk.databinding.RvItem import com.topjohnwu.magisk.databinding.set -import com.topjohnwu.magisk.utils.TextHolder -import com.topjohnwu.magisk.utils.asText import com.topjohnwu.magisk.core.R as CoreR object InstallModule : RvItem(), DiffItem { diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/BaseSettingsItem.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/BaseSettingsItem.kt index fd4563644..976059705 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/BaseSettingsItem.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/BaseSettingsItem.kt @@ -7,9 +7,9 @@ import androidx.databinding.Bindable import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.ktx.activity +import com.topjohnwu.magisk.core.utils.TextHolder import com.topjohnwu.magisk.databinding.ObservableRvItem import com.topjohnwu.magisk.databinding.set -import com.topjohnwu.magisk.utils.TextHolder import com.topjohnwu.magisk.view.MagiskDialog sealed class BaseSettingsItem : ObservableRvItem() { @@ -110,7 +110,7 @@ sealed class BaseSettingsItem : ObservableRvItem() { open fun descriptions(res: Resources) = res.getArrayOrEmpty(descriptionRes) override val description = object : TextHolder() { - override fun getText(resources: Resources): CharSequence { + override fun getText(resources: Resources): String { return descriptions(resources).getOrElse(value) { "" } } } diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index 2bb886411..aecf0789c 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -8,7 +8,6 @@ import android.view.View import androidx.databinding.Bindable import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.core.BuildConfig import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info @@ -16,12 +15,12 @@ import com.topjohnwu.magisk.core.ktx.activity import com.topjohnwu.magisk.core.tasks.AppMigration import com.topjohnwu.magisk.core.utils.LocaleSetting import com.topjohnwu.magisk.core.utils.MediaStoreUtils +import com.topjohnwu.magisk.core.utils.TextHolder +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding import com.topjohnwu.magisk.databinding.set -import com.topjohnwu.magisk.utils.TextHolder -import com.topjohnwu.magisk.utils.asText import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.superuser.Shell import com.topjohnwu.magisk.core.R as CoreR diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt index 3922c92bc..3e0116b2b 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt @@ -16,6 +16,7 @@ import com.topjohnwu.magisk.core.R import com.topjohnwu.magisk.core.data.magiskdb.PolicyDao import com.topjohnwu.magisk.core.ktx.getLabel import com.topjohnwu.magisk.core.model.su.SuPolicy +import com.topjohnwu.magisk.core.utils.asText import com.topjohnwu.magisk.databinding.MergeObservableList import com.topjohnwu.magisk.databinding.RvItem import com.topjohnwu.magisk.databinding.bindExtra @@ -24,7 +25,6 @@ import com.topjohnwu.magisk.databinding.set import com.topjohnwu.magisk.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.events.AuthEvent import com.topjohnwu.magisk.events.SnackbarEvent -import com.topjohnwu.magisk.utils.asText import com.topjohnwu.magisk.view.TextItem import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt index 4d1a830f7..ed7be09b4 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt @@ -27,11 +27,11 @@ import com.topjohnwu.magisk.core.ktx.toast import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.ALLOW import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.DENY import com.topjohnwu.magisk.core.su.SuRequestHandler +import com.topjohnwu.magisk.core.utils.TextHolder import com.topjohnwu.magisk.databinding.set import com.topjohnwu.magisk.events.AuthEvent import com.topjohnwu.magisk.events.DieEvent import com.topjohnwu.magisk.events.ShowUIEvent -import com.topjohnwu.magisk.utils.TextHolder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit.SECONDS @@ -175,7 +175,7 @@ class SuRequestViewModel( var seconds = 0 set(value) = set(value, field, { field = it }, BR.denyText) - override fun getText(resources: Resources): CharSequence { + override fun getText(resources: Resources): String { return if (seconds != 0) "${resources.getString(R.string.deny)} ($seconds)" else diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/utils/TextHolder.kt similarity index 68% rename from app/apk/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt rename to app/core/src/main/java/com/topjohnwu/magisk/core/utils/TextHolder.kt index e1c2141ce..aadca8bab 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/utils/TextHolder.kt @@ -1,24 +1,20 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.content.res.Resources abstract class TextHolder { open val isEmpty: Boolean get() = false - abstract fun getText(resources: Resources): CharSequence + abstract fun getText(resources: Resources): String // --- - class String( - private val value: CharSequence - ) : TextHolder() { + class Str(private val value: String) : TextHolder() { override val isEmpty get() = value.isEmpty() override fun getText(resources: Resources) = value } - open class Resource( - protected val value: Int - ) : TextHolder() { + open class Resource(protected val value: Int) : TextHolder() { override val isEmpty get() = value == 0 override fun getText(resources: Resources) = resources.getString(value) } @@ -27,7 +23,7 @@ abstract class TextHolder { value: Int, private vararg val params: Any ) : Resource(value) { - override fun getText(resources: Resources): kotlin.String { + override fun getText(resources: Resources): String { // Replace TextHolder with strings val args = params.map { if (it is TextHolder) it.getText(resources) else it } return resources.getString(value, *args.toTypedArray()) @@ -37,10 +33,10 @@ abstract class TextHolder { // --- companion object { - val EMPTY = String("") + val EMPTY = Str("") } } fun Int.asText(): TextHolder = TextHolder.Resource(this) fun Int.asText(vararg params: Any): TextHolder = TextHolder.ResourceArgs(this, *params) -fun CharSequence.asText(): TextHolder = TextHolder.String(this) +fun String.asText(): TextHolder = TextHolder.Str(this.toString()) diff --git a/app/core/src/main/res/values/resources.xml b/app/core/src/main/res/values/resources.xml index b522b5b3d..849fbe3de 100644 --- a/app/core/src/main/res/values/resources.xml +++ b/app/core/src/main/res/values/resources.xml @@ -5,15 +5,16 @@ Magisk Zygisk Ramdisk + SharedUID PayPal Patreon Twitter GitHub + Sponsor @drawable/ic_logo true - diff --git a/app/core/src/main/res/values/strings.xml b/app/core/src/main/res/values/strings.xml index ec2e87862..dd2e639f4 100644 --- a/app/core/src/main/res/values/strings.xml +++ b/app/core/src/main/res/values/strings.xml @@ -110,6 +110,8 @@ Target PID: %s SELinux context: %s Supplementary group: %s + Granted + Denied Show system apps @@ -279,5 +281,4 @@ No app found to handle this action Reboot to apply changes This will restore the hidden app back to the original app. Do you really want to do this? - diff --git a/app/gradle/libs.versions.toml b/app/gradle/libs.versions.toml index 4050943df..0dd5881af 100644 --- a/app/gradle/libs.versions.toml +++ b/app/gradle/libs.versions.toml @@ -64,6 +64,7 @@ rikka-insets = { module = "dev.rikka.rikkax.insets:insets", version.ref = "rikka # Compose activity-compose = { module = "androidx.activity:activity-compose", version = "1.13.0" } +accompanist-drawablepainter = { module = "com.google.accompanist:accompanist-drawablepainter", version = "0.37.3" } compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose-ui" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose-ui" } compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose-ui" }