mirror of
https://github.com/topjohnwu/Magisk.git
synced 2026-07-28 14:47:21 -07:00
Remove hardcoded strings in apk-ng
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<LinkInfo>)
|
||||
|
||||
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(
|
||||
|
||||
@@ -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) }
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<InstallModule> {
|
||||
|
||||
@@ -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) { "" }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+7
-11
@@ -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())
|
||||
@@ -5,15 +5,16 @@
|
||||
<string name="magisk" translatable="false">Magisk</string>
|
||||
<string name="zygisk" translatable="false">Zygisk</string>
|
||||
<string name="ramdisk" translatable="false">Ramdisk</string>
|
||||
<string name="shared_uid" translatable="false">SharedUID</string>
|
||||
<string name="empty" translatable="false"/>
|
||||
|
||||
<string name="paypal" translatable="false">PayPal</string>
|
||||
<string name="patreon" translatable="false">Patreon</string>
|
||||
<string name="twitter" translatable="false">Twitter</string>
|
||||
<string name="github" translatable="false">GitHub</string>
|
||||
<string name="sponsor" translatable="false">Sponsor</string>
|
||||
|
||||
<drawable name="ic_launcher">@drawable/ic_logo</drawable>
|
||||
|
||||
<bool name="enable_fg_service">true</bool>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -110,6 +110,8 @@
|
||||
<string name="target_pid">Target PID: %s</string>
|
||||
<string name="selinux_context">SELinux context: %s</string>
|
||||
<string name="supp_group">Supplementary group: %s</string>
|
||||
<string name="granted">Granted</string>
|
||||
<string name="denied">Denied</string>
|
||||
|
||||
<!--MagiskHide-->
|
||||
<string name="show_system_app">Show system apps</string>
|
||||
@@ -279,5 +281,4 @@
|
||||
<string name="app_not_found">No app found to handle this action</string>
|
||||
<string name="reboot_apply_change">Reboot to apply changes</string>
|
||||
<string name="restore_app_confirmation">This will restore the hidden app back to the original app. Do you really want to do this?</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user