Remove hardcoded strings in apk-ng

This commit is contained in:
topjohnwu
2026-04-14 07:16:59 +00:00
committed by John Wu
parent 4a1a069ad2
commit 81413b0f10
25 changed files with 74 additions and 96 deletions
+1
View File
@@ -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
@@ -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())
+2 -1
View File
@@ -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>
+2 -1
View File
@@ -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>
+1
View File
@@ -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" }