mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-23 18:15:30 +00:00
Support using BiometricPrompt
This commit is contained in:
parent
576efbdc1b
commit
b29f0ca4d1
@ -120,6 +120,7 @@ dependencies {
|
||||
implementation "androidx.navigation:navigation-fragment-ktx:${vNav}"
|
||||
implementation "androidx.navigation:navigation-ui-ktx:${vNav}"
|
||||
|
||||
implementation 'androidx.biometric:biometric:1.0.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03'
|
||||
implementation 'androidx.preference:preference:1.1.0'
|
||||
|
@ -7,7 +7,6 @@
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
|
||||
<application
|
||||
android:name="a.e"
|
||||
@ -77,9 +76,13 @@
|
||||
<!-- We don't invalidate Room -->
|
||||
<service
|
||||
android:name="androidx.room.MultiInstanceInvalidationService"
|
||||
android:exported="false"
|
||||
tools:node="remove"/>
|
||||
|
||||
<!-- We don't use Device Credentials -->
|
||||
<activity
|
||||
android:name="androidx.biometric.DeviceCredentialHandlerActivity"
|
||||
tools:node="remove" />
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
@ -11,9 +11,8 @@ import com.topjohnwu.magisk.data.repository.DBConfig
|
||||
import com.topjohnwu.magisk.di.Protected
|
||||
import com.topjohnwu.magisk.extensions.get
|
||||
import com.topjohnwu.magisk.extensions.inject
|
||||
import com.topjohnwu.magisk.extensions.packageName
|
||||
import com.topjohnwu.magisk.model.preference.PreferenceModel
|
||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
||||
import com.topjohnwu.magisk.utils.BiometricHelper
|
||||
import com.topjohnwu.magisk.utils.Utils
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import com.topjohnwu.superuser.io.SuFile
|
||||
@ -32,7 +31,7 @@ object Config : PreferenceModel, DBConfig {
|
||||
const val ROOT_ACCESS = "root_access"
|
||||
const val SU_MULTIUSER_MODE = "multiuser_mode"
|
||||
const val SU_MNT_NS = "mnt_ns"
|
||||
const val SU_FINGERPRINT = "su_fingerprint"
|
||||
const val SU_BIOMETRIC = "su_biometric"
|
||||
const val SU_MANAGER = "requester"
|
||||
const val KEYSTORE = "keystore"
|
||||
|
||||
@ -127,7 +126,7 @@ object Config : PreferenceModel, DBConfig {
|
||||
var rootMode by dbSettings(Key.ROOT_ACCESS, Value.ROOT_ACCESS_APPS_AND_ADB)
|
||||
var suMntNamespaceMode by dbSettings(Key.SU_MNT_NS, Value.NAMESPACE_MODE_REQUESTER)
|
||||
var suMultiuserMode by dbSettings(Key.SU_MULTIUSER_MODE, Value.MULTIUSER_MODE_OWNER_ONLY)
|
||||
var suFingerprint by dbSettings(Key.SU_FINGERPRINT, false)
|
||||
var suBiometric by dbSettings(Key.SU_BIOMETRIC, false)
|
||||
var suManager by dbStrings(Key.SU_MANAGER, "", true)
|
||||
var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true)
|
||||
|
||||
@ -135,9 +134,18 @@ object Config : PreferenceModel, DBConfig {
|
||||
val downloadDirectory get() =
|
||||
Utils.ensureDownloadPath(downloadPath) ?: get<Context>().getExternalFilesDir(null)!!
|
||||
|
||||
fun initialize() = prefs.edit {
|
||||
private const val SU_FINGERPRINT = "su_fingerprint"
|
||||
|
||||
fun initialize() = prefs.also {
|
||||
if (it.getBoolean(SU_FINGERPRINT, false)) {
|
||||
suBiometric = true
|
||||
}
|
||||
}.edit {
|
||||
parsePrefs(this)
|
||||
|
||||
// Legacy stuff
|
||||
remove(SU_FINGERPRINT)
|
||||
|
||||
// Get actual state
|
||||
putBoolean(Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists())
|
||||
|
||||
@ -145,7 +153,7 @@ object Config : PreferenceModel, DBConfig {
|
||||
putString(Key.ROOT_ACCESS, rootMode.toString())
|
||||
putString(Key.SU_MNT_NS, suMntNamespaceMode.toString())
|
||||
putString(Key.SU_MULTIUSER_MODE, suMultiuserMode.toString())
|
||||
putBoolean(Key.SU_FINGERPRINT, FingerprintHelper.useFingerprint())
|
||||
putBoolean(Key.SU_BIOMETRIC, BiometricHelper.isEnabled)
|
||||
}.also {
|
||||
if (!prefs.contains(Key.UPDATE_CHANNEL))
|
||||
prefs.edit().putString(Key.UPDATE_CHANNEL, defaultChannel.toString()).apply()
|
||||
@ -154,7 +162,7 @@ object Config : PreferenceModel, DBConfig {
|
||||
private fun parsePrefs(editor: SharedPreferences.Editor) = editor.apply {
|
||||
val config = SuFile.open("/data/adb", Const.MANAGER_CONFIGS)
|
||||
if (config.exists()) runCatching {
|
||||
val input = SuFileInputStream(config).buffered()
|
||||
val input = SuFileInputStream(config)
|
||||
val parser = Xml.newPullParser()
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
|
||||
parser.setInput(input, "UTF-8")
|
||||
@ -205,9 +213,10 @@ object Config : PreferenceModel, DBConfig {
|
||||
fun export() {
|
||||
// Flush prefs to disk
|
||||
prefs.edit().commit()
|
||||
val context = get<Context>(Protected)
|
||||
val xml = File(
|
||||
"${get<Context>(Protected).filesDir.parent}/shared_prefs",
|
||||
"${packageName}_preferences.xml"
|
||||
"${context.filesDir.parent}/shared_prefs",
|
||||
"${context.packageName}_preferences.xml"
|
||||
)
|
||||
Shell.su("cat $xml > /data/adb/${Const.MANAGER_CONFIGS}").exec()
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.topjohnwu.magisk.base.viewmodel
|
||||
|
||||
import android.app.Activity
|
||||
import com.topjohnwu.magisk.base.BaseActivity
|
||||
import com.topjohnwu.magisk.extensions.doOnSubscribeUi
|
||||
import com.topjohnwu.magisk.model.events.BackPressEvent
|
||||
import com.topjohnwu.magisk.model.events.PermissionEvent
|
||||
@ -21,7 +21,7 @@ abstract class BaseViewModel(
|
||||
}
|
||||
}
|
||||
|
||||
fun withView(action: Activity.() -> Unit) {
|
||||
fun withView(action: BaseActivity<*, *>.() -> Unit) {
|
||||
ViewActionEvent(action).publish()
|
||||
}
|
||||
|
||||
|
@ -29,8 +29,8 @@ interface DBConfig {
|
||||
}
|
||||
|
||||
class DBSettingsValue(
|
||||
private val name: String,
|
||||
private val default: Int
|
||||
private val name: String,
|
||||
private val default: Int
|
||||
) : ReadWriteProperty<DBConfig, Int> {
|
||||
|
||||
private var value: Int? = null
|
||||
@ -47,29 +47,29 @@ class DBSettingsValue(
|
||||
this.value = value
|
||||
}
|
||||
thisRef.settingsDao.put(name, value)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
}
|
||||
}
|
||||
|
||||
class DBBoolSettings(
|
||||
name: String,
|
||||
default: Boolean
|
||||
name: String,
|
||||
default: Boolean
|
||||
) : ReadWriteProperty<DBConfig, Boolean> {
|
||||
|
||||
val base = DBSettingsValue(name, if (default) 1 else 0)
|
||||
|
||||
override fun getValue(thisRef: DBConfig, property: KProperty<*>): Boolean
|
||||
= base.getValue(thisRef, property) != 0
|
||||
override fun getValue(thisRef: DBConfig, property: KProperty<*>): Boolean =
|
||||
base.getValue(thisRef, property) != 0
|
||||
|
||||
override fun setValue(thisRef: DBConfig, property: KProperty<*>, value: Boolean) =
|
||||
base.setValue(thisRef, property, if (value) 1 else 0)
|
||||
base.setValue(thisRef, property, if (value) 1 else 0)
|
||||
}
|
||||
|
||||
class DBStringsValue(
|
||||
private val name: String,
|
||||
private val default: String,
|
||||
private val sync: Boolean
|
||||
private val name: String,
|
||||
private val default: String,
|
||||
private val sync: Boolean
|
||||
) : ReadWriteProperty<DBConfig, String> {
|
||||
|
||||
private var value: String? = null
|
||||
@ -90,16 +90,16 @@ class DBStringsValue(
|
||||
thisRef.stringDao.delete(name).blockingAwait()
|
||||
} else {
|
||||
thisRef.stringDao.delete(name)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
}
|
||||
} else {
|
||||
if (sync) {
|
||||
thisRef.stringDao.put(name, value).blockingAwait()
|
||||
} else {
|
||||
thisRef.stringDao.put(name, value)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.topjohnwu.magisk.model.events
|
||||
|
||||
import android.app.Activity
|
||||
import com.topjohnwu.magisk.base.BaseActivity
|
||||
import com.topjohnwu.magisk.model.entity.module.Repo
|
||||
import io.reactivex.subjects.PublishSubject
|
||||
|
||||
@ -28,7 +28,7 @@ class EnvFixEvent : ViewEvent()
|
||||
|
||||
class UpdateSafetyNetEvent : ViewEvent()
|
||||
|
||||
class ViewActionEvent(val action: Activity.() -> Unit) : ViewEvent()
|
||||
class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent()
|
||||
|
||||
class OpenFilePickerEvent : ViewEvent()
|
||||
|
||||
|
@ -24,7 +24,6 @@ import com.topjohnwu.magisk.model.entity.internal.Configuration
|
||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
||||
import com.topjohnwu.magisk.model.observer.Observer
|
||||
import com.topjohnwu.magisk.utils.*
|
||||
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import io.reactivex.Completable
|
||||
import org.koin.android.ext.android.inject
|
||||
@ -61,7 +60,7 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
multiuserConfig = findPreference(Config.Key.SU_MULTIUSER_MODE)!!
|
||||
nsConfig = findPreference(Config.Key.SU_MNT_NS)!!
|
||||
val reauth = findPreference<SwitchPreferenceCompat>(Config.Key.SU_REAUTH)!!
|
||||
val fingerprint = findPreference<SwitchPreferenceCompat>(Config.Key.SU_FINGERPRINT)!!
|
||||
val biometric = findPreference<SwitchPreferenceCompat>(Config.Key.SU_BIOMETRIC)!!
|
||||
val generalCatagory = findPreference<PreferenceCategory>("general")!!
|
||||
val magiskCategory = findPreference<PreferenceCategory>("magisk")!!
|
||||
val suCategory = findPreference<PreferenceCategory>("superuser")!!
|
||||
@ -88,11 +87,11 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
suCategory.removePreference(reauth)
|
||||
}
|
||||
|
||||
// Disable fingerprint option if not possible
|
||||
if (!FingerprintHelper.canUseFingerprint()) {
|
||||
fingerprint.isEnabled = false
|
||||
fingerprint.isChecked = false
|
||||
fingerprint.setSummary(R.string.disable_fingerprint)
|
||||
// Disable biometric option if not possible
|
||||
if (!BiometricHelper.isSupported) {
|
||||
biometric.isEnabled = false
|
||||
biometric.isChecked = false
|
||||
biometric.setSummary(R.string.no_biometric)
|
||||
}
|
||||
|
||||
if (Const.USER_ID == 0 && Info.isConnected.value && Shell.rootAccess()) {
|
||||
@ -208,13 +207,13 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
|
||||
override fun onPreferenceTreeClick(preference: Preference): Boolean {
|
||||
when (preference.key) {
|
||||
Config.Key.SU_FINGERPRINT -> {
|
||||
Config.Key.SU_BIOMETRIC -> {
|
||||
val checked = (preference as SwitchPreferenceCompat).isChecked
|
||||
preference.isChecked = !checked
|
||||
FingerprintAuthDialog(requireActivity()) {
|
||||
BiometricHelper.authenticate(requireActivity()) {
|
||||
preference.isChecked = checked
|
||||
Config.suFingerprint = checked
|
||||
}.show()
|
||||
Config.suBiometric = checked
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
|
@ -15,11 +15,10 @@ import com.topjohnwu.magisk.model.entity.recycler.PolicyRvItem
|
||||
import com.topjohnwu.magisk.model.events.PolicyEnableEvent
|
||||
import com.topjohnwu.magisk.model.events.PolicyUpdateEvent
|
||||
import com.topjohnwu.magisk.model.events.SnackbarEvent
|
||||
import com.topjohnwu.magisk.utils.BiometricHelper
|
||||
import com.topjohnwu.magisk.utils.DiffObservableList
|
||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
||||
import com.topjohnwu.magisk.utils.RxBus
|
||||
import com.topjohnwu.magisk.view.dialogs.CustomAlertDialog
|
||||
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
||||
import io.reactivex.Single
|
||||
import io.reactivex.disposables.Disposable
|
||||
import me.tatarka.bindingcollectionadapter2.ItemBinding
|
||||
@ -83,8 +82,8 @@ class SuperuserViewModel(
|
||||
.add()
|
||||
|
||||
withView {
|
||||
if (FingerprintHelper.useFingerprint()) {
|
||||
FingerprintAuthDialog(this) { updateState() }.show()
|
||||
if (BiometricHelper.isEnabled) {
|
||||
BiometricHelper.authenticate(this) { updateState() }
|
||||
} else {
|
||||
CustomAlertDialog(this)
|
||||
.setTitle(R.string.su_revoke_title)
|
||||
@ -131,12 +130,12 @@ class SuperuserViewModel(
|
||||
.add()
|
||||
}
|
||||
|
||||
if (FingerprintHelper.useFingerprint()) {
|
||||
if (BiometricHelper.isEnabled) {
|
||||
withView {
|
||||
FingerprintAuthDialog(this, { updateState() }, {
|
||||
BiometricHelper.authenticate(this, onError = {
|
||||
ignoreNext = item
|
||||
item.isEnabled.toggle()
|
||||
}).show()
|
||||
}) { updateState() }
|
||||
}
|
||||
} else {
|
||||
updateState()
|
||||
|
@ -9,6 +9,7 @@ import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.base.BaseActivity
|
||||
import com.topjohnwu.magisk.databinding.ActivityRequestBinding
|
||||
import com.topjohnwu.magisk.model.events.DieEvent
|
||||
import com.topjohnwu.magisk.model.events.ViewActionEvent
|
||||
import com.topjohnwu.magisk.model.events.ViewEvent
|
||||
import com.topjohnwu.magisk.utils.SuHandler
|
||||
import com.topjohnwu.magisk.utils.SuHandler.REQUEST
|
||||
@ -56,6 +57,7 @@ open class SuRequestActivity : BaseActivity<SuRequestViewModel, ActivityRequestB
|
||||
override fun onEventDispatched(event: ViewEvent) {
|
||||
super.onEventDispatched(event)
|
||||
when (event) {
|
||||
is ViewActionEvent -> event.action(this)
|
||||
is DieEvent -> finish()
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import android.content.SharedPreferences
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Resources
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.hardware.fingerprint.FingerprintManager
|
||||
import android.os.CountDownTimer
|
||||
import com.topjohnwu.magisk.BuildConfig
|
||||
import com.topjohnwu.magisk.Config
|
||||
@ -19,8 +18,8 @@ import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
||||
import com.topjohnwu.magisk.model.entity.recycler.SpinnerRvItem
|
||||
import com.topjohnwu.magisk.model.entity.toPolicy
|
||||
import com.topjohnwu.magisk.model.events.DieEvent
|
||||
import com.topjohnwu.magisk.utils.BiometricHelper
|
||||
import com.topjohnwu.magisk.utils.DiffObservableList
|
||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
||||
import com.topjohnwu.magisk.utils.KObservableField
|
||||
import com.topjohnwu.magisk.utils.SuConnector
|
||||
import me.tatarka.bindingcollectionadapter2.BindingListViewAdapter
|
||||
@ -43,7 +42,6 @@ class SuRequestViewModel(
|
||||
val denyText = KObservableField(resources.getString(R.string.deny))
|
||||
val warningText = KObservableField<CharSequence>(resources.getString(R.string.su_warning))
|
||||
|
||||
val canUseFingerprint = KObservableField(FingerprintHelper.useFingerprint())
|
||||
val selectedItemPosition = KObservableField(0)
|
||||
|
||||
private val items = DiffObservableList(ComparableRvItem.callback)
|
||||
@ -68,8 +66,16 @@ class SuRequestViewModel(
|
||||
}
|
||||
|
||||
fun grantPressed() {
|
||||
handleAction(MagiskPolicy.ALLOW)
|
||||
timer.cancel()
|
||||
cancelTimer()
|
||||
if (BiometricHelper.isEnabled) {
|
||||
withView {
|
||||
BiometricHelper.authenticate(this) {
|
||||
handleAction(MagiskPolicy.ALLOW)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handleAction(MagiskPolicy.ALLOW)
|
||||
}
|
||||
}
|
||||
|
||||
fun denyPressed() {
|
||||
@ -137,13 +143,6 @@ class SuRequestViewModel(
|
||||
}
|
||||
timer.start()
|
||||
cancelTasks.add { cancelTimer() }
|
||||
|
||||
if (canUseFingerprint.value)
|
||||
runCatching {
|
||||
val helper = SuFingerprint()
|
||||
helper.authenticate()
|
||||
cancelTasks.add { helper.cancel() }
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleAction() {
|
||||
@ -182,24 +181,4 @@ class SuRequestViewModel(
|
||||
}
|
||||
}
|
||||
|
||||
private inner class SuFingerprint @Throws(Exception::class)
|
||||
internal constructor() : FingerprintHelper() {
|
||||
|
||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
warningText.value = errString
|
||||
}
|
||||
|
||||
override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) {
|
||||
warningText.value = helpString
|
||||
}
|
||||
|
||||
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
|
||||
handleAction(MagiskPolicy.ALLOW)
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
warningText.value = resources.getString(R.string.auth_fail)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,60 @@
|
||||
package com.topjohnwu.magisk.utils
|
||||
|
||||
import androidx.biometric.BiometricManager
|
||||
import androidx.biometric.BiometricPrompt
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.topjohnwu.magisk.Config
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.superuser.internal.UiThreadHandler
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.get
|
||||
|
||||
object BiometricHelper: KoinComponent {
|
||||
|
||||
private val mgr by lazy { BiometricManager.from(get()) }
|
||||
|
||||
val isSupported get() = when (mgr.canAuthenticate()) {
|
||||
BiometricManager.BIOMETRIC_SUCCESS -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
val isEnabled: Boolean get() {
|
||||
val enabled = Config.suBiometric
|
||||
if (enabled && !isSupported) {
|
||||
Config.suBiometric = false
|
||||
return false
|
||||
}
|
||||
return enabled
|
||||
}
|
||||
|
||||
fun authenticate(
|
||||
activity: FragmentActivity,
|
||||
onError: () -> Unit = {},
|
||||
onSuccess: () -> Unit): BiometricPrompt {
|
||||
val prompt = BiometricPrompt(activity,
|
||||
{ cmd: Runnable -> UiThreadHandler.run(cmd) },
|
||||
object : BiometricPrompt.AuthenticationCallback() {
|
||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
onError()
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
onError()
|
||||
}
|
||||
|
||||
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
)
|
||||
val info = BiometricPrompt.PromptInfo.Builder()
|
||||
.setConfirmationRequired(true)
|
||||
.setDeviceCredentialAllowed(false)
|
||||
.setTitle(activity.getString(R.string.authenticate))
|
||||
.setNegativeButtonText(activity.getString(android.R.string.cancel))
|
||||
.build()
|
||||
prompt.authenticate(info)
|
||||
return prompt
|
||||
}
|
||||
|
||||
}
|
@ -1,121 +0,0 @@
|
||||
package com.topjohnwu.magisk.utils
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.KeyguardManager
|
||||
import android.content.Context
|
||||
import android.hardware.fingerprint.FingerprintManager
|
||||
import android.os.Build
|
||||
import android.os.CancellationSignal
|
||||
import android.security.keystore.KeyGenParameterSpec
|
||||
import android.security.keystore.KeyProperties
|
||||
import com.topjohnwu.magisk.Config
|
||||
import com.topjohnwu.magisk.extensions.get
|
||||
import com.topjohnwu.magisk.extensions.inject
|
||||
import java.security.KeyStore
|
||||
import javax.crypto.Cipher
|
||||
import javax.crypto.KeyGenerator
|
||||
import javax.crypto.SecretKey
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
abstract class FingerprintHelper @Throws(Exception::class)
|
||||
protected constructor() {
|
||||
|
||||
private val manager: FingerprintManager?
|
||||
private val cipher: Cipher
|
||||
private var cancel: CancellationSignal? = null
|
||||
private val context: Context by inject()
|
||||
|
||||
init {
|
||||
val keyStore = KeyStore.getInstance("AndroidKeyStore")
|
||||
manager = context.getSystemService(FingerprintManager::class.java)
|
||||
cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
|
||||
+ KeyProperties.BLOCK_MODE_CBC + "/"
|
||||
+ KeyProperties.ENCRYPTION_PADDING_PKCS7)
|
||||
keyStore.load(null)
|
||||
var key = keyStore.getKey(SU_KEYSTORE_KEY, null) as SecretKey? ?: generateKey()
|
||||
runCatching {
|
||||
cipher.init(Cipher.ENCRYPT_MODE, key)
|
||||
}.onFailure {
|
||||
// Only happens on Marshmallow
|
||||
key = generateKey()
|
||||
cipher.init(Cipher.ENCRYPT_MODE, key)
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun onAuthenticationError(errorCode: Int, errString: CharSequence)
|
||||
|
||||
abstract fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence)
|
||||
|
||||
abstract fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult)
|
||||
|
||||
abstract fun onAuthenticationFailed()
|
||||
|
||||
fun authenticate() {
|
||||
cancel = CancellationSignal()
|
||||
val cryptoObject = FingerprintManager.CryptoObject(cipher)
|
||||
manager!!.authenticate(cryptoObject, cancel, 0, Callback(), null)
|
||||
}
|
||||
|
||||
fun cancel() {
|
||||
if (cancel != null)
|
||||
cancel!!.cancel()
|
||||
}
|
||||
|
||||
@Throws(Exception::class)
|
||||
private fun generateKey(): SecretKey {
|
||||
val keygen = KeyGenerator
|
||||
.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
|
||||
val builder = KeyGenParameterSpec.Builder(
|
||||
SU_KEYSTORE_KEY,
|
||||
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
|
||||
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
|
||||
.setUserAuthenticationRequired(true)
|
||||
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
builder.setInvalidatedByBiometricEnrollment(false)
|
||||
}
|
||||
keygen.init(builder.build())
|
||||
return keygen.generateKey()
|
||||
}
|
||||
|
||||
private inner class Callback : FingerprintManager.AuthenticationCallback() {
|
||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
this@FingerprintHelper.onAuthenticationError(errorCode, errString)
|
||||
}
|
||||
|
||||
override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) {
|
||||
this@FingerprintHelper.onAuthenticationHelp(helpCode, helpString)
|
||||
}
|
||||
|
||||
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
|
||||
this@FingerprintHelper.onAuthenticationSucceeded(result)
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
this@FingerprintHelper.onAuthenticationFailed()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val SU_KEYSTORE_KEY = "su_key"
|
||||
|
||||
fun useFingerprint(): Boolean {
|
||||
var fp = Config.suFingerprint
|
||||
if (fp && !canUseFingerprint()) {
|
||||
Config.suFingerprint = false
|
||||
fp = false
|
||||
}
|
||||
return fp
|
||||
}
|
||||
|
||||
fun canUseFingerprint(context: Context = get()): Boolean {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
|
||||
return false
|
||||
val km = context.getSystemService(KeyguardManager::class.java)
|
||||
val fm = context.getSystemService(FingerprintManager::class.java)
|
||||
return km?.isKeyguardSecure ?: false &&
|
||||
fm != null && fm.isHardwareDetected && fm.hasEnrolledFingerprints()
|
||||
}
|
||||
}
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
package com.topjohnwu.magisk.view.dialogs
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Activity
|
||||
import android.graphics.Color
|
||||
import android.hardware.fingerprint.FingerprintManager
|
||||
import android.os.Build
|
||||
import android.view.Gravity
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
||||
import com.topjohnwu.magisk.utils.Utils
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
class FingerprintAuthDialog(activity: Activity, private val callback: () -> Unit)
|
||||
: CustomAlertDialog(activity) {
|
||||
|
||||
private var failureCallback: (() -> Unit)? = null
|
||||
private var helper: DialogFingerprintHelper? = null
|
||||
|
||||
init {
|
||||
val fingerprint = ContextCompat.getDrawable(activity, R.drawable.ic_fingerprint)
|
||||
fingerprint?.setBounds(0, 0, Utils.dpInPx(50), Utils.dpInPx(50))
|
||||
val theme = activity.theme
|
||||
val ta = theme.obtainStyledAttributes(intArrayOf(R.attr.imageColorTint))
|
||||
fingerprint?.setTint(ta.getColor(0, Color.GRAY))
|
||||
ta.recycle()
|
||||
binding.message.setCompoundDrawables(null, null, null, fingerprint)
|
||||
binding.message.compoundDrawablePadding = Utils.dpInPx(20)
|
||||
binding.message.gravity = Gravity.CENTER
|
||||
setMessage(R.string.auth_fingerprint)
|
||||
setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
helper?.cancel()
|
||||
failureCallback?.invoke()
|
||||
}
|
||||
setOnCancelListener {
|
||||
helper?.cancel()
|
||||
failureCallback?.invoke()
|
||||
}
|
||||
runCatching {
|
||||
helper = DialogFingerprintHelper()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
constructor(activity: Activity, onSuccess: () -> Unit, onFailure: () -> Unit)
|
||||
: this(activity, onSuccess) {
|
||||
failureCallback = onFailure
|
||||
}
|
||||
|
||||
override fun show(): AlertDialog {
|
||||
return create().apply {
|
||||
if (helper == null) {
|
||||
dismiss()
|
||||
Utils.toast(R.string.auth_fail, Toast.LENGTH_SHORT)
|
||||
} else {
|
||||
helper?.authenticate()
|
||||
show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal inner class DialogFingerprintHelper @Throws(Exception::class)
|
||||
constructor() : FingerprintHelper() {
|
||||
|
||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
binding.message.setTextColor(Color.RED)
|
||||
binding.message.text = errString
|
||||
}
|
||||
|
||||
override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) {
|
||||
binding.message.setTextColor(Color.RED)
|
||||
binding.message.text = helpString
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
binding.message.setTextColor(Color.RED)
|
||||
binding.message.setText(R.string.auth_fail)
|
||||
}
|
||||
|
||||
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
|
||||
dismiss()
|
||||
callback()
|
||||
}
|
||||
}
|
||||
}
|
@ -129,24 +129,14 @@
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/grant_btn"
|
||||
style="@style/Widget.Button.Text"
|
||||
gone="@{viewModel.canUseFingerprint}"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:onClick="@{() -> viewModel.grantPressed()}"
|
||||
android:text="@string/grant" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/fingerprint"
|
||||
gone="@{!viewModel.canUseFingerprint}"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:padding="7dp"
|
||||
android:tint="?attr/colorAccent"
|
||||
app:srcCompat="@drawable/ic_fingerprint" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</layout>
|
||||
</layout>
|
||||
|
@ -163,9 +163,6 @@
|
||||
<string name="request_timeout_summary">%1$d ثانية</string>
|
||||
<string name="settings_su_reauth_title">إعادة المصادقة بعد الترقية</string>
|
||||
<string name="settings_su_reauth_summary">أعد المصادقة على صلاحيات المستخدم المتميز بعد إجراء ترقيات للتطبيق</string>
|
||||
<string name="settings_su_fingerprint_summary">استخدام قارئ بصمات الأصابع للسماح بطلبات المستخدم المتميز</string>
|
||||
<string name="settings_su_fingerprint_title">تمكين مصادقة البصمة</string>
|
||||
<string name="auth_fingerprint">مصادقة البصمة</string>
|
||||
|
||||
<string name="multiuser_mode">نمط تعدد المستخدمين</string>
|
||||
<string name="settings_owner_only">مالك الجهاز فقط</string>
|
||||
@ -182,7 +179,6 @@
|
||||
<string name="global_summary">تستخدم كافة جلسات العمل للروت مساحة الاسم ذات التركيب العامة</string>
|
||||
<string name="requester_summary">سترث جلسات العمل للروت مساحة الأسماء لطالبيها</string>
|
||||
<string name="isolate_summary">سيكون لكل جلسة عمل للروت مساحة اسم معزولة خاصة بها </string>
|
||||
<string name="disable_fingerprint">لم تُعين بصمات الأصابع أو لا يوجد قارئ بصمات</string>
|
||||
<string name="settings_download_path_error">خطأ عند إنشاء مجلد. عليه أن يكون سهلا الوصول إليه من خلال مجلد التخزين للروت و ألا يكون ملفا.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -210,7 +206,6 @@
|
||||
<string name="su_revoke_msg">تأكيد لسحب صلاحيات %1$s ?</string>
|
||||
<string name="toast">ملاحظة منبثقة</string>
|
||||
<string name="none">بدون</string>
|
||||
<string name="auth_fail">فشل المصادقة</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -151,9 +151,6 @@
|
||||
<string name="request_timeout_summary">%1$d saniyə</string>
|
||||
<string name="settings_su_reauth_title">Yüksəltmədən sonra Yenidən İdentifikasiya et</string>
|
||||
<string name="settings_su_reauth_summary">Tətbiq yeniləmələridən sonra superuser icazələrini yenidən identifikasiya et</string>
|
||||
<string name="settings_su_fingerprint_title">Barmaq İzi İdentifikasiyasını Aç</string>
|
||||
<string name="settings_su_fingerprint_summary">Barmaq izi oxuyucunu superuser icazələri üçün işlət</string>
|
||||
<string name="auth_fingerprint">Barmaq izini İdentifikasiya et</string>
|
||||
<string name="multiuser_mode">Çox-istifadəçi modu</string>
|
||||
<string name="settings_owner_only">Yalnız cihaz sahibi</string>
|
||||
<string name="settings_owner_manage">Cihaz sahibinin idarəçiliyində</string>
|
||||
@ -168,7 +165,6 @@
|
||||
<string name="global_summary">Bütün root sessyaları qlobal qoşma namespace\'dən istifadə edir.</string>
|
||||
<string name="requester_summary">Root sessyaları soruşulan namespace\'ləri birindən digərinə keçirəcək.</string>
|
||||
<string name="isolate_summary">Hər bir root sessyasının ayrılmış namespace\'i olacaq.</string>
|
||||
<string name="disable_fingerprint">Barmaq izi təyin edilməyib ya da dəstəklənmir.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Superuser Tələbi</string>
|
||||
@ -195,7 +191,6 @@
|
||||
<string name="su_revoke_msg">%1$s üçün haqları ləğv etməyi təsdiq edirsiniz?</string>
|
||||
<string name="toast">Tost</string>
|
||||
<string name="none">Heçnə</string>
|
||||
<string name="auth_fail">İdentifikasiya xətası</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -142,9 +142,6 @@
|
||||
<string name="request_timeout_summary">%1$d секунди</string>
|
||||
<string name="settings_su_reauth_title">Повторно запитване след актуализация</string>
|
||||
<string name="settings_su_reauth_summary">Повторно запитване за Superuser достъп след актуализация на приложенията.</string>
|
||||
<string name="settings_su_fingerprint_title">Superuser права само с пръстов отпечатък</string>
|
||||
<string name="settings_su_fingerprint_summary">Използване на сензора за пръстови отпечатъци за разрешаване на Superuser достъп.</string>
|
||||
<string name="auth_fingerprint">Удостоверете с пръстов отпечатък.</string>
|
||||
|
||||
<string name="multiuser_mode">Потребителски достъп</string>
|
||||
<string name="settings_owner_only">Само собственик</string>
|
||||
@ -161,7 +158,6 @@
|
||||
<string name="global_summary">Всички сесии с руут достъп използват глобалното именно пространство.</string>
|
||||
<string name="requester_summary">Всички сесии с руут достъп наследяват именното пространство на запитващото приложение.</string>
|
||||
<string name="isolate_summary">Всички сесии с руут достъп имат собствени именни пространства.</string>
|
||||
<string name="disable_fingerprint">Не са добавени пръстови отпечатъци или устройството не поддържа тази функция.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Запитване за Superuser достъп</string>
|
||||
@ -188,7 +184,6 @@
|
||||
<string name="su_revoke_msg">Потвърждавате ли анулирането на настройките за достъп на %1$s?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Без</string>
|
||||
<string name="auth_fail">Неуспешна заверка.</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Целеви UID: %1$d</string>
|
||||
|
@ -166,9 +166,6 @@
|
||||
<string name="request_timeout_summary">%1$d segons</string>
|
||||
<string name="settings_su_reauth_title">Demanar després d\'una actualització</string>
|
||||
<string name="settings_su_reauth_summary">Demanar permisos de superusuari novament si una aplicació és actualitzada o reinstal·lada</string>
|
||||
<string name="settings_su_fingerprint_title">Autenticació per Empremta Dactilar</string>
|
||||
<string name="settings_su_fingerprint_summary">Utilitza el sensor d\'Empremta Dactilar per permetre les sol·licituds de superusuari</string>
|
||||
<string name="auth_fingerprint">Autenticar Emprempta Digital</string>
|
||||
|
||||
<string name="multiuser_mode">Mode Multiusuari</string>
|
||||
<string name="settings_owner_only">Només Administrador del Dispositiu</string>
|
||||
@ -185,7 +182,6 @@
|
||||
<string name="global_summary">Totes les sessions d\'arrel utilitzen el suport Namespace Global</string>
|
||||
<string name="requester_summary">Les sessions d\'arrel heretaran les peticiones Namespace</string>
|
||||
<string name="isolate_summary">Totes les sessions d\'arrel tindran la seva pròpia Namespace</string>
|
||||
<string name="disable_fingerprint">No s\'han establert empremtes dactilars o no existeix el suport del dispositiu</string>
|
||||
<string name="settings_download_path_error">Error al crear la carpeta. El directori ha de ser accesible desde el directori arrel i no pot ser un arxiu.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -213,7 +209,6 @@
|
||||
<string name="su_revoke_msg">Confirma per revocar drets de %1$s</string>
|
||||
<string name="toast">Avís</string>
|
||||
<string name="none">Cap</string>
|
||||
<string name="auth_fail">Autenticació fallida</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -154,9 +154,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekund</string>
|
||||
<string name="settings_su_reauth_title">Opětovné ověření po aktualizaci</string>
|
||||
<string name="settings_su_reauth_summary">Opětovné ověření oprávnění Superuser po aktualizaci aplikace</string>
|
||||
<string name="settings_su_fingerprint_title">Povolit ověřování otisky prstů</string>
|
||||
<string name="settings_su_fingerprint_summary">Chcete-li povolit požadavky Superuser, použijte snímač otisků prstů</string>
|
||||
<string name="auth_fingerprint">Ověřování otisky prstů</string>
|
||||
|
||||
<string name="multiuser_mode">Režim více uživatelů</string>
|
||||
<string name="settings_owner_only">Pouze vlastník zařízení</string>
|
||||
@ -173,7 +170,6 @@
|
||||
<string name="global_summary">Všechny relace root používají globální připojení jmenného prostoru.</string>
|
||||
<string name="requester_summary">Kořenové relace dědí jmenný prostor žadatele.</string>
|
||||
<string name="isolate_summary">Každá relace root bude mít svůj vlastní izolovaný jmenný prostor.</string>
|
||||
<string name="disable_fingerprint">Nebyly nastaveny žádné otisky prstů ani žádná podpora zařízení.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Požadavek Superuser</string>
|
||||
@ -200,7 +196,6 @@
|
||||
<string name="su_revoke_msg">Smazat záznam ohledně oprávnění pro %1$s?</string>
|
||||
<string name="toast">Informační text</string>
|
||||
<string name="none">Žádný</string>
|
||||
<string name="auth_fail">Ověření se nezdařilo</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -156,9 +156,6 @@
|
||||
<string name="request_timeout_summary">%1$d Sekunden</string>
|
||||
<string name="settings_su_reauth_title">Nach Aktualisierung erneut authentifizieren</string>
|
||||
<string name="settings_su_reauth_summary">Superuser-Zugriff nach App-Aktualisierung erneut abfragen</string>
|
||||
<string name="settings_su_fingerprint_title">Aktiviere Authentifizierung durch Fingerabdruck</string>
|
||||
<string name="settings_su_fingerprint_summary">Fingerabdrucksensor benutzen um Superuser-Anfragen zu erlauben</string>
|
||||
<string name="auth_fingerprint">Authentifiziere Fingerabdruck</string>
|
||||
|
||||
<string name="multiuser_mode">Mehrbenutzermodus</string>
|
||||
<string name="settings_owner_only">Nur der Gerätebesitzer</string>
|
||||
@ -175,7 +172,6 @@
|
||||
<string name="global_summary">Alle Root-Sitzungen benutzen den global angelegten Namespace</string>
|
||||
<string name="requester_summary">Root-Sitzungen erben den Namespace des Abfragenden</string>
|
||||
<string name="isolate_summary">Jede Root-Sitzung hat ihren isolierten Namespace</string>
|
||||
<string name="disable_fingerprint">Keine Fingerabdrücke gespeichert oder keine Geräteunterstützung</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Superuser-Anfrage</string>
|
||||
@ -202,7 +198,6 @@
|
||||
<string name="su_revoke_msg">Möchtest du die Rechte für %1$s entziehen?</string>
|
||||
<string name="toast">Popup</string>
|
||||
<string name="none">Keine</string>
|
||||
<string name="auth_fail">Authentifizierung fehlgeschlagen</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -159,9 +159,6 @@
|
||||
<string name="request_timeout_summary">%1$d segundos</string>
|
||||
<string name="settings_su_reauth_title">Re-autenticación</string>
|
||||
<string name="settings_su_reauth_summary">Pedir permisos de superusuario nuevamente si una aplicación es actualizada o reinstalada</string>
|
||||
<string name="settings_su_fingerprint_title">Autenticación por Huella Dactilar</string>
|
||||
<string name="settings_su_fingerprint_summary">Utilizar el sensor de Huella Dactilar para permitir las solicitudes de superusuario</string>
|
||||
<string name="auth_fingerprint">Autenticar Huella Dactilar</string>
|
||||
|
||||
<string name="multiuser_mode">Modo MultiUsuario</string>
|
||||
<string name="settings_owner_only">Sólo Administrador del Dispositivo</string>
|
||||
@ -178,7 +175,6 @@
|
||||
<string name="global_summary">Todas las sesiones de root utilizan el soporte Global Namespace</string>
|
||||
<string name="requester_summary">Las sesiones de root heredarán las peticiones Namespace</string>
|
||||
<string name="isolate_summary">Cada sesión root tendrá su propia Namespace</string>
|
||||
<string name="disable_fingerprint">No se establecieron huellas dactilares o no existe soporte del dispositivo</string>
|
||||
<string name="settings_download_path_error">Error al crear la carpeta. Debe ser accesible desde el directorio raíz de almacenamiento y no debe ser un archivo.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -206,7 +202,6 @@
|
||||
<string name="su_revoke_msg">¿Confirmar para revocar derechos de %1$s?</string>
|
||||
<string name="toast">Aviso</string>
|
||||
<string name="none">Nada</string>
|
||||
<string name="auth_fail">Autenticación fallida</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -162,9 +162,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekundit</string>
|
||||
<string name="settings_su_reauth_title">Taas-autendi peale täiendust</string>
|
||||
<string name="settings_su_reauth_summary">Taas-autendi superkasutaja õigused peale rakenduse täiendamist</string>
|
||||
<string name="settings_su_fingerprint_title">Luba sõrmejäljega autentimine</string>
|
||||
<string name="settings_su_fingerprint_summary">Kasuta sõrmejäljelugejat superkasutaja taotluste lubamiseks</string>
|
||||
<string name="auth_fingerprint">Autendi sõrmejälg</string>
|
||||
|
||||
<string name="multiuser_mode">Mitmikkasutaja režiim</string>
|
||||
<string name="settings_owner_only">Ainult seadme omanik</string>
|
||||
@ -181,7 +178,6 @@
|
||||
<string name="global_summary">Kõik juurkasutaja sessioonid kasutavad globaalset monteerimise nimeruumi.</string>
|
||||
<string name="requester_summary">Juurkasutaja sessioonid võtavad üle selle taotleja nimeruumi.</string>
|
||||
<string name="isolate_summary">Iga juurkasutaja sessioon saab oma isoleeritud nimeruumi.</string>
|
||||
<string name="disable_fingerprint">Sõrmejälgi pole määratud või seade pole toetatud.</string>
|
||||
<string name="settings_download_path_error">Faili loomisel esines viga. See peab olema ligipääsetav mäluruumi juurkaustast ning ei tohi olla fail.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -209,7 +205,6 @@
|
||||
<string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
|
||||
<string name="toast">Hüpik</string>
|
||||
<string name="none">Puudub</string>
|
||||
<string name="auth_fail">Autentimine ebaõnnestus</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -165,9 +165,6 @@
|
||||
<string name="request_timeout_summary">%1$d secondes</string>
|
||||
<string name="settings_su_reauth_title">Authentifier à nouveau après la mise à niveau</string>
|
||||
<string name="settings_su_reauth_summary">Authentifier à nouveau les autorisations super‐utilisateur après une mise à jour de l’application</string>
|
||||
<string name="settings_su_fingerprint_title">Activer l’authentification par empreinte digitale</string>
|
||||
<string name="settings_su_fingerprint_summary">Utiliser le lecteur d’empreintes digitales pour autoriser les demandes super‐utilisateur</string>
|
||||
<string name="auth_fingerprint">Authentifier l’empreinte digitale</string>
|
||||
|
||||
<string name="multiuser_mode">Mode multi‐utilisateur</string>
|
||||
<string name="settings_owner_only">Propriétaire de l’appareil uniquement</string>
|
||||
@ -184,7 +181,6 @@
|
||||
<string name="global_summary">Toutes les sessions super‐utilisateur utilisent l’espace de noms global du montage.</string>
|
||||
<string name="requester_summary">Les sessions super‐utilisateur hériteront de l’espace de noms de leur demandeur.</string>
|
||||
<string name="isolate_summary">Chaque session super‐utilisateur aura son propre espace de noms isolé.</string>
|
||||
<string name="disable_fingerprint">Aucune empreinte digitale n’a été définie ou le lecteur d’empreinte n’est pas pris en charge.</string>
|
||||
<string name="settings_download_path_error">Erreur lors de la création du dossier. Il doit être accessible depuis le répertoire racine du stockage et ne doit pas être un fichier.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -212,7 +208,6 @@
|
||||
<string name="su_revoke_msg">Confirmez‐vous l’annulation des droits pour %1$s ?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Aucun</string>
|
||||
<string name="auth_fail">Échec de l’authentification</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID : %1$d</string>
|
||||
|
@ -162,9 +162,6 @@
|
||||
<string name="request_timeout_summary">%1$d सेकंड्स</string>
|
||||
<string name="settings_su_reauth_title">अपग्रेड के बाद फिर से प्रमाणित करें</string>
|
||||
<string name="settings_su_reauth_summary">एप्लीकेशन अपग्रेड होने के बाद उत्तम उपयोगकर्ता की अनुमतियों को फिर से प्रमाणित करें</string>
|
||||
<string name="settings_su_fingerprint_title">फिंगरप्रिंट प्रमाणीकरण सक्षम करें</string>
|
||||
<string name="settings_su_fingerprint_summary">उत्तम उपयोगकर्ता के अनुरोधों की अनुमति के लिए फिंगरप्रिंट स्कैनर का उपयोग करें</string>
|
||||
<string name="auth_fingerprint">फिंगरप्रिंट को प्रमाणित करें</string>
|
||||
|
||||
<string name="multiuser_mode">बहु उपयोगकर्ता मोड</string>
|
||||
<string name="settings_owner_only">केवल डिवाइस का मालिक</string>
|
||||
@ -181,7 +178,6 @@
|
||||
<string name="global_summary">सभी रूट सत्र वैश्विक माउंट नेमस्पेस का उपयोग करते हैं.</string>
|
||||
<string name="requester_summary">रूट सत्रों को उनके अनुरोधकर्ताओं के नेमस्पेस विरासत में मिलेंगे.</string>
|
||||
<string name="isolate_summary">प्रत्येक रूट सत्र का अपना अलग नेमस्पेस होगा.</string>
|
||||
<string name="disable_fingerprint">कोई फ़िंगरप्रिंट नहीं सेट किया गया या डिवाइस का समर्थन नहीं है.</string>
|
||||
<string name="settings_download_path_error">फोल्डर बनाने में त्रुटि. यह स्टोरेज रूट डायरेक्टरी से एक्सेस होना चाहिए और फाइल नहीं होना चाहिए.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -209,7 +205,6 @@
|
||||
<string name="su_revoke_msg">%1$s के अधिकारों को वापस लेने की पुष्टि करें?</string>
|
||||
<string name="toast">पॉप-अप नोट</string>
|
||||
<string name="none">कोई नहीं</string>
|
||||
<string name="auth_fail">प्रमाणीकरण विफल हुआ</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -160,9 +160,6 @@
|
||||
<string name="request_timeout_summary">%1$d detik</string>
|
||||
<string name="settings_su_reauth_title">Otentikasi ulang setelah pembaruan</string>
|
||||
<string name="settings_su_reauth_summary">Otentikasi ulang izin superuser setelah pembaruan sebuah aplikasi</string>
|
||||
<string name="settings_su_fingerprint_title">Aktifkan Otentikasi Sidik Jari</string>
|
||||
<string name="settings_su_fingerprint_summary">Gunakan pemindai sidik jari untuk mengizinkan permintaan superuser</string>
|
||||
<string name="auth_fingerprint">Otentikasi Sidik Jari</string>
|
||||
|
||||
<string name="multiuser_mode">Mode Multipengguna</string>
|
||||
<string name="settings_owner_only">Pemilik Perangkat Saja</string>
|
||||
@ -179,7 +176,6 @@
|
||||
<string name="global_summary">Semua sesi root menggunakan mount ruang nama global.</string>
|
||||
<string name="requester_summary">Sesi root akan mewarisi ruang nama peminta mereka.</string>
|
||||
<string name="isolate_summary">Setiap sesi root akan memiliki ruang nama tersendiri.</string>
|
||||
<string name="disable_fingerprint">Tidak ada sidik jari diatur atau tidak ada dukungan perangkat.</string>
|
||||
<string name="settings_download_path_error">Kesalahan membuat folder. Folder harus dapat diakses dari direktori penyimpanan root dan bukan merupakan file.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -207,7 +203,6 @@
|
||||
<string name="su_revoke_msg">Konfirmasi untuk mencabut akses %1$s?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Tidak ada</string>
|
||||
<string name="auth_fail">Otentikasi Gagal</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -164,9 +164,6 @@
|
||||
<string name="request_timeout_summary">%1$d secondi</string>
|
||||
<string name="settings_su_reauth_title">Riautentica dopo aggiornamento</string>
|
||||
<string name="settings_su_reauth_summary">Riautentica i permessi Superuser dopo un aggiornamento dell\'app</string>
|
||||
<string name="settings_su_fingerprint_title">Abilita autenticazione impronta</string>
|
||||
<string name="settings_su_fingerprint_summary">Utilizza il sensore di impronte per accettare le richieste Superuser</string>
|
||||
<string name="auth_fingerprint">Conferma impronta</string>
|
||||
|
||||
<string name="multiuser_mode">Modalità multiutente</string>
|
||||
<string name="settings_owner_only">Solo proprietario del dispositivo</string>
|
||||
@ -183,7 +180,6 @@
|
||||
<string name="global_summary">Tutte le sessioni di root erediteranno il namespace globale</string>
|
||||
<string name="requester_summary">Le sessioni di root erediteranno il namespace del loro richiedente</string>
|
||||
<string name="isolate_summary">Ogni sessione di root avrà il suo namespace isolato</string>
|
||||
<string name="disable_fingerprint">Non è presente alcuna impronta o il dispositivo non è supportato</string>
|
||||
<string name="settings_download_path_error">Errore durante la creazione della cartella. Deve essere accessibile dalla radice della memoria di archiviazione e non essere un file.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -211,7 +207,6 @@
|
||||
<string name="su_revoke_msg">Confermi la revoca dei diritti di %1$s?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Nessuno</string>
|
||||
<string name="auth_fail">Autenticatione fallita</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -148,9 +148,6 @@
|
||||
<string name="request_timeout_summary">%1$d秒</string>
|
||||
<string name="settings_su_reauth_title">アップグレード後の再認証</string>
|
||||
<string name="settings_su_reauth_summary">アプリのアップグレード後にスーパーユーザー権限を再認証します</string>
|
||||
<string name="settings_su_fingerprint_title">指紋認証の有効化</string>
|
||||
<string name="settings_su_fingerprint_summary">スーパーユーザー権限のリクエストの許可に指紋認証を使います</string>
|
||||
<string name="auth_fingerprint">指紋認証</string>
|
||||
|
||||
<string name="multiuser_mode">マルチユーザーモード</string>
|
||||
<string name="settings_owner_only">端末の管理者のみ</string>
|
||||
@ -167,7 +164,6 @@
|
||||
<string name="global_summary">すべてのrootセッションがグローバル名前空間を使用します</string>
|
||||
<string name="requester_summary">rootセッションはリクエスト者の名前空間を継承します</string>
|
||||
<string name="isolate_summary">rootセッション毎に分離された名前空間を使用します</string>
|
||||
<string name="disable_fingerprint">指紋が登録されていないか、お使いの端末でサポートされていません。</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">スーパーユーザーリクエスト</string>
|
||||
@ -194,7 +190,6 @@
|
||||
<string name="su_revoke_msg">%1$s の権限を取り消しますか?</string>
|
||||
<string name="toast">トースト通知</string>
|
||||
<string name="none">なし</string>
|
||||
<string name="auth_fail">認証に失敗しました</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -155,9 +155,6 @@
|
||||
<string name="request_timeout_summary">%1$d초</string>
|
||||
<string name="settings_su_reauth_title">업데이트 후 재승인</string>
|
||||
<string name="settings_su_reauth_summary">앱 업데이트 후에 슈퍼유저 권한 재승인</string>
|
||||
<string name="settings_su_fingerprint_title">지문 인식 사용</string>
|
||||
<string name="settings_su_fingerprint_summary">지문 인식으로 슈퍼유저 권한을 허가합니다.</string>
|
||||
<string name="auth_fingerprint">지문 인식</string>
|
||||
|
||||
<string name="multiuser_mode">다중 사용자 모드</string>
|
||||
<string name="settings_owner_only">기기 소유자만</string>
|
||||
@ -174,7 +171,6 @@
|
||||
<string name="global_summary">모든 루트 세션이 전역 마운트 이름공간을 사용합니다.</string>
|
||||
<string name="requester_summary">루트 세션은 요청자의 이름공간을 상속합니다.</string>
|
||||
<string name="isolate_summary">각각의 루트 세션은 자신만의 독립된 이름공간을 사용합니다.</string>
|
||||
<string name="disable_fingerprint">지문이 등록되지 않았거나 기기가 지문 인식을 지원하지 않습니다.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">슈퍼유저 요청</string>
|
||||
@ -201,7 +197,6 @@
|
||||
<string name="su_revoke_msg">정말 %1$s의 권한을 취소하시겠습니까?</string>
|
||||
<string name="toast">토스트</string>
|
||||
<string name="none">없음</string>
|
||||
<string name="auth_fail">인증 실패</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -137,8 +137,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekundžių</string>
|
||||
<string name="settings_su_reauth_title">Pakartotinai patvirtinti po atnaujinimo</string>
|
||||
<string name="settings_su_reauth_summary">Pakartotinai patvirtinti supervartotojo leidimus po programėlės atnaujinimo</string>
|
||||
<string name="settings_su_fingerprint_title">Įgalinti patvirtinimą piršto antspaudu</string>
|
||||
<string name="settings_su_fingerprint_summary">Naudoti piršto antspaudą supervartotojo leidimo prašymų atsakymui</string>
|
||||
|
||||
<string name="multiuser_mode">Daugialypio vartotojo režimas</string>
|
||||
<string name="settings_owner_only">Tik įrenginio savininkas</string>
|
||||
@ -155,7 +153,6 @@
|
||||
<string name="global_summary">Visos root sesijos naudoja globalią vardų sritį</string>
|
||||
<string name="requester_summary">Root sesijos paveldi jos išprašytojo/s vardų sritį</string>
|
||||
<string name="isolate_summary">Kiekviena root sesija turi savo izoliuotą vardų sritį</string>
|
||||
<string name="disable_fingerprint">Jūsų įrenginyje nebuvo surasta pirštų antspaudų arba jūsų įrenginys neturi pirštų antspaudų skaitytuvo</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Supervartotojo prašymas</string>
|
||||
@ -182,7 +179,6 @@
|
||||
<string name="su_revoke_msg">Neleisti %1$s naudotis supervartotojo teisėmis?</string>
|
||||
<string name="toast">Išmesti</string>
|
||||
<string name="none">Nėra</string>
|
||||
<string name="auth_fail">Patvirtinimas žlugo</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Target UID: %1$d</string>
|
||||
|
@ -154,9 +154,6 @@
|
||||
<string name="request_timeout_summary">%1$d секунди</string>
|
||||
<string name="settings_su_reauth_title">Повторна автентикација по надградба</string>
|
||||
<string name="settings_su_reauth_summary">Повторна автентикација за супер-корисник дозвола по надградбата на апликацијата</string>
|
||||
<string name="settings_su_fingerprint_title">Овозможи автентикација на отпечатоци</string>
|
||||
<string name="settings_su_fingerprint_summary">Користете скенер за отпечатоци за да дозволите супер-корисник барања</string>
|
||||
<string name="auth_fingerprint">Автентикација на отпечатоци</string>
|
||||
|
||||
<string name="multiuser_mode">Режим на повеќе корисници</string>
|
||||
<string name="settings_owner_only">Само сопственикот на уредот</string>
|
||||
@ -173,7 +170,6 @@
|
||||
<string name="global_summary">Сите рут сесии го користат глобалниот именски простор.</string>
|
||||
<string name="requester_summary">Рут сесиите ќе го наследат именскиот простор на нивниот барател.</string>
|
||||
<string name="isolate_summary">Секоја рут сесија ќе има свој изолиран именски простор.</string>
|
||||
<string name="disable_fingerprint">Нема регистрирано отпечатоци од прсти или уредот не ја поддржува оваа функција.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Супер-корисник барање</string>
|
||||
@ -200,7 +196,6 @@
|
||||
<string name="su_revoke_msg">Дали потврдувате анулирање на поставките за пристап на %1$s?</string>
|
||||
<string name="toast">Тост</string>
|
||||
<string name="none">Ниеден</string>
|
||||
<string name="auth_fail">Неуспешна автентикација</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -146,9 +146,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekunder</string>
|
||||
<string name="settings_su_reauth_title">Autentiser på nytt etter oppdateringer after upgrade</string>
|
||||
<string name="settings_su_reauth_summary">Autentiser superbruker-tillatelser på nytt etter at en app har blitt oppdatert</string>
|
||||
<string name="settings_su_fingerprint_title">Skru på fingeravtrykksautentisering</string>
|
||||
<string name="settings_su_fingerprint_summary">Bruk fingeravtrykksskanneren for å godkjenne superbruker-forespørsler</string>
|
||||
<string name="auth_fingerprint">Autentiser fingeravtrykk</string>
|
||||
|
||||
<string name="multiuser_mode">Flerbrukermoduse</string>
|
||||
<string name="settings_owner_only">Kun enhetens eier</string>
|
||||
@ -165,7 +162,6 @@
|
||||
<string name="global_summary">Alle root-økter benytter det altdekkende monteringsnavnefeltet.</string>
|
||||
<string name="requester_summary">Root-økter vil arve forespørrerens navnefelt.</string>
|
||||
<string name="isolate_summary">Hver root-økt vil ha sitt eget isolerte navnefelt.</string>
|
||||
<string name="disable_fingerprint">Ingen fingeravtrykk ble gitt, eller så støttes det ikke av enheten.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Superbruker-forespørsel</string>
|
||||
@ -192,7 +188,6 @@
|
||||
<string name="su_revoke_msg">Vil du bekrefte for å oppheve %1$s sine rettigheter?</string>
|
||||
<string name="toast">Varselfelt</string>
|
||||
<string name="none">Ingen</string>
|
||||
<string name="auth_fail">Autentisering mislyktes</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Mål-UID: %1$d</string>
|
||||
|
@ -132,8 +132,6 @@
|
||||
<string name="request_timeout_summary">%1$d seconden</string>
|
||||
<string name="settings_su_reauth_title">Opnieuw verzoeken na bijwerken</string>
|
||||
<string name="settings_su_reauth_summary">Superuser rechten opnieuw opvragen na bijwerken applicatie</string>
|
||||
<string name="settings_su_fingerprint_title">Vingerafdruk authenticatie inschakelen</string>
|
||||
<string name="settings_su_fingerprint_summary">Vingerafdruk gebruiken om superuser verzoeken toe te staan</string>
|
||||
|
||||
<string name="multiuser_mode">Multi-gebruiker modus</string>
|
||||
<string name="settings_owner_only">Alleen apparaateigenaar</string>
|
||||
@ -150,7 +148,6 @@
|
||||
<string name="global_summary">Alle rootsessies gebruiken de globale naamruimte</string>
|
||||
<string name="requester_summary">Rootsessies verkrijgen de verzoeker\'s naamruimte</string>
|
||||
<string name="isolate_summary">Iedere rootsessie heeft een eigen geïsoleerde naamruimte</string>
|
||||
<string name="disable_fingerprint">Geen vingerafdrukken ingesteld, of geen apparaatondersteuning</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Superuser verzoek</string>
|
||||
@ -177,7 +174,6 @@
|
||||
<string name="su_revoke_msg">De rechten van %1$s intrekken?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Geen</string>
|
||||
<string name="auth_fail">Authenticatie mislukt</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Doel UID: %1$d</string>
|
||||
|
@ -166,9 +166,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekund</string>
|
||||
<string name="settings_su_reauth_title">Ponowienie uwierzytelnienia po aktualizacji</string>
|
||||
<string name="settings_su_reauth_summary">Ponowne uwierzytelnianie uprawnienia superużytkownika po aktualizacji aplikacji</string>
|
||||
<string name="settings_su_fingerprint_title">Włącz Uwierzytelnienie Odciskiem Palca</string>
|
||||
<string name="settings_su_fingerprint_summary">Użyj skanera linii papilarnych, aby zezwolić na żądania supersu</string>
|
||||
<string name="auth_fingerprint">Uwierzytelnianie Odciskiem Palca</string>
|
||||
|
||||
<string name="multiuser_mode">Tryb Multiusera</string>
|
||||
<string name="settings_owner_only">Tylko Właściciel Urządzenia</string>
|
||||
@ -185,7 +182,6 @@
|
||||
<string name="global_summary">Wszystkie sesje root za pomocą globalnej przestrzeni montowań nazw</string>
|
||||
<string name="requester_summary">Sesje Root będzie dziedziczyć prośby i nazwy</string>
|
||||
<string name="isolate_summary">W każdej sesji root będzie miał własną odosobnioną nazwę</string>
|
||||
<string name="disable_fingerprint">Nie ustawiono żadnych odcisków palców lub brak obsługi urządzenia</string>
|
||||
<string name="settings_download_path_error">Błąd podczas tworzenia folderu. Musi być dostępny z głównego katalogu pamięci i nie może być plikiem.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -213,7 +209,6 @@
|
||||
<string name="su_revoke_msg">Potwierdzasz odwołanie uprawnień %1$s?</string>
|
||||
<string name="toast">Powiadomienie</string>
|
||||
<string name="none">Brak</string>
|
||||
<string name="auth_fail">Uwierzytelnienie Nieudane</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -134,8 +134,6 @@
|
||||
<string name="request_timeout_summary">%1$d segundos</string>
|
||||
<string name="settings_su_reauth_title">Reautenticar após atualizar</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após um app atualizar</string>
|
||||
<string name="settings_su_fingerprint_title">Ativar Autenticação de Impressão Digital</string>
|
||||
<string name="settings_su_fingerprint_summary">Usar escaneador de impressão digital para permitir solicitações de superusuário</string>
|
||||
|
||||
<string name="multiuser_mode">Modo de Multiusuário</string>
|
||||
<string name="settings_owner_only">Proprietário do Dispositivo Apenas</string>
|
||||
@ -152,7 +150,6 @@
|
||||
<string name="global_summary">Todas as sessões root usam montagem de espaço de nome global</string>
|
||||
<string name="requester_summary">As sessões root herdarão espaço de nome de seu solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão root terá seu próprio espaço de nome isolado</string>
|
||||
<string name="disable_fingerprint">Nenhuma impressão digital foi definida ou o dispostivo não tem suporte</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Solicitação de Superusuário</string>
|
||||
@ -179,7 +176,6 @@
|
||||
<string name="su_revoke_msg">Revogar os direitos de %1$s?</string>
|
||||
<string name="toast">Notificação toast</string>
|
||||
<string name="none">Nenhuma</string>
|
||||
<string name="auth_fail">Falha de Autenticação</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -161,9 +161,6 @@
|
||||
<string name="request_timeout_summary">%1$d secunde</string>
|
||||
<string name="settings_su_reauth_title">Reautentificare după actualizare</string>
|
||||
<string name="settings_su_reauth_summary">Reautentifică permisiunile pentru superutilizator după o actualizare a aplicației</string>
|
||||
<string name="settings_su_fingerprint_title">Activează autentificarea cu amprenta</string>
|
||||
<string name="settings_su_fingerprint_summary">Folosește scannerul de amprente pentru a permite solicitările de superutilizator</string>
|
||||
<string name="auth_fingerprint">Autentifică amprenta</string>
|
||||
|
||||
<string name="multiuser_mode">Mod de multiutilizator</string>
|
||||
<string name="settings_owner_only">Numai proprietarul dispozitivului</string>
|
||||
@ -180,7 +177,6 @@
|
||||
<string name="global_summary">Toate sesiunile de root folosesc spațiul de nume global.</string>
|
||||
<string name="requester_summary">Sesiunile de root vor moșteni spațiul de nume al solicitantului.</string>
|
||||
<string name="isolate_summary">Fiecare sesiune de root va avea propriul spațiu de nume izolat.</string>
|
||||
<string name="disable_fingerprint">Nu au fost setate amprente sau scannerul de amprentă lipsește.</string>
|
||||
<string name="settings_download_path_error">Eroare la crearea dosarului. Acesta trebuie să fie accesibil din directorul rădăcină al stocării și nu trebuie să fie un fișier.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -208,7 +204,6 @@
|
||||
<string name="su_revoke_msg">Confirmi revocarea drepturilor pentru %1$s?</string>
|
||||
<string name="toast">Mesaj</string>
|
||||
<string name="none">Nimic</string>
|
||||
<string name="auth_fail">Autentificare eșuată</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -167,9 +167,6 @@
|
||||
<string name="request_timeout_summary">%1$d секунд</string>
|
||||
<string name="settings_su_reauth_title">Повторная аутентификация</string>
|
||||
<string name="settings_su_reauth_summary">Повторный запрос прав суперпользователя после обновления приложений</string>
|
||||
<string name="settings_su_fingerprint_title">Биометрическая аутентификация</string>
|
||||
<string name="settings_su_fingerprint_summary">Использовать сканер отпечатков пальцев для запросов прав суперпользователя</string>
|
||||
<string name="auth_fingerprint">Подтвердите отпечаток пальца</string>
|
||||
|
||||
<string name="multiuser_mode">Многопользовательский режим</string>
|
||||
<string name="settings_owner_only">Только владелец</string>
|
||||
@ -186,7 +183,6 @@
|
||||
<string name="global_summary">Сессии суперпользователя используют общее пространство имён</string>
|
||||
<string name="requester_summary">Сессии суперпользователя наследуют пространство имён запрашивающего</string>
|
||||
<string name="isolate_summary">Сессии суперпользователя используют изолированные пространства имён</string>
|
||||
<string name="disable_fingerprint">Не поддерживается устройством или не заданы отпечатки</string>
|
||||
<string name="settings_download_path_error">Ошибка создания папки. Она должна быть доступна из корневой директории хранилища и не должна быть файлом.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -214,7 +210,6 @@
|
||||
<string name="su_revoke_msg">Сбросить настройки для %1$s?</string>
|
||||
<string name="toast">Всплывающие уведомления</string>
|
||||
<string name="none">Нет</string>
|
||||
<string name="auth_fail">Ошибка аутентификации</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -166,9 +166,6 @@
|
||||
<string name="request_timeout_summary">%1$d sekúnd</string>
|
||||
<string name="settings_su_reauth_title">Overenie autentifikácie po upgrade</string>
|
||||
<string name="settings_su_reauth_summary">Overí autentifikáciu oprávnení superuser po upgrade aplikácie</string>
|
||||
<string name="settings_su_fingerprint_title">Povoliť autentifikáciu odtlačkom prsta</string>
|
||||
<string name="settings_su_fingerprint_summary">Použite snímač odtlačkov prstov pre povolenie žiadostí superuser</string>
|
||||
<string name="auth_fingerprint">Autentifikovať odtlačok prsta</string>
|
||||
|
||||
<string name="multiuser_mode">Režim viacerých používateľov</string>
|
||||
<string name="settings_owner_only">Iba majiteľ zariadenia</string>
|
||||
@ -185,7 +182,6 @@
|
||||
<string name="global_summary">Všetky relácie root použijú globálny mount namespace</string>
|
||||
<string name="requester_summary">Relácie root zdedia namespace od žiadateľa</string>
|
||||
<string name="isolate_summary">Každá relácia root bude mať vlastný izolovaný namespace</string>
|
||||
<string name="disable_fingerprint">Neboli odoslané žiadne odtlačky prsta alebo ich zariadenie nepodporuje</string>
|
||||
<string name="settings_download_path_error">Chyba pri vytváraní priečinka. Musí byť prístupný z koreňového adresára a nemôže to byť súbor.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -213,7 +209,6 @@
|
||||
<string name="su_revoke_msg">Potvrdzujete zrušenie práv %1$s?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">Nič</string>
|
||||
<string name="auth_fail">Autentifikácia zlyhala</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID:%1$d</string>
|
||||
|
@ -146,9 +146,6 @@
|
||||
<string name="request_timeout_summary">%1$d วินาที</string>
|
||||
<string name="settings_su_reauth_title">ขอสิทธิ์ใหม่หลังจากอัพเกรด</string>
|
||||
<string name="settings_su_reauth_summary">ขอสิทธิ์ superuser ใหม่หลังจากแอปถูกอัพเกรด</string>
|
||||
<string name="settings_su_fingerprint_title">ใช้การยืนยันลายนิ้วมือ</string>
|
||||
<string name="settings_su_fingerprint_summary">ใช้ตัวแสกนลายนิ้วมือเพื่ออนุญาตารขอเข้าถึง superuser</string>
|
||||
<string name="auth_fingerprint">ยืนยันลายนิ้วมือ</string>
|
||||
|
||||
<string name="multiuser_mode">โหมดผู้ใช้หลายคน</string>
|
||||
<string name="settings_owner_only">เจ้าของอุปกรณ์เท่านั้น</string>
|
||||
@ -165,7 +162,6 @@
|
||||
<string name="global_summary">All root sessions use the global mount namespace.</string>
|
||||
<string name="requester_summary">Root sessions will inherit their requester\'s namespace.</string>
|
||||
<string name="isolate_summary">Each root session will have its own isolated namespace.</string>
|
||||
<string name="disable_fingerprint">ไม่มีลายนิ้วมือหรืออุปกรณ์แสกน</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">การขอเข้าถึง Superuser</string>
|
||||
@ -192,7 +188,6 @@
|
||||
<string name="su_revoke_msg">ยืนยันการลบสิทธิ์ของ %1$s?</string>
|
||||
<string name="toast">การเตือน</string>
|
||||
<string name="none">ไม่มี</string>
|
||||
<string name="auth_fail">การยืนยันล้มเหลว</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">UID เป้าหมาย: %1$d</string>
|
||||
|
@ -166,9 +166,6 @@
|
||||
<string name="request_timeout_summary">%1$d saniye</string>
|
||||
<string name="settings_su_reauth_title">Yükseltmeden sonra yeniden kimlik doğrula</string>
|
||||
<string name="settings_su_reauth_summary">Uygulama yükseltmeleri sonrasında yetkili kullanıcı izinlerini yeniden doğrula</string>
|
||||
<string name="settings_su_fingerprint_title">Parmak İzi Kimlik Doğrulamayı Etkinleştir</string>
|
||||
<string name="settings_su_fingerprint_summary">Yetkili kullanıcı isteklerine izin vermek için parmak izi tarayıcısını kullan</string>
|
||||
<string name="auth_fingerprint">Parmak izini doğrula</string>
|
||||
|
||||
<string name="multiuser_mode">Çok Kullanıcılı Mod</string>
|
||||
<string name="settings_owner_only">Yalnızca Cihaz Sahibi</string>
|
||||
@ -185,7 +182,6 @@
|
||||
<string name="global_summary">Tüm kök oturumları genel bağlama ad alanını kullanır</string>
|
||||
<string name="requester_summary">Kök oturumları, istekte bulunanın ad alanını devralır</string>
|
||||
<string name="isolate_summary">Her bir kök oturumunun kendi izole ad alanı olacaktır</string>
|
||||
<string name="disable_fingerprint">Parmak izi ayarlanmadı veya cihaz desteği yok</string>
|
||||
<string name="settings_download_path_error">Klasör oluşturma hatası. Depolama kök dizininden erişilebilir olmalı ve bir dosya olmamalıdır.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -213,7 +209,6 @@
|
||||
<string name="su_revoke_msg">%1$s hakları geri alınsın mı?</string>
|
||||
<string name="toast">Pencere</string>
|
||||
<string name="none">Hiçbiri</string>
|
||||
<string name="auth_fail">Kimlik Doğrulama Başarısız</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -166,9 +166,6 @@
|
||||
<string name="request_timeout_summary">%1$d сек.</string>
|
||||
<string name="settings_su_reauth_title">Повторна автентифікація</string>
|
||||
<string name="settings_su_reauth_summary">Перевидача прав суперкористувача після оновлення програм</string>
|
||||
<string name="settings_su_fingerprint_title">Автентифікація за відбитком</string>
|
||||
<string name="settings_su_fingerprint_summary">Використовувати сканер відбитків пальців, щоб надавати дозвіл суперкористувача</string>
|
||||
<string name="auth_fingerprint">Автентифікація за відбитком</string>
|
||||
|
||||
<string name="multiuser_mode">Багатокористувацький режим</string>
|
||||
<string name="settings_owner_only">Тільки власник</string>
|
||||
@ -185,7 +182,6 @@
|
||||
<string name="global_summary">Всі сеанси Суперкористувача використовують глобальний простір імен.</string>
|
||||
<string name="requester_summary">Сеанси Суперкористувача наслідують простір імен запитувача.</string>
|
||||
<string name="isolate_summary">Кожнен сеанс Суперкористувача має власний ізольований простір імен.</string>
|
||||
<string name="disable_fingerprint">Немає відбитків пальця або пристрій не підтримується.</string>
|
||||
<string name="settings_download_path_error">Помилка створення папки. Вона повинна бути доступна з кореневої директорії сховища і не повинна бути файлом.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -213,7 +209,6 @@
|
||||
<string name="su_revoke_msg">Підтвердити відкликання прав для %1$s?</string>
|
||||
<string name="toast">Спливаюче сповіщення</string>
|
||||
<string name="none">Ні</string>
|
||||
<string name="auth_fail">Помилка автентифікації</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -141,9 +141,6 @@
|
||||
<string name="request_timeout_summary">%1$d giây</string>
|
||||
<string name="settings_su_reauth_title">Xác thực lại sau khi nâng cấp</string>
|
||||
<string name="settings_su_reauth_summary">Xác thực lại quyền superuser sau khi nâng cấp ứng dụng</string>
|
||||
<string name="settings_su_fingerprint_title">Bật xác thực vân tay</string>
|
||||
<string name="settings_su_fingerprint_summary">Sử dụng quét vân tay để cho phép quyền superuser</string>
|
||||
<string name="auth_fingerprint">Xác thực vân tay</string>
|
||||
<string name="multiuser_mode">Chế độ đa người dùng</string>
|
||||
<string name="settings_owner_only">Chỉ chủ sở hữu thiết bị</string>
|
||||
<string name="settings_owner_manage">Chủ sở hữu thiết bị được quản lý</string>
|
||||
@ -158,8 +155,7 @@
|
||||
<string name="global_summary">Tất cả các phiên root sử dụng không gian tên gắn kết chung.</string>
|
||||
<string name="requester_summary">Các phiên root sẽ kế thừa không gian tên của người yêu cầu.</string>
|
||||
<string name="isolate_summary">Mỗi phiên root sẽ có không gian tên riêng biệt.</string>
|
||||
<string name="disable_fingerprint">Không có dấu vân tay nào được thiết lập hoặc thiết bị không hỗ trợ.</string>
|
||||
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Yêu cầu Superuser</string>
|
||||
<string name="deny">Từ chối</string>
|
||||
@ -185,8 +181,7 @@
|
||||
<string name="su_revoke_msg">Xác nhận thu hồi quyền của %1$s?</string>
|
||||
<string name="toast">Thông báo ngắn</string>
|
||||
<string name="none">Không có</string>
|
||||
<string name="auth_fail">Xác thực thất bại</string>
|
||||
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="target_uid">Mục UID: %1$d</string>
|
||||
<string name="command">Điều khiển: %1$s</string>
|
||||
|
@ -167,9 +167,6 @@
|
||||
<string name="request_timeout_summary">%1$d 秒</string>
|
||||
<string name="settings_su_reauth_title">更新后重新认证</string>
|
||||
<string name="settings_su_reauth_summary">应用更新后重新认证超级用户权限</string>
|
||||
<string name="settings_su_fingerprint_title">启用指纹验证</string>
|
||||
<string name="settings_su_fingerprint_summary">使用指纹识别来允许超级用户请求</string>
|
||||
<string name="auth_fingerprint">验证指纹</string>
|
||||
|
||||
<string name="multiuser_mode">多用户模式</string>
|
||||
<string name="settings_owner_only">仅设备所有者</string>
|
||||
@ -186,7 +183,6 @@
|
||||
<string name="global_summary">所有的 ROOT 会话使用全局挂载命名空间</string>
|
||||
<string name="requester_summary">ROOT 会话继承原程序的命名空间</string>
|
||||
<string name="isolate_summary">每一个 ROOT 会话使用自己独立的命名空间</string>
|
||||
<string name="disable_fingerprint">没有设置指纹或设备不支持</string>
|
||||
<string name="settings_download_path_error">创建文件夹出错。路径需要位于内部存储空间,并且不能有同名文件。</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -214,7 +210,6 @@
|
||||
<string name="su_revoke_msg">确认撤销 %1$s 的权限?</string>
|
||||
<string name="toast">消息提示</string>
|
||||
<string name="none">无</string>
|
||||
<string name="auth_fail">验证失败</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -167,9 +167,6 @@
|
||||
<string name="request_timeout_summary">%1$d 秒</string>
|
||||
<string name="settings_su_reauth_title">更新後重新驗證</string>
|
||||
<string name="settings_su_reauth_summary">應用程式更新後,重新驗證超級使用者的請求</string>
|
||||
<string name="settings_su_fingerprint_title">指紋驗證</string>
|
||||
<string name="settings_su_fingerprint_summary">使用指紋辨識器允許超級使用者的請求</string>
|
||||
<string name="auth_fingerprint">指紋驗證</string>
|
||||
|
||||
<string name="multiuser_mode">多重使用者模式</string>
|
||||
<string name="settings_owner_only">僅限裝置擁有者</string>
|
||||
@ -186,7 +183,6 @@
|
||||
<string name="global_summary">所有 Root 工作階段皆使用全域命名空間</string>
|
||||
<string name="requester_summary">所有 Root 工作階段皆繼承原程式的命名空間</string>
|
||||
<string name="isolate_summary">所有 Root 工作階段都擁有獨立的命名空間</string>
|
||||
<string name="disable_fingerprint">未設定指紋或無指紋感測器</string>
|
||||
<string name="settings_download_path_error">建立資料夾發生錯誤。檔案存放的路徑需要位於內部儲存空間且不能有同樣名稱的檔案。</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -214,7 +210,6 @@
|
||||
<string name="su_revoke_msg">確定撤銷 %1$s 的權限?</string>
|
||||
<string name="toast">快顯通知</string>
|
||||
<string name="none">無</string>
|
||||
<string name="auth_fail">驗證失敗</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID:%1$d</string>
|
||||
|
@ -95,7 +95,6 @@
|
||||
<string name="settings_reboot_toast">Reboot to apply settings</string>
|
||||
<string name="release_notes">Release notes</string>
|
||||
<string name="repo_cache_cleared">Repo cache cleared</string>
|
||||
|
||||
<string name="dtbo_patched_title">DTBO was patched!</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager has patched dtbo.img. Please reboot.</string>
|
||||
<string name="flashing">Flashing…</string>
|
||||
@ -116,6 +115,7 @@
|
||||
<string name="env_fix_title">Requires Additional Setup</string>
|
||||
<string name="env_fix_msg">Your device needs additional setup for Magisk to work properly. It will download the Magisk setup zip, do you want to proceed now?</string>
|
||||
<string name="setup_msg">Running environment setup…</string>
|
||||
<string name="authenticate">Authenticate</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">General</string>
|
||||
@ -167,9 +167,9 @@
|
||||
<string name="request_timeout_summary">%1$d seconds</string>
|
||||
<string name="settings_su_reauth_title">Reauthenticate after upgrade</string>
|
||||
<string name="settings_su_reauth_summary">Reauthenticate superuser permissions after an application upgrades</string>
|
||||
<string name="settings_su_fingerprint_title">Enable Fingerprint Authentication</string>
|
||||
<string name="settings_su_fingerprint_summary">Use fingerprint scanner to allow superuser requests</string>
|
||||
<string name="auth_fingerprint">Authenticate Fingerprint</string>
|
||||
<string name="settings_su_biometric_title">Enable Biometric Authentication</string>
|
||||
<string name="settings_su_biometric_summary">Use biometric authentication to allow superuser requests</string>
|
||||
<string name="no_biometric">Unsupported device or no biometric settings are enabled</string>
|
||||
|
||||
<string name="multiuser_mode">Multiuser Mode</string>
|
||||
<string name="settings_owner_only">Device Owner Only</string>
|
||||
@ -186,7 +186,6 @@
|
||||
<string name="global_summary">All root sessions use the global mount namespace</string>
|
||||
<string name="requester_summary">Root sessions will inherit their requester\'s namespace</string>
|
||||
<string name="isolate_summary">Each root session will have its own isolated namespace</string>
|
||||
<string name="disable_fingerprint">No fingerprints were set or no device support</string>
|
||||
<string name="settings_download_path_error">Error creating folder. It must be accessible from storage root directory and must not be a file.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
@ -214,7 +213,6 @@
|
||||
<string name="su_revoke_msg">Confirm to revoke %1$s rights?</string>
|
||||
<string name="toast">Toast</string>
|
||||
<string name="none">None</string>
|
||||
<string name="auth_fail">Authentication Failed</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID: %1$d</string>
|
||||
|
@ -119,9 +119,9 @@
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="su_fingerprint"
|
||||
android:summary="@string/settings_su_fingerprint_summary"
|
||||
android:title="@string/settings_su_fingerprint_title" />
|
||||
android:key="su_biometric"
|
||||
android:title="@string/settings_su_biometric_title"
|
||||
android:summary="@string/settings_su_biometric_summary" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
@ -131,4 +131,4 @@
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</androidx.preference.PreferenceScreen>
|
||||
</androidx.preference.PreferenceScreen>
|
||||
|
@ -11,7 +11,7 @@ import static android.os.Build.VERSION.SDK_INT;
|
||||
|
||||
public class DynAPK {
|
||||
|
||||
private static final int STUB_VERSION = 5;
|
||||
private static final int STUB_VERSION = 6;
|
||||
|
||||
// Indices of the object array
|
||||
private static final int STUB_VERSION_ENTRY = 0;
|
||||
|
@ -7,6 +7,7 @@
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
|
||||
<application
|
||||
|
Loading…
Reference in New Issue
Block a user