mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-14 09:57:29 +00:00
Compare commits
118 Commits
manager-v7
...
v20.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0b41cd8564 | ||
![]() |
7db523071d | ||
![]() |
974ee58b9c | ||
![]() |
1e88f2c382 | ||
![]() |
0bdcfcaaf5 | ||
![]() |
5f9c78d04f | ||
![]() |
afa178fdec | ||
![]() |
3a0e3c98f7 | ||
![]() |
fafa92d44b | ||
![]() |
242e64d72f | ||
![]() |
2262af728e | ||
![]() |
bce777d7c6 | ||
![]() |
15bd2da824 | ||
![]() |
bd438ca288 | ||
![]() |
e0d02a61a9 | ||
![]() |
b3328a0ec2 | ||
![]() |
3c2041933f | ||
![]() |
e88b1cc443 | ||
![]() |
71b05b18a0 | ||
![]() |
b07b528e2a | ||
![]() |
1aeb6315ff | ||
![]() |
1b4a3d2d9f | ||
![]() |
3049a81c3b | ||
![]() |
2db1e5cb74 | ||
![]() |
78c64d39ec | ||
![]() |
46ba726232 | ||
![]() |
eb26e62889 | ||
![]() |
7f667fed18 | ||
![]() |
b2cb2b8b75 | ||
![]() |
d19f65ce4a | ||
![]() |
025b060506 | ||
![]() |
7fa2625a03 | ||
![]() |
33d62d7f21 | ||
![]() |
b336655a79 | ||
![]() |
3beffd84d6 | ||
![]() |
02761f5f35 | ||
![]() |
3b9f7885e0 | ||
![]() |
7668e45890 | ||
![]() |
695c8bc5d0 | ||
![]() |
06c42d05c3 | ||
![]() |
404104208f | ||
![]() |
b4d0ad9713 | ||
![]() |
4f4f54a059 | ||
![]() |
12fda29280 | ||
![]() |
af060b3132 | ||
![]() |
8c500709e4 | ||
![]() |
490e6a6f23 | ||
![]() |
08177c3dd8 | ||
![]() |
d22b9c26b6 | ||
![]() |
4bb8ad19cf | ||
![]() |
3e275b7dba | ||
![]() |
11b7076a43 | ||
![]() |
291c718ba2 | ||
![]() |
fcd6071c57 | ||
![]() |
476b61c4c9 | ||
![]() |
8cc5f096a2 | ||
![]() |
474d65207e | ||
![]() |
03428329ef | ||
![]() |
8d21988656 | ||
![]() |
72edbfc455 | ||
![]() |
276535dad6 | ||
![]() |
e373e59661 | ||
![]() |
34bb18448c | ||
![]() |
01253f050a | ||
![]() |
5bee1c56a9 | ||
![]() |
474cc7d56d | ||
![]() |
bffdedddb4 | ||
![]() |
fd72f658c0 | ||
![]() |
d3b5cf82d8 | ||
![]() |
d26d804cc2 | ||
![]() |
4f9a25ee89 | ||
![]() |
bb9ce0e897 | ||
![]() |
d6fb9868bf | ||
![]() |
9aff1a57d3 | ||
![]() |
7681fde4d0 | ||
![]() |
d3b7b41927 | ||
![]() |
da159e4655 | ||
![]() |
7f6a6016d6 | ||
![]() |
44ed0a3279 | ||
![]() |
9964e1bb8e | ||
![]() |
8b8f725499 | ||
![]() |
bab856bce2 | ||
![]() |
3d285b91c6 | ||
![]() |
1dc531930d | ||
![]() |
3d3345acac | ||
![]() |
b29f0ca4d1 | ||
![]() |
576efbdc1b | ||
![]() |
a7f0510a3e | ||
![]() |
2ef088cb60 | ||
![]() |
7c320b6fc4 | ||
![]() |
5a4c82b860 | ||
![]() |
9b297b752e | ||
![]() |
1d6ba58ccd | ||
![]() |
1542447822 | ||
![]() |
a6f0aff659 | ||
![]() |
171ddab32b | ||
![]() |
2aee0b0be0 | ||
![]() |
817cdf7113 | ||
![]() |
1a38f25bd9 | ||
![]() |
ad40e53349 | ||
![]() |
a2ddf362d8 | ||
![]() |
65eca31635 | ||
![]() |
8b0b4a2c39 | ||
![]() |
c0216c0653 | ||
![]() |
61de63a518 | ||
![]() |
d952cc2327 | ||
![]() |
46447f7cfd | ||
![]() |
a6e62e07a2 | ||
![]() |
b1d25e0503 | ||
![]() |
25c557248c | ||
![]() |
472cde29b8 | ||
![]() |
73525d19e9 | ||
![]() |
26618f8d73 | ||
![]() |
6f7c13b814 | ||
![]() |
e7d668502c | ||
![]() |
6fd357962f | ||
![]() |
0c9feedb37 | ||
![]() |
14ba002cbc |
@@ -35,13 +35,12 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
exclude '/META-INF/*.version'
|
exclude '/META-INF/**'
|
||||||
exclude '/META-INF/*.kotlin_module'
|
|
||||||
exclude '/META-INF/rxkotlin.properties'
|
|
||||||
exclude '/androidsupportmultidexversion.txt'
|
exclude '/androidsupportmultidexversion.txt'
|
||||||
exclude '/org/bouncycastle/**'
|
exclude '/org/bouncycastle/**'
|
||||||
exclude '/kotlin/**'
|
exclude '/kotlin/**'
|
||||||
exclude '/kotlinx/**'
|
exclude '/kotlinx/**'
|
||||||
|
exclude '/okhttp3/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
@@ -75,7 +74,7 @@ dependencies {
|
|||||||
implementation "${bindingAdapter}:${vBAdapt}"
|
implementation "${bindingAdapter}:${vBAdapt}"
|
||||||
implementation "${bindingAdapter}-recyclerview:${vBAdapt}"
|
implementation "${bindingAdapter}-recyclerview:${vBAdapt}"
|
||||||
|
|
||||||
def vMarkwon = '4.1.2'
|
def vMarkwon = '4.2.0'
|
||||||
implementation "io.noties.markwon:core:${vMarkwon}"
|
implementation "io.noties.markwon:core:${vMarkwon}"
|
||||||
implementation "io.noties.markwon:html:${vMarkwon}"
|
implementation "io.noties.markwon:html:${vMarkwon}"
|
||||||
implementation "io.noties.markwon:image:${vMarkwon}"
|
implementation "io.noties.markwon:image:${vMarkwon}"
|
||||||
@@ -85,7 +84,7 @@ dependencies {
|
|||||||
implementation "com.github.topjohnwu.libsu:core:${vLibsu}"
|
implementation "com.github.topjohnwu.libsu:core:${vLibsu}"
|
||||||
implementation "com.github.topjohnwu.libsu:io:${vLibsu}"
|
implementation "com.github.topjohnwu.libsu:io:${vLibsu}"
|
||||||
|
|
||||||
def vKoin = "2.0.1"
|
def vKoin = '2.0.1'
|
||||||
implementation "org.koin:koin-core:${vKoin}"
|
implementation "org.koin:koin-core:${vKoin}"
|
||||||
implementation "org.koin:koin-android:${vKoin}"
|
implementation "org.koin:koin-android:${vKoin}"
|
||||||
implementation "org.koin:koin-androidx-viewmodel:${vKoin}"
|
implementation "org.koin:koin-androidx-viewmodel:${vKoin}"
|
||||||
@@ -100,10 +99,10 @@ dependencies {
|
|||||||
implementation "com.squareup.okhttp3:okhttp:${vOkHttp}"
|
implementation "com.squareup.okhttp3:okhttp:${vOkHttp}"
|
||||||
implementation "com.squareup.okhttp3:logging-interceptor:${vOkHttp}"
|
implementation "com.squareup.okhttp3:logging-interceptor:${vOkHttp}"
|
||||||
|
|
||||||
def vMoshi = "1.8.0"
|
def vMoshi = '1.9.2'
|
||||||
implementation "com.squareup.moshi:moshi:${vMoshi}"
|
implementation "com.squareup.moshi:moshi:${vMoshi}"
|
||||||
|
|
||||||
def vKotshi = "2.0.1"
|
def vKotshi = '2.0.2'
|
||||||
implementation "se.ansman.kotshi:api:${vKotshi}"
|
implementation "se.ansman.kotshi:api:${vKotshi}"
|
||||||
kapt "se.ansman.kotshi:compiler:${vKotshi}"
|
kapt "se.ansman.kotshi:compiler:${vKotshi}"
|
||||||
|
|
||||||
@@ -112,23 +111,25 @@ dependencies {
|
|||||||
replacedBy('com.github.topjohnwu:room-runtime')
|
replacedBy('com.github.topjohnwu:room-runtime')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
def vRoom = "2.2.1"
|
def vRoom = '2.2.2'
|
||||||
implementation "com.github.topjohnwu:room-runtime:${vRoom}"
|
implementation "com.github.topjohnwu:room-runtime:${vRoom}"
|
||||||
|
implementation "androidx.room:room-rxjava2:${vRoom}"
|
||||||
kapt "androidx.room:room-compiler:${vRoom}"
|
kapt "androidx.room:room-compiler:${vRoom}"
|
||||||
|
|
||||||
def vNav = "2.1.0"
|
def vNav = '2.1.0'
|
||||||
implementation "androidx.navigation:navigation-fragment-ktx:$vNav"
|
implementation "androidx.navigation:navigation-fragment-ktx:${vNav}"
|
||||||
implementation "androidx.navigation:navigation-ui-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.constraintlayout:constraintlayout:1.1.3'
|
||||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03'
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03'
|
||||||
implementation 'androidx.preference:preference:1.1.0'
|
implementation 'androidx.preference:preference:1.1.0'
|
||||||
implementation 'androidx.recyclerview:recyclerview:1.1.0-rc01'
|
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||||
implementation 'androidx.fragment:fragment-ktx:1.2.0-rc01'
|
implementation 'androidx.fragment:fragment-ktx:1.2.0-rc03'
|
||||||
implementation 'androidx.cardview:cardview:1.0.0'
|
implementation 'androidx.cardview:cardview:1.0.0'
|
||||||
implementation 'androidx.work:work-runtime:2.2.0'
|
implementation 'androidx.work:work-runtime:2.2.0'
|
||||||
implementation 'androidx.transition:transition:1.3.0-rc01'
|
implementation 'androidx.transition:transition:1.3.0-rc02'
|
||||||
implementation 'androidx.multidex:multidex:2.0.1'
|
implementation 'androidx.multidex:multidex:2.0.1'
|
||||||
implementation 'androidx.core:core-ktx:1.1.0'
|
implementation 'androidx.core:core-ktx:1.1.0'
|
||||||
implementation 'com.google.android.material:material:1.2.0-alpha01'
|
implementation 'com.google.android.material:material:1.2.0-alpha02'
|
||||||
}
|
}
|
||||||
|
@@ -1,45 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<!--
|
|
||||||
** Special Requirements **
|
|
||||||
|
|
||||||
This AndroidManifest.xml will be copied into the stub
|
|
||||||
APK to allow APK delegation. This is why these special
|
|
||||||
requirements exist.
|
|
||||||
|
|
||||||
* Class names *
|
|
||||||
Class names a.a, a.c, a.e should not be changed as they are used
|
|
||||||
externally. All other class names can be changed.
|
|
||||||
|
|
||||||
* Resource IDs *
|
|
||||||
All resource IDs referred in AndroidManifest.xml is required to be
|
|
||||||
included into the "shared" module to make the ID match with stub.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="com.topjohnwu.magisk">
|
package="com.topjohnwu.magisk">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="a.e"
|
android:name="a.e"
|
||||||
android:appComponentFactory="a.a"
|
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:usesCleartextTraffic="true"
|
tools:ignore="UnusedAttribute,GoogleAppIndexingWarning">
|
||||||
tools:ignore="UnusedAttribute,GoogleAppIndexingWarning"
|
|
||||||
tools:replace="android:appComponentFactory">
|
|
||||||
|
|
||||||
<!-- Splash -->
|
<!-- Splash -->
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="a.c"
|
android:name="a.c"
|
||||||
android:configChanges="orientation|screenSize"
|
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@@ -48,36 +24,31 @@
|
|||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<!-- Main -->
|
<!-- Main -->
|
||||||
|
<activity android:name="a.b" />
|
||||||
<activity
|
|
||||||
android:name="a.b"
|
|
||||||
android:configChanges="orientation|screenSize"
|
|
||||||
android:exported="true" />
|
|
||||||
|
|
||||||
<!-- Flashing -->
|
<!-- Flashing -->
|
||||||
|
<activity android:name="a.f" />
|
||||||
<activity
|
|
||||||
android:name="a.f"
|
|
||||||
android:configChanges="keyboardHidden|orientation|screenSize"
|
|
||||||
android:screenOrientation="nosensor" />
|
|
||||||
|
|
||||||
<!-- Superuser -->
|
<!-- Superuser -->
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="a.m"
|
android:name="a.m"
|
||||||
android:theme="@android:style/Theme.Translucent.NoTitleBar"
|
|
||||||
android:directBootAware="true"
|
android:directBootAware="true"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:exported="false" />
|
android:exported="false"
|
||||||
|
android:theme="@android:style/Theme.Translucent.NoTitleBar"
|
||||||
|
tools:ignore="AppLinkUrlError">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<!-- Receiver -->
|
<!-- Receiver -->
|
||||||
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name="a.h"
|
android:name="a.h"
|
||||||
android:directBootAware="true">
|
android:directBootAware="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.REBOOT" />
|
<action android:name="android.intent.action.REBOOT" />
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
|
||||||
<action android:name="android.intent.action.LOCALE_CHANGED" />
|
<action android:name="android.intent.action.LOCALE_CHANGED" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -89,10 +60,7 @@
|
|||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<!-- DownloadService -->
|
<!-- DownloadService -->
|
||||||
|
<service android:name="a.j" />
|
||||||
<service
|
|
||||||
android:name="a.j"
|
|
||||||
android:exported="false" />
|
|
||||||
|
|
||||||
<!-- Hardcode GMS version -->
|
<!-- Hardcode GMS version -->
|
||||||
<meta-data
|
<meta-data
|
||||||
@@ -105,6 +73,16 @@
|
|||||||
android:authorities="${applicationId}.workmanager-init"
|
android:authorities="${applicationId}.workmanager-init"
|
||||||
tools:node="remove" />
|
tools:node="remove" />
|
||||||
|
|
||||||
|
<!-- We don't invalidate Room -->
|
||||||
|
<service
|
||||||
|
android:name="androidx.room.MultiInstanceInvalidationService"
|
||||||
|
tools:node="remove"/>
|
||||||
|
|
||||||
|
<!-- We don't use Device Credentials -->
|
||||||
|
<activity
|
||||||
|
android:name="androidx.biometric.DeviceCredentialHandlerActivity"
|
||||||
|
tools:node="remove" />
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@@ -1,11 +1,9 @@
|
|||||||
package a;
|
package a;
|
||||||
|
|
||||||
import androidx.core.app.AppComponentFactory;
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.utils.PatchAPK;
|
import com.topjohnwu.magisk.utils.PatchAPK;
|
||||||
import com.topjohnwu.signing.BootSigner;
|
import com.topjohnwu.signing.BootSigner;
|
||||||
|
|
||||||
public class a extends AppComponentFactory {
|
public class a {
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static boolean patchAPK(String in, String out, String pkg) {
|
public static boolean patchAPK(String in, String out, String pkg) {
|
||||||
|
@@ -11,11 +11,14 @@ import androidx.work.impl.WorkDatabase
|
|||||||
import androidx.work.impl.WorkDatabase_Impl
|
import androidx.work.impl.WorkDatabase_Impl
|
||||||
import com.topjohnwu.magisk.data.database.RepoDatabase
|
import com.topjohnwu.magisk.data.database.RepoDatabase
|
||||||
import com.topjohnwu.magisk.data.database.RepoDatabase_Impl
|
import com.topjohnwu.magisk.data.database.RepoDatabase_Impl
|
||||||
|
import com.topjohnwu.magisk.data.database.SuLogDatabase
|
||||||
|
import com.topjohnwu.magisk.data.database.SuLogDatabase_Impl
|
||||||
import com.topjohnwu.magisk.di.ActivityTracker
|
import com.topjohnwu.magisk.di.ActivityTracker
|
||||||
import com.topjohnwu.magisk.di.koinModules
|
import com.topjohnwu.magisk.di.koinModules
|
||||||
import com.topjohnwu.magisk.extensions.get
|
import com.topjohnwu.magisk.extensions.get
|
||||||
import com.topjohnwu.magisk.extensions.unwrap
|
import com.topjohnwu.magisk.extensions.unwrap
|
||||||
import com.topjohnwu.magisk.utils.RootInit
|
import com.topjohnwu.magisk.utils.RootInit
|
||||||
|
import com.topjohnwu.magisk.utils.SuHandler
|
||||||
import com.topjohnwu.magisk.utils.updateConfig
|
import com.topjohnwu.magisk.utils.updateConfig
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import org.koin.android.ext.koin.androidContext
|
import org.koin.android.ext.koin.androidContext
|
||||||
@@ -34,10 +37,12 @@ open class App() : Application() {
|
|||||||
Shell.Config.verboseLogging(BuildConfig.DEBUG)
|
Shell.Config.verboseLogging(BuildConfig.DEBUG)
|
||||||
Shell.Config.addInitializers(RootInit::class.java)
|
Shell.Config.addInitializers(RootInit::class.java)
|
||||||
Shell.Config.setTimeout(2)
|
Shell.Config.setTimeout(2)
|
||||||
|
FileProvider.callHandler = SuHandler
|
||||||
Room.setFactory {
|
Room.setFactory {
|
||||||
when (it) {
|
when (it) {
|
||||||
WorkDatabase::class.java -> WorkDatabase_Impl()
|
WorkDatabase::class.java -> WorkDatabase_Impl()
|
||||||
RepoDatabase::class.java -> RepoDatabase_Impl()
|
RepoDatabase::class.java -> RepoDatabase_Impl()
|
||||||
|
SuLogDatabase::class.java -> SuLogDatabase_Impl()
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,9 +11,8 @@ import com.topjohnwu.magisk.data.repository.DBConfig
|
|||||||
import com.topjohnwu.magisk.di.Protected
|
import com.topjohnwu.magisk.di.Protected
|
||||||
import com.topjohnwu.magisk.extensions.get
|
import com.topjohnwu.magisk.extensions.get
|
||||||
import com.topjohnwu.magisk.extensions.inject
|
import com.topjohnwu.magisk.extensions.inject
|
||||||
import com.topjohnwu.magisk.extensions.packageName
|
|
||||||
import com.topjohnwu.magisk.model.preference.PreferenceModel
|
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.magisk.utils.Utils
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.topjohnwu.superuser.io.SuFile
|
import com.topjohnwu.superuser.io.SuFile
|
||||||
@@ -32,7 +31,7 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
const val ROOT_ACCESS = "root_access"
|
const val ROOT_ACCESS = "root_access"
|
||||||
const val SU_MULTIUSER_MODE = "multiuser_mode"
|
const val SU_MULTIUSER_MODE = "multiuser_mode"
|
||||||
const val SU_MNT_NS = "mnt_ns"
|
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 SU_MANAGER = "requester"
|
||||||
const val KEYSTORE = "keystore"
|
const val KEYSTORE = "keystore"
|
||||||
|
|
||||||
@@ -49,6 +48,7 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
const val REPO_ORDER = "repo_order"
|
const val REPO_ORDER = "repo_order"
|
||||||
const val SHOW_SYSTEM_APP = "show_system"
|
const val SHOW_SYSTEM_APP = "show_system"
|
||||||
const val DOWNLOAD_PATH = "download_path"
|
const val DOWNLOAD_PATH = "download_path"
|
||||||
|
const val BOOT_ID = "boot_id"
|
||||||
|
|
||||||
// system state
|
// system state
|
||||||
const val MAGISKHIDE = "magiskhide"
|
const val MAGISKHIDE = "magiskhide"
|
||||||
@@ -106,6 +106,8 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
}
|
}
|
||||||
else Value.DEFAULT_CHANNEL
|
else Value.DEFAULT_CHANNEL
|
||||||
|
|
||||||
|
var bootId by preference(Key.BOOT_ID, "")
|
||||||
|
|
||||||
var downloadPath by preference(Key.DOWNLOAD_PATH, Environment.DIRECTORY_DOWNLOADS)
|
var downloadPath by preference(Key.DOWNLOAD_PATH, Environment.DIRECTORY_DOWNLOADS)
|
||||||
var repoOrder by preference(Key.REPO_ORDER, Value.ORDER_DATE)
|
var repoOrder by preference(Key.REPO_ORDER, Value.ORDER_DATE)
|
||||||
|
|
||||||
@@ -127,7 +129,7 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
var rootMode by dbSettings(Key.ROOT_ACCESS, Value.ROOT_ACCESS_APPS_AND_ADB)
|
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 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 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 suManager by dbStrings(Key.SU_MANAGER, "", true)
|
||||||
var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true)
|
var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true)
|
||||||
|
|
||||||
@@ -135,9 +137,18 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
val downloadDirectory get() =
|
val downloadDirectory get() =
|
||||||
Utils.ensureDownloadPath(downloadPath) ?: get<Context>().getExternalFilesDir(null)!!
|
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)
|
parsePrefs(this)
|
||||||
|
|
||||||
|
// Legacy stuff
|
||||||
|
remove(SU_FINGERPRINT)
|
||||||
|
|
||||||
// Get actual state
|
// Get actual state
|
||||||
putBoolean(Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists())
|
putBoolean(Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists())
|
||||||
|
|
||||||
@@ -145,7 +156,7 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
putString(Key.ROOT_ACCESS, rootMode.toString())
|
putString(Key.ROOT_ACCESS, rootMode.toString())
|
||||||
putString(Key.SU_MNT_NS, suMntNamespaceMode.toString())
|
putString(Key.SU_MNT_NS, suMntNamespaceMode.toString())
|
||||||
putString(Key.SU_MULTIUSER_MODE, suMultiuserMode.toString())
|
putString(Key.SU_MULTIUSER_MODE, suMultiuserMode.toString())
|
||||||
putBoolean(Key.SU_FINGERPRINT, FingerprintHelper.useFingerprint())
|
putBoolean(Key.SU_BIOMETRIC, BiometricHelper.isEnabled)
|
||||||
}.also {
|
}.also {
|
||||||
if (!prefs.contains(Key.UPDATE_CHANNEL))
|
if (!prefs.contains(Key.UPDATE_CHANNEL))
|
||||||
prefs.edit().putString(Key.UPDATE_CHANNEL, defaultChannel.toString()).apply()
|
prefs.edit().putString(Key.UPDATE_CHANNEL, defaultChannel.toString()).apply()
|
||||||
@@ -154,7 +165,7 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
private fun parsePrefs(editor: SharedPreferences.Editor) = editor.apply {
|
private fun parsePrefs(editor: SharedPreferences.Editor) = editor.apply {
|
||||||
val config = SuFile.open("/data/adb", Const.MANAGER_CONFIGS)
|
val config = SuFile.open("/data/adb", Const.MANAGER_CONFIGS)
|
||||||
if (config.exists()) runCatching {
|
if (config.exists()) runCatching {
|
||||||
val input = SuFileInputStream(config).buffered()
|
val input = SuFileInputStream(config)
|
||||||
val parser = Xml.newPullParser()
|
val parser = Xml.newPullParser()
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
|
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
|
||||||
parser.setInput(input, "UTF-8")
|
parser.setInput(input, "UTF-8")
|
||||||
@@ -205,9 +216,10 @@ object Config : PreferenceModel, DBConfig {
|
|||||||
fun export() {
|
fun export() {
|
||||||
// Flush prefs to disk
|
// Flush prefs to disk
|
||||||
prefs.edit().commit()
|
prefs.edit().commit()
|
||||||
|
val context = get<Context>(Protected)
|
||||||
val xml = File(
|
val xml = File(
|
||||||
"${get<Context>(Protected).filesDir.parent}/shared_prefs",
|
"${context.filesDir.parent}/shared_prefs",
|
||||||
"${packageName}_preferences.xml"
|
"${context.packageName}_preferences.xml"
|
||||||
)
|
)
|
||||||
Shell.su("cat $xml > /data/adb/${Const.MANAGER_CONFIGS}").exec()
|
Shell.su("cat $xml > /data/adb/${Const.MANAGER_CONFIGS}").exec()
|
||||||
}
|
}
|
||||||
|
@@ -23,8 +23,10 @@ object Const {
|
|||||||
val USER_ID = Process.myUid() / 100000
|
val USER_ID = Process.myUid() / 100000
|
||||||
|
|
||||||
object Version {
|
object Version {
|
||||||
const val MIN_SUPPORT = 18000
|
const val MIN_VERSION = "v18.0"
|
||||||
const val CONNECT_MODE = 20002
|
const val MIN_VERCODE = 18000
|
||||||
|
const val CONNECT_MODE = 20100
|
||||||
|
const val PROVIDER_CONNECT = 20102
|
||||||
}
|
}
|
||||||
|
|
||||||
object ID {
|
object ID {
|
||||||
|
@@ -14,8 +14,7 @@ import android.content.res.AssetManager
|
|||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.annotation.StringRes
|
import com.topjohnwu.magisk.extensions.forceGetDeclaredField
|
||||||
import com.topjohnwu.magisk.extensions.langTagToLocale
|
|
||||||
import com.topjohnwu.magisk.model.download.DownloadService
|
import com.topjohnwu.magisk.model.download.DownloadService
|
||||||
import com.topjohnwu.magisk.model.receiver.GeneralReceiver
|
import com.topjohnwu.magisk.model.receiver.GeneralReceiver
|
||||||
import com.topjohnwu.magisk.model.update.UpdateCheckService
|
import com.topjohnwu.magisk.model.update.UpdateCheckService
|
||||||
@@ -23,11 +22,8 @@ import com.topjohnwu.magisk.ui.MainActivity
|
|||||||
import com.topjohnwu.magisk.ui.SplashActivity
|
import com.topjohnwu.magisk.ui.SplashActivity
|
||||||
import com.topjohnwu.magisk.ui.flash.FlashActivity
|
import com.topjohnwu.magisk.ui.flash.FlashActivity
|
||||||
import com.topjohnwu.magisk.ui.surequest.SuRequestActivity
|
import com.topjohnwu.magisk.ui.surequest.SuRequestActivity
|
||||||
import com.topjohnwu.magisk.utils.currentLocale
|
|
||||||
import com.topjohnwu.magisk.utils.defaultLocale
|
|
||||||
import com.topjohnwu.magisk.utils.refreshLocale
|
import com.topjohnwu.magisk.utils.refreshLocale
|
||||||
import com.topjohnwu.magisk.utils.updateConfig
|
import com.topjohnwu.magisk.utils.updateConfig
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
fun AssetManager.addAssetPath(path: String) {
|
fun AssetManager.addAssetPath(path: String) {
|
||||||
DynAPK.addAssetPath(this, path)
|
DynAPK.addAssetPath(this, path)
|
||||||
@@ -53,29 +49,22 @@ fun Context.wrapJob(): Context = object : GlobalResContext(this) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Class<*>.cmp(pkg: String = BuildConfig.APPLICATION_ID): ComponentName {
|
fun Class<*>.cmp(pkg: String): ComponentName {
|
||||||
val name = ClassMap[this].name
|
val name = ClassMap[this].name
|
||||||
return ComponentName(pkg, Info.stub?.componentMap?.get(name) ?: name)
|
return ComponentName(pkg, Info.stub?.classToComponent?.get(name) ?: name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.intent(c: Class<*>): Intent {
|
inline fun <reified T> Context.intent() = Intent().setComponent(T::class.java.cmp(packageName))
|
||||||
val cls = ClassMap[c]
|
|
||||||
return Info.stub?.let {
|
|
||||||
val className = it.componentMap.getOrElse(cls.name) { cls.name }
|
|
||||||
Intent().setComponent(ComponentName(this, className))
|
|
||||||
} ?: Intent(this, cls)
|
|
||||||
}
|
|
||||||
|
|
||||||
private open class GlobalResContext(base: Context) : ContextWrapper(base) {
|
private open class GlobalResContext(base: Context) : ContextWrapper(base) {
|
||||||
open val mRes: Resources get() = ResourceMgr.resource
|
open val mRes: Resources get() = ResourceMgr.resource
|
||||||
private val loader by lazy { javaClass.classLoader!! }
|
|
||||||
|
|
||||||
override fun getResources(): Resources {
|
override fun getResources(): Resources {
|
||||||
return mRes
|
return mRes
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassLoader(): ClassLoader {
|
override fun getClassLoader(): ClassLoader {
|
||||||
return loader
|
return javaClass.classLoader!!
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createConfigurationContext(config: Configuration): Context {
|
override fun createConfigurationContext(config: Configuration): Context {
|
||||||
@@ -109,7 +98,7 @@ object ResourceMgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(api = 28)
|
@RequiresApi(28)
|
||||||
private class JobSchedulerWrapper(private val base: JobScheduler) : JobScheduler() {
|
private class JobSchedulerWrapper(private val base: JobScheduler) : JobScheduler() {
|
||||||
|
|
||||||
override fun schedule(job: JobInfo): Int {
|
override fun schedule(job: JobInfo): Int {
|
||||||
@@ -137,48 +126,14 @@ private class JobSchedulerWrapper(private val base: JobScheduler) : JobScheduler
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun JobInfo.patch(): JobInfo {
|
private fun JobInfo.patch(): JobInfo {
|
||||||
// We need to patch the component of JobInfo to access WorkManager SystemJobService
|
// We need to swap out the service of JobInfo
|
||||||
|
|
||||||
val name = service.className
|
val name = service.className
|
||||||
val component = ComponentName(
|
val component = ComponentName(
|
||||||
service.packageName,
|
service.packageName,
|
||||||
Info.stub!!.componentMap[name] ?: name)
|
Info.stub!!.classToComponent[name] ?: name)
|
||||||
|
|
||||||
// Clone the JobInfo except component
|
javaClass.forceGetDeclaredField("service")?.set(this, component)
|
||||||
val builder = JobInfo.Builder(id, component)
|
return this
|
||||||
.setExtras(extras)
|
|
||||||
.setTransientExtras(transientExtras)
|
|
||||||
.setClipData(clipData, clipGrantFlags)
|
|
||||||
.setRequiredNetwork(requiredNetwork)
|
|
||||||
.setEstimatedNetworkBytes(estimatedNetworkDownloadBytes, estimatedNetworkUploadBytes)
|
|
||||||
.setRequiresCharging(isRequireCharging)
|
|
||||||
.setRequiresDeviceIdle(isRequireDeviceIdle)
|
|
||||||
.setRequiresBatteryNotLow(isRequireBatteryNotLow)
|
|
||||||
.setRequiresStorageNotLow(isRequireStorageNotLow)
|
|
||||||
.also {
|
|
||||||
triggerContentUris?.let { uris ->
|
|
||||||
for (uri in uris)
|
|
||||||
it.addTriggerContentUri(uri)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.setTriggerContentUpdateDelay(triggerContentUpdateDelay)
|
|
||||||
.setTriggerContentMaxDelay(triggerContentMaxDelay)
|
|
||||||
.setImportantWhileForeground(isImportantWhileForeground)
|
|
||||||
.setPrefetch(isPrefetch)
|
|
||||||
.setPersisted(isPersisted)
|
|
||||||
|
|
||||||
if (isPeriodic) {
|
|
||||||
builder.setPeriodic(intervalMillis, flexMillis)
|
|
||||||
} else {
|
|
||||||
if (minLatencyMillis > 0)
|
|
||||||
builder.setMinimumLatency(minLatencyMillis)
|
|
||||||
if (maxExecutionDelayMillis > 0)
|
|
||||||
builder.setOverrideDeadline(maxExecutionDelayMillis)
|
|
||||||
}
|
|
||||||
if (!isRequireDeviceIdle)
|
|
||||||
builder.setBackoffCriteria(initialBackoffMillis, backoffPolicy)
|
|
||||||
|
|
||||||
return builder.build()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,8 +147,9 @@ object ClassMap {
|
|||||||
UpdateCheckService::class.java to a.g::class.java,
|
UpdateCheckService::class.java to a.g::class.java,
|
||||||
GeneralReceiver::class.java to a.h::class.java,
|
GeneralReceiver::class.java to a.h::class.java,
|
||||||
DownloadService::class.java to a.j::class.java,
|
DownloadService::class.java to a.j::class.java,
|
||||||
SuRequestActivity::class.java to a.m::class.java
|
SuRequestActivity::class.java to a.m::class.java,
|
||||||
|
ProcessPhoenix::class.java to a.r::class.java
|
||||||
)
|
)
|
||||||
|
|
||||||
operator fun get(c: Class<*>) = map.getOrElse(c) { throw IllegalArgumentException() }
|
operator fun get(c: Class<*>) = map.getOrElse(c) { c }
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,8 @@ import com.topjohnwu.magisk.utils.CachedValue
|
|||||||
import com.topjohnwu.magisk.utils.KObservableField
|
import com.topjohnwu.magisk.utils.KObservableField
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.topjohnwu.superuser.ShellUtils
|
import com.topjohnwu.superuser.ShellUtils
|
||||||
|
import java.io.FileInputStream
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
val isRunningAsStub get() = Info.stub != null
|
val isRunningAsStub get() = Info.stub != null
|
||||||
|
|
||||||
@@ -32,28 +34,41 @@ object Info {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isNewReboot by lazy {
|
||||||
|
try {
|
||||||
|
FileInputStream("/proc/sys/kernel/random/boot_id").bufferedReader().use {
|
||||||
|
val id = it.readLine()
|
||||||
|
if (id != Config.bootId) {
|
||||||
|
Config.bootId = id
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: IOException) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun loadState() = runCatching {
|
private fun loadState() = runCatching {
|
||||||
val str = ShellUtils.fastCmd("magisk -v").split(":".toRegex())[0]
|
val str = ShellUtils.fastCmd("magisk -v").split(":".toRegex())[0]
|
||||||
val code = ShellUtils.fastCmd("magisk -V").toInt()
|
val code = ShellUtils.fastCmd("magisk -V").toInt()
|
||||||
val hide = Shell.su("magiskhide --status").exec().isSuccess
|
val hide = Shell.su("magiskhide --status").exec().isSuccess
|
||||||
var mode = -1
|
Env(str, code, hide)
|
||||||
if (code >= Const.Version.CONNECT_MODE) {
|
|
||||||
mode = Shell.su("magisk --connect-mode").exec().code
|
|
||||||
if (mode == 0) {
|
|
||||||
// Manually trigger broadcast test
|
|
||||||
Shell.su("magisk --broadcast-test").exec()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Env(code, str, hide, mode)
|
|
||||||
}.getOrElse { Env() }
|
}.getOrElse { Env() }
|
||||||
|
|
||||||
class Env(
|
class Env(
|
||||||
val magiskVersionCode: Int = -1,
|
|
||||||
val magiskVersionString: String = "",
|
val magiskVersionString: String = "",
|
||||||
hide: Boolean = false,
|
code: Int = -1,
|
||||||
var connectionMode: Int = -1
|
hide: Boolean = false
|
||||||
) {
|
) {
|
||||||
val magiskHide get() = Config.magiskHide
|
val magiskHide get() = Config.magiskHide
|
||||||
|
val magiskVersionCode = when (code) {
|
||||||
|
in Int.MIN_VALUE..Const.Version.MIN_VERCODE -> -1
|
||||||
|
else -> if(Shell.rootAccess()) code else -1
|
||||||
|
}
|
||||||
|
val isUnsupported = code > 0 && code < Const.Version.MIN_VERCODE
|
||||||
|
val isActive = magiskVersionCode >= 0
|
||||||
|
|
||||||
init {
|
init {
|
||||||
Config.magiskHide = hide
|
Config.magiskHide = hide
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.base.viewmodel
|
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.extensions.doOnSubscribeUi
|
||||||
import com.topjohnwu.magisk.model.events.BackPressEvent
|
import com.topjohnwu.magisk.model.events.BackPressEvent
|
||||||
import com.topjohnwu.magisk.model.events.PermissionEvent
|
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()
|
ViewActionEvent(action).publish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,33 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.database
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.data.database.base.*
|
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskLog
|
|
||||||
import com.topjohnwu.magisk.model.entity.toLog
|
|
||||||
import com.topjohnwu.magisk.model.entity.toMap
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class LogDao : BaseDao() {
|
|
||||||
|
|
||||||
override val table = DatabaseDefinition.Table.LOG
|
|
||||||
|
|
||||||
fun deleteOutdated(
|
|
||||||
suTimeout: Long = TimeUnit.DAYS.toMillis(14)
|
|
||||||
) = query<Delete> {
|
|
||||||
condition {
|
|
||||||
lessThan("time", suTimeout.toString())
|
|
||||||
}
|
|
||||||
}.ignoreElement()
|
|
||||||
|
|
||||||
fun deleteAll() = query<Delete> {}.ignoreElement()
|
|
||||||
|
|
||||||
fun fetchAll() = query<Select> {
|
|
||||||
orderBy("time", Order.DESC)
|
|
||||||
}.flattenAsFlowable { it }
|
|
||||||
.map { it.toLog() }
|
|
||||||
.toList()
|
|
||||||
|
|
||||||
fun put(log: MagiskLog) = query<Insert> {
|
|
||||||
values(log.toMap())
|
|
||||||
}.ignoreElement()
|
|
||||||
|
|
||||||
}
|
|
@@ -3,7 +3,10 @@ package com.topjohnwu.magisk.data.database
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import com.topjohnwu.magisk.Const
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.data.database.base.*
|
import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Delete
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Replace
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Select
|
||||||
import com.topjohnwu.magisk.extensions.now
|
import com.topjohnwu.magisk.extensions.now
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
||||||
import com.topjohnwu.magisk.model.entity.toMap
|
import com.topjohnwu.magisk.model.entity.toMap
|
||||||
@@ -16,7 +19,7 @@ class PolicyDao(
|
|||||||
private val context: Context
|
private val context: Context
|
||||||
) : BaseDao() {
|
) : BaseDao() {
|
||||||
|
|
||||||
override val table: String = DatabaseDefinition.Table.POLICY
|
override val table: String = Table.POLICY
|
||||||
|
|
||||||
fun deleteOutdated(
|
fun deleteOutdated(
|
||||||
nowSeconds: Long = TimeUnit.MILLISECONDS.toSeconds(now)
|
nowSeconds: Long = TimeUnit.MILLISECONDS.toSeconds(now)
|
||||||
@@ -72,4 +75,4 @@ class PolicyDao(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -4,8 +4,14 @@ import androidx.room.*
|
|||||||
import com.topjohnwu.magisk.Config
|
import com.topjohnwu.magisk.Config
|
||||||
import com.topjohnwu.magisk.model.entity.module.Repo
|
import com.topjohnwu.magisk.model.entity.module.Repo
|
||||||
|
|
||||||
|
@Database(version = 6, entities = [Repo::class, RepoEtag::class])
|
||||||
|
abstract class RepoDatabase : RoomDatabase() {
|
||||||
|
|
||||||
|
abstract fun repoDao() : RepoDao
|
||||||
|
}
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
abstract class RepoDao {
|
abstract class RepoDao(private val db: RepoDatabase) {
|
||||||
|
|
||||||
val repoIDList get() = getRepoID().map { it.id }
|
val repoIDList get() = getRepoID().map { it.id }
|
||||||
|
|
||||||
@@ -15,13 +21,10 @@ abstract class RepoDao {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var etagKey: String
|
var etagKey: String
|
||||||
set(etag) = addEtagRaw(RepoEtag(0, etag))
|
set(value) = addEtagRaw(RepoEtag(0, value))
|
||||||
get() = etagRaw()?.key.orEmpty()
|
get() = etagRaw()?.key.orEmpty()
|
||||||
|
|
||||||
fun clear() {
|
fun clear() = db.clearAllTables()
|
||||||
clearRepos()
|
|
||||||
clearEtag()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Query("SELECT * FROM repos ORDER BY last_update DESC")
|
@Query("SELECT * FROM repos ORDER BY last_update DESC")
|
||||||
protected abstract fun getReposDateOrder(): List<Repo>
|
protected abstract fun getReposDateOrder(): List<Repo>
|
||||||
@@ -52,12 +55,6 @@ abstract class RepoDao {
|
|||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
protected abstract fun addEtagRaw(etag: RepoEtag)
|
protected abstract fun addEtagRaw(etag: RepoEtag)
|
||||||
|
|
||||||
@Query("DELETE FROM repos")
|
|
||||||
protected abstract fun clearRepos()
|
|
||||||
|
|
||||||
@Query("DELETE FROM etag")
|
|
||||||
protected abstract fun clearEtag()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class RepoID(
|
data class RepoID(
|
||||||
|
@@ -1,11 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.database
|
|
||||||
|
|
||||||
import androidx.room.Database
|
|
||||||
import androidx.room.RoomDatabase
|
|
||||||
import com.topjohnwu.magisk.model.entity.module.Repo
|
|
||||||
|
|
||||||
@Database(version = 6, entities = [Repo::class, RepoEtag::class])
|
|
||||||
abstract class RepoDatabase : RoomDatabase() {
|
|
||||||
|
|
||||||
abstract fun repoDao() : RepoDao
|
|
||||||
}
|
|
@@ -1,10 +1,13 @@
|
|||||||
package com.topjohnwu.magisk.data.database
|
package com.topjohnwu.magisk.data.database
|
||||||
|
|
||||||
import com.topjohnwu.magisk.data.database.base.*
|
import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Delete
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Replace
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Select
|
||||||
|
|
||||||
class SettingsDao : BaseDao() {
|
class SettingsDao : BaseDao() {
|
||||||
|
|
||||||
override val table = DatabaseDefinition.Table.SETTINGS
|
override val table = Table.SETTINGS
|
||||||
|
|
||||||
fun delete(key: String) = query<Delete> {
|
fun delete(key: String) = query<Delete> {
|
||||||
condition { equals("key", key) }
|
condition { equals("key", key) }
|
||||||
@@ -19,4 +22,4 @@ class SettingsDao : BaseDao() {
|
|||||||
condition { equals("key", key) }
|
condition { equals("key", key) }
|
||||||
}.map { it.firstOrNull()?.values?.firstOrNull()?.toIntOrNull() ?: default }
|
}.map { it.firstOrNull()?.values?.firstOrNull()?.toIntOrNull() ?: default }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,13 @@
|
|||||||
package com.topjohnwu.magisk.data.database
|
package com.topjohnwu.magisk.data.database
|
||||||
|
|
||||||
import com.topjohnwu.magisk.data.database.base.*
|
import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Delete
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Replace
|
||||||
|
import com.topjohnwu.magisk.data.database.magiskdb.Select
|
||||||
|
|
||||||
class StringDao : BaseDao() {
|
class StringDao : BaseDao() {
|
||||||
|
|
||||||
override val table = DatabaseDefinition.Table.STRINGS
|
override val table = Table.STRINGS
|
||||||
|
|
||||||
fun delete(key: String) = query<Delete> {
|
fun delete(key: String) = query<Delete> {
|
||||||
condition { equals("key", key) }
|
condition { equals("key", key) }
|
||||||
@@ -19,4 +22,4 @@ class StringDao : BaseDao() {
|
|||||||
condition { equals("key", key) }
|
condition { equals("key", key) }
|
||||||
}.map { it.firstOrNull()?.values?.firstOrNull() ?: default }
|
}.map { it.firstOrNull()?.values?.firstOrNull() ?: default }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,36 @@
|
|||||||
|
package com.topjohnwu.magisk.data.database
|
||||||
|
|
||||||
|
import androidx.room.*
|
||||||
|
import com.topjohnwu.magisk.model.entity.MagiskLog
|
||||||
|
import io.reactivex.Completable
|
||||||
|
import io.reactivex.Single
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
@Database(version = 1, entities = [MagiskLog::class])
|
||||||
|
abstract class SuLogDatabase : RoomDatabase() {
|
||||||
|
|
||||||
|
abstract fun suLogDao(): SuLogDao
|
||||||
|
}
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
abstract class SuLogDao(private val db: SuLogDatabase) {
|
||||||
|
|
||||||
|
private val twoWeeksAgo =
|
||||||
|
Calendar.getInstance().apply { add(Calendar.WEEK_OF_YEAR, -2) }.timeInMillis
|
||||||
|
|
||||||
|
fun deleteAll() = Completable.fromAction { db.clearAllTables() }
|
||||||
|
|
||||||
|
fun fetchAll() = deleteOutdated().andThen(fetch())
|
||||||
|
|
||||||
|
@Query("SELECT * FROM logs ORDER BY time DESC")
|
||||||
|
protected abstract fun fetch(): Single<MutableList<MagiskLog>>
|
||||||
|
|
||||||
|
@Insert
|
||||||
|
abstract fun insert(log: MagiskLog): Completable
|
||||||
|
|
||||||
|
@Query("DELETE FROM logs WHERE time < :timeout")
|
||||||
|
protected abstract fun deleteOutdated(
|
||||||
|
timeout: Long = twoWeeksAgo
|
||||||
|
): Completable
|
||||||
|
|
||||||
|
}
|
@@ -1,15 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.database.base
|
|
||||||
|
|
||||||
abstract class BaseDao {
|
|
||||||
|
|
||||||
abstract val table: String
|
|
||||||
|
|
||||||
inline fun <reified Builder : MagiskQueryBuilder> query(builder: Builder.() -> Unit) =
|
|
||||||
Builder::class.java.newInstance()
|
|
||||||
.apply { table = this@BaseDao.table }
|
|
||||||
.apply(builder)
|
|
||||||
.toString()
|
|
||||||
.let { MagiskQuery(it) }
|
|
||||||
.query()
|
|
||||||
|
|
||||||
}
|
|
@@ -1,30 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.database.base
|
|
||||||
|
|
||||||
import androidx.annotation.AnyThread
|
|
||||||
import com.topjohnwu.superuser.Shell
|
|
||||||
import io.reactivex.Single
|
|
||||||
|
|
||||||
object DatabaseDefinition {
|
|
||||||
|
|
||||||
object Table {
|
|
||||||
const val POLICY = "policies"
|
|
||||||
const val LOG = "logs"
|
|
||||||
const val SETTINGS = "settings"
|
|
||||||
const val STRINGS = "strings"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@AnyThread
|
|
||||||
fun MagiskQuery.query() = query.su()
|
|
||||||
|
|
||||||
fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out }
|
|
||||||
fun String.su() = suRaw().map { it.toMap() }
|
|
||||||
|
|
||||||
fun List<String>.toMap() = map { it.split(Regex("\\|")) }
|
|
||||||
.map { it.toMapInternal() }
|
|
||||||
|
|
||||||
private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) }
|
|
||||||
.filter { it.size == 2 }
|
|
||||||
.map { Pair(it[0], it[1]) }
|
|
||||||
.toMap()
|
|
@@ -1,5 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.database.base
|
|
||||||
|
|
||||||
inline class MagiskQuery(private val _query: String) {
|
|
||||||
val query get() = "magisk --sqlite '$_query'"
|
|
||||||
}
|
|
@@ -0,0 +1,44 @@
|
|||||||
|
package com.topjohnwu.magisk.data.database.magiskdb
|
||||||
|
|
||||||
|
import androidx.annotation.StringDef
|
||||||
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import io.reactivex.Single
|
||||||
|
|
||||||
|
abstract class BaseDao {
|
||||||
|
|
||||||
|
object Table {
|
||||||
|
const val POLICY = "policies"
|
||||||
|
const val LOG = "logs"
|
||||||
|
const val SETTINGS = "settings"
|
||||||
|
const val STRINGS = "strings"
|
||||||
|
}
|
||||||
|
|
||||||
|
@StringDef(Table.POLICY, Table.LOG, Table.SETTINGS, Table.STRINGS)
|
||||||
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
|
annotation class TableStrict
|
||||||
|
|
||||||
|
@TableStrict
|
||||||
|
abstract val table: String
|
||||||
|
|
||||||
|
inline fun <reified Builder : Query.Builder> query(builder: Builder.() -> Unit = {}) =
|
||||||
|
Builder::class.java.newInstance()
|
||||||
|
.apply { table = this@BaseDao.table }
|
||||||
|
.apply(builder)
|
||||||
|
.toString()
|
||||||
|
.let { Query(it) }
|
||||||
|
.query()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Query.query() = query.su()
|
||||||
|
|
||||||
|
private fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out }
|
||||||
|
private fun String.su() = suRaw().map { it.toMap() }
|
||||||
|
|
||||||
|
private fun List<String>.toMap() = map { it.split(Regex("\\|")) }
|
||||||
|
.map { it.toMapInternal() }
|
||||||
|
|
||||||
|
private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) }
|
||||||
|
.filter { it.size == 2 }
|
||||||
|
.map { Pair(it[0], it[1]) }
|
||||||
|
.toMap()
|
@@ -1,27 +1,17 @@
|
|||||||
package com.topjohnwu.magisk.data.database.base
|
package com.topjohnwu.magisk.data.database.magiskdb
|
||||||
|
|
||||||
import androidx.annotation.StringDef
|
import androidx.annotation.StringDef
|
||||||
import com.topjohnwu.magisk.data.database.base.Order.Companion.ASC
|
|
||||||
import com.topjohnwu.magisk.data.database.base.Order.Companion.DESC
|
|
||||||
|
|
||||||
interface MagiskQueryBuilder {
|
class Query(private val _query: String) {
|
||||||
|
val query get() = "magisk --sqlite '$_query'"
|
||||||
|
|
||||||
val requestType: String
|
interface Builder {
|
||||||
var table: String
|
val requestType: String
|
||||||
|
var table: String
|
||||||
companion object {
|
|
||||||
inline operator fun <reified Builder : MagiskQueryBuilder> invoke(builder: Builder.() -> Unit): MagiskQuery =
|
|
||||||
Builder::class.java.newInstance()
|
|
||||||
.apply(builder)
|
|
||||||
.toString()
|
|
||||||
.let {
|
|
||||||
MagiskQuery(it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Delete : MagiskQueryBuilder {
|
class Delete : Query.Builder {
|
||||||
override val requestType: String = "DELETE FROM"
|
override val requestType: String = "DELETE FROM"
|
||||||
override var table = ""
|
override var table = ""
|
||||||
|
|
||||||
@@ -36,7 +26,7 @@ class Delete : MagiskQueryBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Select : MagiskQueryBuilder {
|
class Select : Query.Builder {
|
||||||
override val requestType: String get() = "SELECT $fields FROM"
|
override val requestType: String get() = "SELECT $fields FROM"
|
||||||
override lateinit var table: String
|
override lateinit var table: String
|
||||||
|
|
||||||
@@ -69,7 +59,7 @@ class Replace : Insert() {
|
|||||||
override val requestType: String = "REPLACE INTO"
|
override val requestType: String = "REPLACE INTO"
|
||||||
}
|
}
|
||||||
|
|
||||||
open class Insert : MagiskQueryBuilder {
|
open class Insert : Query.Builder {
|
||||||
override val requestType: String = "INSERT INTO"
|
override val requestType: String = "INSERT INTO"
|
||||||
override lateinit var table: String
|
override lateinit var table: String
|
||||||
|
|
||||||
@@ -137,19 +127,11 @@ class Condition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Order {
|
object Order {
|
||||||
|
const val ASC = "ASC"
|
||||||
@set:OrderStrict
|
const val DESC = "DESC"
|
||||||
var order = DESC
|
|
||||||
var field = ""
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val ASC = "ASC"
|
|
||||||
const val DESC = "DESC"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@StringDef(ASC, DESC)
|
@StringDef(Order.ASC, Order.DESC)
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
annotation class OrderStrict
|
annotation class OrderStrict
|
@@ -29,8 +29,8 @@ interface DBConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class DBSettingsValue(
|
class DBSettingsValue(
|
||||||
private val name: String,
|
private val name: String,
|
||||||
private val default: Int
|
private val default: Int
|
||||||
) : ReadWriteProperty<DBConfig, Int> {
|
) : ReadWriteProperty<DBConfig, Int> {
|
||||||
|
|
||||||
private var value: Int? = null
|
private var value: Int? = null
|
||||||
@@ -47,29 +47,29 @@ class DBSettingsValue(
|
|||||||
this.value = value
|
this.value = value
|
||||||
}
|
}
|
||||||
thisRef.settingsDao.put(name, value)
|
thisRef.settingsDao.put(name, value)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.subscribe()
|
.subscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DBBoolSettings(
|
class DBBoolSettings(
|
||||||
name: String,
|
name: String,
|
||||||
default: Boolean
|
default: Boolean
|
||||||
) : ReadWriteProperty<DBConfig, Boolean> {
|
) : ReadWriteProperty<DBConfig, Boolean> {
|
||||||
|
|
||||||
val base = DBSettingsValue(name, if (default) 1 else 0)
|
val base = DBSettingsValue(name, if (default) 1 else 0)
|
||||||
|
|
||||||
override fun getValue(thisRef: DBConfig, property: KProperty<*>): Boolean
|
override fun getValue(thisRef: DBConfig, property: KProperty<*>): Boolean =
|
||||||
= base.getValue(thisRef, property) != 0
|
base.getValue(thisRef, property) != 0
|
||||||
|
|
||||||
override fun setValue(thisRef: DBConfig, property: KProperty<*>, value: Boolean) =
|
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(
|
class DBStringsValue(
|
||||||
private val name: String,
|
private val name: String,
|
||||||
private val default: String,
|
private val default: String,
|
||||||
private val sync: Boolean
|
private val sync: Boolean
|
||||||
) : ReadWriteProperty<DBConfig, String> {
|
) : ReadWriteProperty<DBConfig, String> {
|
||||||
|
|
||||||
private var value: String? = null
|
private var value: String? = null
|
||||||
@@ -90,16 +90,16 @@ class DBStringsValue(
|
|||||||
thisRef.stringDao.delete(name).blockingAwait()
|
thisRef.stringDao.delete(name).blockingAwait()
|
||||||
} else {
|
} else {
|
||||||
thisRef.stringDao.delete(name)
|
thisRef.stringDao.delete(name)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.subscribe()
|
.subscribe()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (sync) {
|
if (sync) {
|
||||||
thisRef.stringDao.put(name, value).blockingAwait()
|
thisRef.stringDao.put(name, value).blockingAwait()
|
||||||
} else {
|
} else {
|
||||||
thisRef.stringDao.put(name, value)
|
thisRef.stringDao.put(name, value)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.subscribe()
|
.subscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,40 +1,38 @@
|
|||||||
package com.topjohnwu.magisk.data.repository
|
package com.topjohnwu.magisk.data.repository
|
||||||
|
|
||||||
import com.topjohnwu.magisk.Const
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.data.database.LogDao
|
import com.topjohnwu.magisk.data.database.SuLogDao
|
||||||
import com.topjohnwu.magisk.data.database.base.suRaw
|
|
||||||
import com.topjohnwu.magisk.extensions.toSingle
|
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskLog
|
import com.topjohnwu.magisk.model.entity.MagiskLog
|
||||||
import com.topjohnwu.magisk.model.entity.WrappedMagiskLog
|
import com.topjohnwu.magisk.model.entity.WrappedMagiskLog
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import io.reactivex.Completable
|
||||||
|
import io.reactivex.Single
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
|
||||||
class LogRepository(
|
class LogRepository(
|
||||||
private val logDao: LogDao
|
private val logDao: SuLogDao
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun fetchLogs() = logDao.fetchAll()
|
fun fetchLogs() = logDao.fetchAll().map { it.wrap() }
|
||||||
.map { it.sortByDescending { it.date.time }; it }
|
|
||||||
.map { it.wrap() }
|
|
||||||
|
|
||||||
fun fetchMagiskLogs() = "tail -n 5000 ${Const.MAGISK_LOG}".suRaw()
|
fun fetchMagiskLogs() = Single.fromCallable {
|
||||||
.filter { it.isNotEmpty() }
|
Shell.su("tail -n 5000 ${Const.MAGISK_LOG}").exec().out
|
||||||
|
}.flattenAsFlowable { it }.filter { it.isNotEmpty() }
|
||||||
|
|
||||||
fun clearLogs() = logDao.deleteAll()
|
fun clearLogs() = logDao.deleteAll()
|
||||||
fun clearOutdated() = logDao.deleteOutdated()
|
|
||||||
|
|
||||||
fun clearMagiskLogs() = Shell.su("echo -n > " + Const.MAGISK_LOG)
|
fun clearMagiskLogs() = Completable.fromAction {
|
||||||
.toSingle()
|
Shell.su("echo -n > ${Const.MAGISK_LOG}").exec()
|
||||||
.map { it.exec() }
|
}
|
||||||
|
|
||||||
fun put(log: MagiskLog) = logDao.put(log)
|
fun insert(log: MagiskLog) = logDao.insert(log)
|
||||||
|
|
||||||
private fun List<MagiskLog>.wrap(): List<WrappedMagiskLog> {
|
private fun List<MagiskLog>.wrap(): List<WrappedMagiskLog> {
|
||||||
val day = TimeUnit.DAYS.toMillis(1)
|
val day = TimeUnit.DAYS.toMillis(1)
|
||||||
return groupBy { it.date.time / day }
|
return groupBy { it.time / day }
|
||||||
.map { WrappedMagiskLog(it.key * day, it.value) }
|
.map { WrappedMagiskLog(it.key * day, it.value) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,6 @@ package com.topjohnwu.magisk.data.repository
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import com.topjohnwu.magisk.Config
|
import com.topjohnwu.magisk.Config
|
||||||
import com.topjohnwu.magisk.Info
|
import com.topjohnwu.magisk.Info
|
||||||
import com.topjohnwu.magisk.data.database.base.su
|
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.network.GithubRawServices
|
||||||
import com.topjohnwu.magisk.extensions.getLabel
|
import com.topjohnwu.magisk.extensions.getLabel
|
||||||
import com.topjohnwu.magisk.extensions.packageName
|
import com.topjohnwu.magisk.extensions.packageName
|
||||||
@@ -57,7 +56,7 @@ class MagiskRepository(
|
|||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
fun toggleHide(isEnabled: Boolean, packageName: String, process: String) =
|
fun toggleHide(isEnabled: Boolean, packageName: String, process: String) =
|
||||||
"magiskhide --%s %s %s".format(isEnabled.state, packageName, process).su().ignoreElement()
|
Shell.su("magiskhide --${isEnabled.state} $packageName $process").submit()
|
||||||
|
|
||||||
private val Boolean.state get() = if (this) "add" else "rm"
|
private val Boolean.state get() = if (this) "add" else "rm"
|
||||||
|
|
||||||
|
@@ -8,16 +8,20 @@ import org.koin.dsl.module
|
|||||||
|
|
||||||
|
|
||||||
val databaseModule = module {
|
val databaseModule = module {
|
||||||
single { LogDao() }
|
|
||||||
single { PolicyDao(get()) }
|
single { PolicyDao(get()) }
|
||||||
single { SettingsDao() }
|
single { SettingsDao() }
|
||||||
single { StringDao() }
|
single { StringDao() }
|
||||||
single { createRepoDatabase(get()) }
|
single { createRepoDatabase(get()).repoDao() }
|
||||||
single { get<RepoDatabase>().repoDao() }
|
single { createSuLogDatabase(get(Protected)).suLogDao() }
|
||||||
single { RepoUpdater(get(), get()) }
|
single { RepoUpdater(get(), get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createRepoDatabase(context: Context) =
|
fun createRepoDatabase(context: Context) =
|
||||||
Room.databaseBuilder(context, RepoDatabase::class.java, "repo.db")
|
Room.databaseBuilder(context, RepoDatabase::class.java, "repo.db")
|
||||||
.fallbackToDestructiveMigration()
|
.fallbackToDestructiveMigration()
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
fun createSuLogDatabase(context: Context) =
|
||||||
|
Room.databaseBuilder(context, SuLogDatabase::class.java, "sulogs.db")
|
||||||
|
.fallbackToDestructiveMigration()
|
||||||
|
.build()
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.extensions
|
|
||||||
|
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
|
|
||||||
fun ui(body: () -> Unit) = Handler(Looper.getMainLooper()).post(body)
|
|
@@ -2,6 +2,7 @@ package com.topjohnwu.magisk.extensions
|
|||||||
|
|
||||||
import androidx.databinding.ObservableField
|
import androidx.databinding.ObservableField
|
||||||
import com.topjohnwu.magisk.utils.KObservableField
|
import com.topjohnwu.magisk.utils.KObservableField
|
||||||
|
import com.topjohnwu.superuser.internal.UiThreadHandler
|
||||||
import io.reactivex.*
|
import io.reactivex.*
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.disposables.Disposables
|
import io.reactivex.disposables.Disposables
|
||||||
@@ -43,35 +44,35 @@ typealias OnErrorListener = (Throwable) -> Unit
|
|||||||
/*=== ALIASES FOR OBSERVABLES ===*/
|
/*=== ALIASES FOR OBSERVABLES ===*/
|
||||||
|
|
||||||
fun <T> Observable<T>.subscribeK(
|
fun <T> Observable<T>.subscribeK(
|
||||||
onError: OnErrorListener = { it.printStackTrace() },
|
onError: OnErrorListener = { it.printStackTrace() },
|
||||||
onComplete: OnCompleteListener = {},
|
onComplete: OnCompleteListener = {},
|
||||||
onNext: OnSuccessListener<T> = {}
|
onNext: OnSuccessListener<T> = {}
|
||||||
) = applySchedulers()
|
) = applySchedulers()
|
||||||
.subscribe(onNext, onError, onComplete)
|
.subscribe(onNext, onError, onComplete)
|
||||||
|
|
||||||
fun <T> Single<T>.subscribeK(
|
fun <T> Single<T>.subscribeK(
|
||||||
onError: OnErrorListener = { it.printStackTrace() },
|
onError: OnErrorListener = { it.printStackTrace() },
|
||||||
onNext: OnSuccessListener<T> = {}
|
onSuccess: OnSuccessListener<T> = {}
|
||||||
) = applySchedulers()
|
) = applySchedulers()
|
||||||
.subscribe(onNext, onError)
|
.subscribe(onSuccess, onError)
|
||||||
|
|
||||||
fun <T> Maybe<T>.subscribeK(
|
fun <T> Maybe<T>.subscribeK(
|
||||||
onError: OnErrorListener = { it.printStackTrace() },
|
onError: OnErrorListener = { it.printStackTrace() },
|
||||||
onComplete: OnCompleteListener = {},
|
onComplete: OnCompleteListener = {},
|
||||||
onNext: OnSuccessListener<T> = {}
|
onSuccess: OnSuccessListener<T> = {}
|
||||||
) = applySchedulers()
|
) = applySchedulers()
|
||||||
.subscribe(onNext, onError, onComplete)
|
.subscribe(onSuccess, onError, onComplete)
|
||||||
|
|
||||||
fun <T> Flowable<T>.subscribeK(
|
fun <T> Flowable<T>.subscribeK(
|
||||||
onError: OnErrorListener = { it.printStackTrace() },
|
onError: OnErrorListener = { it.printStackTrace() },
|
||||||
onComplete: OnCompleteListener = {},
|
onComplete: OnCompleteListener = {},
|
||||||
onNext: OnSuccessListener<T> = {}
|
onNext: OnSuccessListener<T> = {}
|
||||||
) = applySchedulers()
|
) = applySchedulers()
|
||||||
.subscribe(onNext, onError, onComplete)
|
.subscribe(onNext, onError, onComplete)
|
||||||
|
|
||||||
fun Completable.subscribeK(
|
fun Completable.subscribeK(
|
||||||
onError: OnErrorListener = { it.printStackTrace() },
|
onError: OnErrorListener = { it.printStackTrace() },
|
||||||
onComplete: OnCompleteListener = {}
|
onComplete: OnCompleteListener = {}
|
||||||
) = applySchedulers()
|
) = applySchedulers()
|
||||||
.subscribe(onComplete, onError)
|
.subscribe(onComplete, onError)
|
||||||
|
|
||||||
@@ -104,54 +105,54 @@ fun Completable.updateBy(
|
|||||||
|
|
||||||
|
|
||||||
fun <T> Observable<T>.doOnSubscribeUi(body: () -> Unit) =
|
fun <T> Observable<T>.doOnSubscribeUi(body: () -> Unit) =
|
||||||
doOnSubscribe { ui { body() } }
|
doOnSubscribe { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
fun <T> Single<T>.doOnSubscribeUi(body: () -> Unit) =
|
fun <T> Single<T>.doOnSubscribeUi(body: () -> Unit) =
|
||||||
doOnSubscribe { ui { body() } }
|
doOnSubscribe { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
fun <T> Maybe<T>.doOnSubscribeUi(body: () -> Unit) =
|
fun <T> Maybe<T>.doOnSubscribeUi(body: () -> Unit) =
|
||||||
doOnSubscribe { ui { body() } }
|
doOnSubscribe { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
fun <T> Flowable<T>.doOnSubscribeUi(body: () -> Unit) =
|
fun <T> Flowable<T>.doOnSubscribeUi(body: () -> Unit) =
|
||||||
doOnSubscribe { ui { body() } }
|
doOnSubscribe { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
fun Completable.doOnSubscribeUi(body: () -> Unit) =
|
fun Completable.doOnSubscribeUi(body: () -> Unit) =
|
||||||
doOnSubscribe { ui { body() } }
|
doOnSubscribe { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
|
|
||||||
fun <T> Observable<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
fun <T> Observable<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
||||||
doOnError { ui { body(it) } }
|
doOnError { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Single<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
fun <T> Single<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
||||||
doOnError { ui { body(it) } }
|
doOnError { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Maybe<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
fun <T> Maybe<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
||||||
doOnError { ui { body(it) } }
|
doOnError { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Flowable<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
fun <T> Flowable<T>.doOnErrorUi(body: (Throwable) -> Unit) =
|
||||||
doOnError { ui { body(it) } }
|
doOnError { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun Completable.doOnErrorUi(body: (Throwable) -> Unit) =
|
fun Completable.doOnErrorUi(body: (Throwable) -> Unit) =
|
||||||
doOnError { ui { body(it) } }
|
doOnError { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
|
|
||||||
fun <T> Observable<T>.doOnNextUi(body: (T) -> Unit) =
|
fun <T> Observable<T>.doOnNextUi(body: (T) -> Unit) =
|
||||||
doOnNext { ui { body(it) } }
|
doOnNext { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Flowable<T>.doOnNextUi(body: (T) -> Unit) =
|
fun <T> Flowable<T>.doOnNextUi(body: (T) -> Unit) =
|
||||||
doOnNext { ui { body(it) } }
|
doOnNext { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Single<T>.doOnSuccessUi(body: (T) -> Unit) =
|
fun <T> Single<T>.doOnSuccessUi(body: (T) -> Unit) =
|
||||||
doOnSuccess { ui { body(it) } }
|
doOnSuccess { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Maybe<T>.doOnSuccessUi(body: (T) -> Unit) =
|
fun <T> Maybe<T>.doOnSuccessUi(body: (T) -> Unit) =
|
||||||
doOnSuccess { ui { body(it) } }
|
doOnSuccess { UiThreadHandler.run { body(it) } }
|
||||||
|
|
||||||
fun <T> Maybe<T>.doOnCompleteUi(body: () -> Unit) =
|
fun <T> Maybe<T>.doOnCompleteUi(body: () -> Unit) =
|
||||||
doOnComplete { ui { body() } }
|
doOnComplete { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
fun Completable.doOnCompleteUi(body: () -> Unit) =
|
fun Completable.doOnCompleteUi(body: () -> Unit) =
|
||||||
doOnComplete { ui { body() } }
|
doOnComplete { UiThreadHandler.run { body() } }
|
||||||
|
|
||||||
|
|
||||||
fun <T, R> Observable<List<T>>.mapList(
|
fun <T, R> Observable<List<T>>.mapList(
|
||||||
@@ -198,4 +199,4 @@ fun <T> ObservableField<T>.toObservable(): Observable<T> {
|
|||||||
fun <T : Any> T.toSingle() = Single.just(this)
|
fun <T : Any> T.toSingle() = Single.just(this)
|
||||||
|
|
||||||
fun <T1, T2, R> zip(t1: Single<T1>, t2: Single<T2>, zipper: (T1, T2) -> R) =
|
fun <T1, T2, R> zip(t1: Single<T1>, t2: Single<T2>, zipper: (T1, T2) -> R) =
|
||||||
Single.zip(t1, t2, BiFunction<T1, T2, R> { rt1, rt2 -> zipper(rt1, rt2) })
|
Single.zip(t1, t2, BiFunction<T1, T2, R> { rt1, rt2 -> zipper(rt1, rt2) })
|
||||||
|
@@ -26,6 +26,7 @@ import androidx.annotation.ColorRes
|
|||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.net.toFile
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.topjohnwu.magisk.Const
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.FileProvider
|
import com.topjohnwu.magisk.FileProvider
|
||||||
@@ -306,3 +307,5 @@ fun Context.unwrap() : Context {
|
|||||||
}
|
}
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Uri.writeTo(file: File) = toFile().copyTo(file)
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
package com.topjohnwu.magisk.extensions
|
package com.topjohnwu.magisk.extensions
|
||||||
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.core.net.toFile
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
import java.lang.reflect.Field
|
||||||
|
import java.lang.reflect.Method
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
import java.util.zip.ZipInputStream
|
import java.util.zip.ZipInputStream
|
||||||
@@ -19,8 +19,6 @@ fun ZipInputStream.forEach(callback: (ZipEntry) -> Unit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Uri.writeTo(file: File) = toFile().copyTo(file)
|
|
||||||
|
|
||||||
fun InputStream.writeTo(file: File) =
|
fun InputStream.writeTo(file: File) =
|
||||||
withStreams(this, file.outputStream()) { reader, writer -> reader.copyTo(writer) }
|
withStreams(this, file.outputStream()) { reader, writer -> reader.copyTo(writer) }
|
||||||
|
|
||||||
@@ -100,4 +98,33 @@ fun Locale.toLangTag(): String {
|
|||||||
tag.append('-').append(variant)
|
tag.append('-').append(variant)
|
||||||
return tag.toString()
|
return tag.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reflection hacks
|
||||||
|
|
||||||
|
private val loadClass = ClassLoader::class.java.getMethod("loadClass", String::class.java)
|
||||||
|
private val getDeclaredMethod = Class::class.java.getMethod("getDeclaredMethod",
|
||||||
|
String::class.java, arrayOf<Class<*>>()::class.java)
|
||||||
|
private val getDeclaredField = Class::class.java.getMethod("getDeclaredField", String::class.java)
|
||||||
|
|
||||||
|
fun ClassLoader.forceLoadClass(name: String) =
|
||||||
|
runCatching { loadClass.invoke(this, name) }.getOrNull() as Class<*>?
|
||||||
|
|
||||||
|
fun Class<*>.forceGetDeclaredMethod(name: String, vararg types: Class<*>) =
|
||||||
|
(runCatching { getDeclaredMethod.invoke(this, name, types) }.getOrNull() as Method?)?.also {
|
||||||
|
it.isAccessible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Class<*>.forceGetDeclaredField(name: String) =
|
||||||
|
(runCatching { getDeclaredField.invoke(this, name) }.getOrNull() as Field?)?.also {
|
||||||
|
it.isAccessible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T> T.forceGetClass(name: String) =
|
||||||
|
T::class.java.classLoader?.forceLoadClass(name)
|
||||||
|
|
||||||
|
fun Class<*>.forceGetField(name: String): Field? =
|
||||||
|
forceGetDeclaredField(name) ?: superclass?.forceGetField(name)
|
||||||
|
|
||||||
|
fun Class<*>.forceGetMethod(name: String, vararg types: Class<*>): Method? =
|
||||||
|
forceGetDeclaredMethod(name, *types) ?: superclass?.forceGetMethod(name, *types)
|
||||||
|
@@ -140,7 +140,7 @@ open class DownloadService : RemoteFileService() {
|
|||||||
inline operator fun invoke(context: Context, argBuilder: Builder.() -> Unit) {
|
inline operator fun invoke(context: Context, argBuilder: Builder.() -> Unit) {
|
||||||
val app = context.applicationContext
|
val app = context.applicationContext
|
||||||
val builder = Builder().apply(argBuilder)
|
val builder = Builder().apply(argBuilder)
|
||||||
val intent = app.intent(DownloadService::class.java).putExtra(ARG_URL, builder.subject)
|
val intent = app.intent<DownloadService>().putExtra(ARG_URL, builder.subject)
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
app.startForegroundService(intent)
|
app.startForegroundService(intent)
|
||||||
|
@@ -38,7 +38,7 @@ private fun RemoteFileService.upgrade(apk: File, id: Int) {
|
|||||||
patch(apk, id)
|
patch(apk, id)
|
||||||
} else {
|
} else {
|
||||||
// Simply relaunch the app
|
// Simply relaunch the app
|
||||||
ProcessPhoenix.triggerRebirth(this)
|
ProcessPhoenix.triggerRebirth(this, intent<ProcessPhoenix>())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
patch(apk, id)
|
patch(apk, id)
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
package com.topjohnwu.magisk.model.entity
|
package com.topjohnwu.magisk.model.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.Ignore
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import com.topjohnwu.magisk.extensions.now
|
||||||
import com.topjohnwu.magisk.extensions.timeFormatTime
|
import com.topjohnwu.magisk.extensions.timeFormatTime
|
||||||
import com.topjohnwu.magisk.extensions.toTime
|
import com.topjohnwu.magisk.extensions.toTime
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.ALLOW
|
import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.ALLOW
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
@Entity(tableName = "logs")
|
||||||
data class MagiskLog(
|
data class MagiskLog(
|
||||||
val fromUid: Int,
|
val fromUid: Int,
|
||||||
val toUid: Int,
|
val toUid: Int,
|
||||||
@@ -13,9 +17,10 @@ data class MagiskLog(
|
|||||||
val appName: String,
|
val appName: String,
|
||||||
val command: String,
|
val command: String,
|
||||||
val action: Boolean,
|
val action: Boolean,
|
||||||
val date: Date
|
val time: Long = -1
|
||||||
) {
|
) {
|
||||||
val timeString = date.time.toTime(timeFormatTime)
|
@PrimaryKey(autoGenerate = true) var id: Int = 0
|
||||||
|
@Ignore val timeString = time.toTime(timeFormatTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class WrappedMagiskLog(
|
data class WrappedMagiskLog(
|
||||||
@@ -23,35 +28,8 @@ data class WrappedMagiskLog(
|
|||||||
val items: List<MagiskLog>
|
val items: List<MagiskLog>
|
||||||
)
|
)
|
||||||
|
|
||||||
fun Map<String, String>.toLog(): MagiskLog {
|
|
||||||
return MagiskLog(
|
|
||||||
fromUid = get("from_uid")?.toIntOrNull() ?: -1,
|
|
||||||
toUid = get("to_uid")?.toIntOrNull() ?: -1,
|
|
||||||
fromPid = get("from_pid")?.toIntOrNull() ?: -1,
|
|
||||||
packageName = get("package_name").orEmpty(),
|
|
||||||
appName = get("app_name").orEmpty(),
|
|
||||||
command = get("command").orEmpty(),
|
|
||||||
action = get("action")?.toIntOrNull() != 0,
|
|
||||||
date = get("time")?.toLongOrNull()?.toDate() ?: Date()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Long.toDate() = Date(this)
|
|
||||||
|
|
||||||
fun MagiskLog.toMap() = mapOf(
|
|
||||||
"from_uid" to fromUid,
|
|
||||||
"to_uid" to toUid,
|
|
||||||
"from_pid" to fromPid,
|
|
||||||
"package_name" to packageName,
|
|
||||||
"app_name" to appName,
|
|
||||||
"command" to command,
|
|
||||||
"action" to action,
|
|
||||||
"time" to date.time
|
|
||||||
)
|
|
||||||
|
|
||||||
fun MagiskPolicy.toLog(
|
fun MagiskPolicy.toLog(
|
||||||
toUid: Int,
|
toUid: Int,
|
||||||
fromPid: Int,
|
fromPid: Int,
|
||||||
command: String,
|
command: String
|
||||||
date: Date
|
) = MagiskLog(uid, toUid, fromPid, packageName, appName, command, policy == ALLOW, now)
|
||||||
) = MagiskLog(uid, toUid, fromPid, packageName, appName, command, policy == ALLOW, date)
|
|
||||||
|
@@ -7,11 +7,11 @@ import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.INTERACTIVE
|
|||||||
|
|
||||||
|
|
||||||
data class MagiskPolicy(
|
data class MagiskPolicy(
|
||||||
val uid: Int,
|
var uid: Int,
|
||||||
val packageName: String,
|
val packageName: String,
|
||||||
val appName: String,
|
val appName: String,
|
||||||
val policy: Int = INTERACTIVE,
|
var policy: Int = INTERACTIVE,
|
||||||
val until: Long = -1L,
|
var until: Long = -1L,
|
||||||
val logging: Boolean = true,
|
val logging: Boolean = true,
|
||||||
val notification: Boolean = true,
|
val notification: Boolean = true,
|
||||||
val applicationInfo: ApplicationInfo
|
val applicationInfo: ApplicationInfo
|
||||||
@@ -38,7 +38,7 @@ fun MagiskPolicy.toMap() = mapOf(
|
|||||||
fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
|
fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
|
||||||
val uid = get("uid")?.toIntOrNull() ?: -1
|
val uid = get("uid")?.toIntOrNull() ?: -1
|
||||||
val packageName = get("package_name").orEmpty()
|
val packageName = get("package_name").orEmpty()
|
||||||
val info = pm.getApplicationInfo(packageName, 0)
|
val info = pm.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES)
|
||||||
|
|
||||||
if (info.uid != uid)
|
if (info.uid != uid)
|
||||||
throw PackageManager.NameNotFoundException()
|
throw PackageManager.NameNotFoundException()
|
||||||
@@ -56,14 +56,15 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Throws(PackageManager.NameNotFoundException::class)
|
@Throws(PackageManager.NameNotFoundException::class)
|
||||||
fun Int.toPolicy(pm: PackageManager): MagiskPolicy {
|
fun Int.toPolicy(pm: PackageManager, policy: Int = INTERACTIVE): MagiskPolicy {
|
||||||
val pkg = pm.getPackagesForUid(this)?.firstOrNull()
|
val pkg = pm.getPackagesForUid(this)?.firstOrNull()
|
||||||
?: throw PackageManager.NameNotFoundException()
|
?: throw PackageManager.NameNotFoundException()
|
||||||
val info = pm.getApplicationInfo(pkg, 0)
|
val info = pm.getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES)
|
||||||
return MagiskPolicy(
|
return MagiskPolicy(
|
||||||
uid = this,
|
uid = info.uid,
|
||||||
packageName = pkg,
|
packageName = pkg,
|
||||||
|
policy = policy,
|
||||||
applicationInfo = info,
|
applicationInfo = info,
|
||||||
appName = info.loadLabel(pm).toString()
|
appName = info.getLabel(pm)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@@ -13,17 +13,21 @@ class Module(path: String) : BaseModule() {
|
|||||||
override var versionCode: Int = -1
|
override var versionCode: Int = -1
|
||||||
override var description: String = ""
|
override var description: String = ""
|
||||||
|
|
||||||
private val removeFile: SuFile = SuFile(path, "remove")
|
private val removeFile = SuFile(path, "remove")
|
||||||
private val disableFile: SuFile = SuFile(path, "disable")
|
private val disableFile = SuFile(path, "disable")
|
||||||
private val updateFile: SuFile = SuFile(path, "update")
|
private val updateFile = SuFile(path, "update")
|
||||||
|
private val ruleFile = SuFile(path, "sepolicy.rule")
|
||||||
|
|
||||||
val updated: Boolean = updateFile.exists()
|
val updated: Boolean = updateFile.exists()
|
||||||
|
|
||||||
var enable: Boolean = !disableFile.exists()
|
var enable: Boolean = !disableFile.exists()
|
||||||
set(enable) {
|
set(enable) {
|
||||||
|
val dir = "$PERSIST/$id"
|
||||||
field = if (enable) {
|
field = if (enable) {
|
||||||
|
Shell.su("mkdir -p $dir", "cp -af $ruleFile $dir").submit()
|
||||||
disableFile.delete()
|
disableFile.delete()
|
||||||
} else {
|
} else {
|
||||||
|
Shell.su("rm -rf $dir").submit()
|
||||||
!disableFile.createNewFile()
|
!disableFile.createNewFile()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,8 +35,10 @@ class Module(path: String) : BaseModule() {
|
|||||||
var remove: Boolean = removeFile.exists()
|
var remove: Boolean = removeFile.exists()
|
||||||
set(remove) {
|
set(remove) {
|
||||||
field = if (remove) {
|
field = if (remove) {
|
||||||
|
Shell.su("rm -rf $PERSIST/$id").submit()
|
||||||
removeFile.createNewFile()
|
removeFile.createNewFile()
|
||||||
} else {
|
} else {
|
||||||
|
Shell.su("cp -af $ruleFile $PERSIST/$id").submit()
|
||||||
!removeFile.delete()
|
!removeFile.delete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,6 +60,8 @@ class Module(path: String) : BaseModule() {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
private const val PERSIST = "/sbin/.magisk/mirror/persist/magisk"
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
fun loadModules(): List<Module> {
|
fun loadModules(): List<Module> {
|
||||||
val moduleList = mutableListOf<Module>()
|
val moduleList = mutableListOf<Module>()
|
||||||
@@ -65,7 +73,7 @@ class Module(path: String) : BaseModule() {
|
|||||||
val module = Module(Const.MAGISK_PATH + "/" + file.name)
|
val module = Module(Const.MAGISK_PATH + "/" + file.name)
|
||||||
moduleList.add(module)
|
moduleList.add(module)
|
||||||
}
|
}
|
||||||
return moduleList.sortedBy { it.name }
|
return moduleList.sortedBy { it.name.toLowerCase() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -37,8 +37,10 @@ class LogItemRvItem(
|
|||||||
|
|
||||||
fun toggle() = isExpanded.toggle()
|
fun toggle() = isExpanded.toggle()
|
||||||
|
|
||||||
override fun contentSameAs(other: LogItemRvItem): Boolean = items
|
override fun contentSameAs(other: LogItemRvItem): Boolean {
|
||||||
.any { !other.items.contains(it) }
|
if (items.size != other.items.size) return false
|
||||||
|
return items.all { it in other.items }
|
||||||
|
}
|
||||||
|
|
||||||
override fun itemSameAs(other: LogItemRvItem): Boolean = date == other.date
|
override fun itemSameAs(other: LogItemRvItem): Boolean = date == other.date
|
||||||
}
|
}
|
||||||
@@ -50,13 +52,7 @@ class LogItemEntryRvItem(val item: MagiskLog) : ComparableRvItem<LogItemEntryRvI
|
|||||||
|
|
||||||
fun toggle() = isExpanded.toggle()
|
fun toggle() = isExpanded.toggle()
|
||||||
|
|
||||||
override fun contentSameAs(other: LogItemEntryRvItem) = item.fromUid == other.item.fromUid &&
|
override fun contentSameAs(other: LogItemEntryRvItem) = item == other.item
|
||||||
item.toUid == other.item.toUid &&
|
|
||||||
item.fromPid == other.item.fromPid &&
|
|
||||||
item.packageName == other.item.packageName &&
|
|
||||||
item.command == other.item.command &&
|
|
||||||
item.action == other.item.action &&
|
|
||||||
item.date == other.item.date
|
|
||||||
|
|
||||||
override fun itemSameAs(other: LogItemEntryRvItem) = item.appName == other.item.appName
|
override fun itemSameAs(other: LogItemEntryRvItem) = item.appName == other.item.appName
|
||||||
}
|
}
|
||||||
@@ -74,4 +70,4 @@ class MagiskLogRvItem : ComparableRvItem<MagiskLogRvItem>() {
|
|||||||
override fun contentSameAs(other: MagiskLogRvItem): Boolean = false
|
override fun contentSameAs(other: MagiskLogRvItem): Boolean = false
|
||||||
|
|
||||||
override fun itemSameAs(other: MagiskLogRvItem): Boolean = false
|
override fun itemSameAs(other: MagiskLogRvItem): Boolean = false
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.model.events
|
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 com.topjohnwu.magisk.model.entity.module.Repo
|
||||||
import io.reactivex.subjects.PublishSubject
|
import io.reactivex.subjects.PublishSubject
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ class EnvFixEvent : ViewEvent()
|
|||||||
|
|
||||||
class UpdateSafetyNetEvent : ViewEvent()
|
class UpdateSafetyNetEvent : ViewEvent()
|
||||||
|
|
||||||
class ViewActionEvent(val action: Activity.() -> Unit) : ViewEvent()
|
class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent()
|
||||||
|
|
||||||
class OpenFilePickerEvent : ViewEvent()
|
class OpenFilePickerEvent : ViewEvent()
|
||||||
|
|
||||||
|
@@ -2,37 +2,25 @@ package com.topjohnwu.magisk.model.receiver
|
|||||||
|
|
||||||
import android.content.ContextWrapper
|
import android.content.ContextWrapper
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build.VERSION.SDK_INT
|
import com.topjohnwu.magisk.Config
|
||||||
import com.topjohnwu.magisk.*
|
import com.topjohnwu.magisk.Const
|
||||||
|
import com.topjohnwu.magisk.Info
|
||||||
import com.topjohnwu.magisk.base.BaseReceiver
|
import com.topjohnwu.magisk.base.BaseReceiver
|
||||||
import com.topjohnwu.magisk.data.database.PolicyDao
|
import com.topjohnwu.magisk.data.database.PolicyDao
|
||||||
import com.topjohnwu.magisk.data.database.base.su
|
|
||||||
import com.topjohnwu.magisk.extensions.reboot
|
import com.topjohnwu.magisk.extensions.reboot
|
||||||
import com.topjohnwu.magisk.extensions.startActivity
|
|
||||||
import com.topjohnwu.magisk.extensions.startActivityWithRoot
|
|
||||||
import com.topjohnwu.magisk.model.download.DownloadService
|
import com.topjohnwu.magisk.model.download.DownloadService
|
||||||
import com.topjohnwu.magisk.model.entity.ManagerJson
|
import com.topjohnwu.magisk.model.entity.ManagerJson
|
||||||
import com.topjohnwu.magisk.model.entity.internal.Configuration
|
import com.topjohnwu.magisk.model.entity.internal.Configuration
|
||||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
||||||
import com.topjohnwu.magisk.ui.surequest.SuRequestActivity
|
import com.topjohnwu.magisk.utils.SuHandler
|
||||||
import com.topjohnwu.magisk.utils.SuLogger
|
|
||||||
import com.topjohnwu.magisk.view.Notifications
|
|
||||||
import com.topjohnwu.magisk.view.Shortcuts
|
import com.topjohnwu.magisk.view.Shortcuts
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import org.koin.core.inject
|
import org.koin.core.inject
|
||||||
import timber.log.Timber
|
|
||||||
|
|
||||||
open class GeneralReceiver : BaseReceiver() {
|
open class GeneralReceiver : BaseReceiver() {
|
||||||
|
|
||||||
private val policyDB: PolicyDao by inject()
|
private val policyDB: PolicyDao by inject()
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val REQUEST = "request"
|
|
||||||
const val LOG = "log"
|
|
||||||
const val NOTIFY = "notify"
|
|
||||||
const val TEST = "test"
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getPkg(intent: Intent): String {
|
private fun getPkg(intent: Intent): String {
|
||||||
return intent.data?.encodedSchemeSpecificPart.orEmpty()
|
return intent.data?.encodedSchemeSpecificPart.orEmpty()
|
||||||
}
|
}
|
||||||
@@ -40,59 +28,19 @@ open class GeneralReceiver : BaseReceiver() {
|
|||||||
override fun onReceive(context: ContextWrapper, intent: Intent?) {
|
override fun onReceive(context: ContextWrapper, intent: Intent?) {
|
||||||
intent ?: return
|
intent ?: return
|
||||||
|
|
||||||
// Debug messages
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
Timber.d(intent.action)
|
|
||||||
intent.extras?.let { bundle ->
|
|
||||||
bundle.keySet().forEach {
|
|
||||||
Timber.d("[%s]=[%s]", it, bundle[it])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
when (intent.action ?: return) {
|
when (intent.action ?: return) {
|
||||||
Intent.ACTION_REBOOT, Intent.ACTION_BOOT_COMPLETED -> {
|
Intent.ACTION_REBOOT -> {
|
||||||
val action = intent.getStringExtra("action")
|
SuHandler(context, intent.getStringExtra("action"), intent.extras)
|
||||||
if (action == null) {
|
|
||||||
// Actual boot completed event
|
|
||||||
Shell.su("mm_patch_dtbo").submit {
|
|
||||||
if (it.isSuccess)
|
|
||||||
Notifications.dtboPatched(context)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
when (action) {
|
|
||||||
REQUEST -> {
|
|
||||||
val i = context.intent(SuRequestActivity::class.java)
|
|
||||||
.setAction(action)
|
|
||||||
.putExtra("socket", intent.getStringExtra("socket"))
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
|
|
||||||
if (SDK_INT >= 29) {
|
|
||||||
// Android Q does not allow starting activity from background
|
|
||||||
i.startActivityWithRoot()
|
|
||||||
} else {
|
|
||||||
i.startActivity(context)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOG -> SuLogger.handleLogs(context, intent)
|
|
||||||
NOTIFY -> SuLogger.handleNotify(context, intent)
|
|
||||||
TEST -> {
|
|
||||||
val mode = intent.getIntExtra("mode", 1 shl 1)
|
|
||||||
if (mode > Info.env.connectionMode)
|
|
||||||
Info.env.connectionMode = mode
|
|
||||||
Shell.su("magisk --connect-mode $mode").submit()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Intent.ACTION_PACKAGE_REPLACED ->
|
Intent.ACTION_PACKAGE_REPLACED -> {
|
||||||
// This will only work pre-O
|
// This will only work pre-O
|
||||||
if (Config.suReAuth)
|
if (Config.suReAuth)
|
||||||
policyDB.delete(getPkg(intent)).blockingGet()
|
policyDB.delete(getPkg(intent)).blockingGet()
|
||||||
|
}
|
||||||
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
||||||
val pkg = getPkg(intent)
|
val pkg = getPkg(intent)
|
||||||
policyDB.delete(pkg).blockingGet()
|
policyDB.delete(pkg).blockingGet()
|
||||||
"magiskhide --rm $pkg".su().blockingGet()
|
Shell.su("magiskhide --rm $pkg").submit()
|
||||||
}
|
}
|
||||||
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setup(context)
|
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setup(context)
|
||||||
Const.Key.BROADCAST_MANAGER_UPDATE -> {
|
Const.Key.BROADCAST_MANAGER_UPDATE -> {
|
||||||
|
@@ -287,8 +287,10 @@ abstract class MagiskInstaller {
|
|||||||
protected fun flashBoot(): Boolean {
|
protected fun flashBoot(): Boolean {
|
||||||
if (!"direct_install $installDir $srcBoot".sh().isSuccess)
|
if (!"direct_install $installDir $srcBoot".sh().isSuccess)
|
||||||
return false
|
return false
|
||||||
if (!Info.keepVerity)
|
arrayOf(
|
||||||
"patch_dtbo_image".sh()
|
"(KEEPVERITY=${Info.keepVerity} patch_dtb_partitions)",
|
||||||
|
"run_migrations"
|
||||||
|
).sh()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,11 +2,13 @@ package com.topjohnwu.magisk.ui
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.core.view.GravityCompat
|
import androidx.core.view.GravityCompat
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentTransaction
|
import androidx.fragment.app.FragmentTransaction
|
||||||
import com.ncapdevi.fragnav.FragNavController
|
import com.ncapdevi.fragnav.FragNavController
|
||||||
import com.ncapdevi.fragnav.FragNavTransactionOptions
|
import com.ncapdevi.fragnav.FragNavTransactionOptions
|
||||||
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.Const.Key.OPEN_SECTION
|
import com.topjohnwu.magisk.Const.Key.OPEN_SECTION
|
||||||
import com.topjohnwu.magisk.Info
|
import com.topjohnwu.magisk.Info
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
@@ -29,7 +31,6 @@ import com.topjohnwu.magisk.ui.module.ReposFragment
|
|||||||
import com.topjohnwu.magisk.ui.settings.SettingsFragment
|
import com.topjohnwu.magisk.ui.settings.SettingsFragment
|
||||||
import com.topjohnwu.magisk.ui.superuser.SuperuserFragment
|
import com.topjohnwu.magisk.ui.superuser.SuperuserFragment
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
import com.topjohnwu.superuser.Shell
|
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@@ -60,12 +61,21 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
if (!SplashActivity.DONE) {
|
if (!SplashActivity.DONE) {
|
||||||
startActivity(intent(SplashActivity::class.java))
|
startActivity(intent<SplashActivity>())
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
if (Info.env.isUnsupported && !viewModel.shownUnsupportedDialog) {
|
||||||
|
viewModel.shownUnsupportedDialog = true
|
||||||
|
AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.unsupport_magisk_title)
|
||||||
|
.setMessage(getString(R.string.unsupport_magisk_msg, Const.Version.MIN_VERSION))
|
||||||
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
navigationController.apply {
|
navigationController.apply {
|
||||||
rootFragmentListener = this@MainActivity
|
rootFragmentListener = this@MainActivity
|
||||||
transactionListener = this@MainActivity
|
transactionListener = this@MainActivity
|
||||||
@@ -153,16 +163,11 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
|
|
||||||
private fun checkHideSection() {
|
private fun checkHideSection() {
|
||||||
val menu = binding.navView.menu
|
val menu = binding.navView.menu
|
||||||
menu.findItem(R.id.magiskHideFragment).isVisible =
|
menu.findItem(R.id.magiskHideFragment).isVisible = Info.env.isActive && Info.env.magiskHide
|
||||||
Shell.rootAccess() && Info.env.magiskHide
|
menu.findItem(R.id.modulesFragment).isVisible = Info.env.isActive
|
||||||
menu.findItem(R.id.modulesFragment).isVisible =
|
menu.findItem(R.id.reposFragment).isVisible = Info.isConnected.value && Info.env.isActive
|
||||||
Shell.rootAccess() && Info.env.magiskVersionCode >= 0
|
menu.findItem(R.id.logFragment).isVisible = Info.env.isActive
|
||||||
menu.findItem(R.id.reposFragment).isVisible =
|
menu.findItem(R.id.superuserFragment).isVisible = Utils.showSuperUser()
|
||||||
(viewModel.isConnected.value && Shell.rootAccess() && Info.env.magiskVersionCode >= 0)
|
|
||||||
menu.findItem(R.id.logFragment).isVisible =
|
|
||||||
Shell.rootAccess()
|
|
||||||
menu.findItem(R.id.superuserFragment).isVisible =
|
|
||||||
Utils.showSuperUser()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) =
|
private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) =
|
||||||
|
@@ -8,6 +8,8 @@ import com.topjohnwu.magisk.model.navigation.Navigation
|
|||||||
|
|
||||||
class MainViewModel : BaseViewModel() {
|
class MainViewModel : BaseViewModel() {
|
||||||
|
|
||||||
|
var shownUnsupportedDialog = false
|
||||||
|
|
||||||
fun navPressed() = Navigation.Main.OPEN_NAV.publish()
|
fun navPressed() = Navigation.Main.OPEN_NAV.publish()
|
||||||
|
|
||||||
fun navigationItemPressed(item: MenuItem): Boolean {
|
fun navigationItemPressed(item: MenuItem): Boolean {
|
||||||
|
@@ -3,13 +3,12 @@ package com.topjohnwu.magisk.ui
|
|||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.TextUtils
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import com.topjohnwu.magisk.*
|
import com.topjohnwu.magisk.*
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
import com.topjohnwu.magisk.view.Notifications
|
import com.topjohnwu.magisk.view.Notifications
|
||||||
import com.topjohnwu.magisk.view.Shortcuts
|
import com.topjohnwu.magisk.view.Shortcuts
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import com.topjohnwu.superuser.ShellUtils
|
||||||
|
|
||||||
open class SplashActivity : Activity() {
|
open class SplashActivity : Activity() {
|
||||||
|
|
||||||
@@ -19,19 +18,7 @@ open class SplashActivity : Activity() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
Shell.getShell { initAndStart() }
|
||||||
Shell.getShell {
|
|
||||||
if (Info.env.magiskVersionCode > 0 && Info.env.magiskVersionCode < Const.Version.MIN_SUPPORT) {
|
|
||||||
AlertDialog.Builder(this)
|
|
||||||
.setTitle(R.string.unsupport_magisk_title)
|
|
||||||
.setMessage(R.string.unsupport_magisk_message)
|
|
||||||
.setNegativeButton(android.R.string.ok, null)
|
|
||||||
.setOnDismissListener { finish() }
|
|
||||||
.show()
|
|
||||||
} else {
|
|
||||||
initAndStart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initAndStart() {
|
private fun initAndStart() {
|
||||||
@@ -40,7 +27,7 @@ open class SplashActivity : Activity() {
|
|||||||
Config.suManager = ""
|
Config.suManager = ""
|
||||||
Shell.su("pm uninstall $pkg").submit()
|
Shell.su("pm uninstall $pkg").submit()
|
||||||
}
|
}
|
||||||
if (TextUtils.equals(pkg, packageName)) {
|
if (pkg == packageName) {
|
||||||
runCatching {
|
runCatching {
|
||||||
// We are the manager, remove com.topjohnwu.magisk as it could be malware
|
// We are the manager, remove com.topjohnwu.magisk as it could be malware
|
||||||
packageManager.getApplicationInfo(BuildConfig.APPLICATION_ID, 0)
|
packageManager.getApplicationInfo(BuildConfig.APPLICATION_ID, 0)
|
||||||
@@ -48,6 +35,10 @@ open class SplashActivity : Activity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Info.keepVerity = ShellUtils.fastCmd("echo \$KEEPVERITY").toBoolean()
|
||||||
|
Info.keepEnc = ShellUtils.fastCmd("echo \$KEEPFORCEENCRYPT").toBoolean()
|
||||||
|
Info.recovery = ShellUtils.fastCmd("echo \$RECOVERYMODE").toBoolean()
|
||||||
|
|
||||||
// Set default configs
|
// Set default configs
|
||||||
Config.initialize()
|
Config.initialize()
|
||||||
|
|
||||||
@@ -60,10 +51,18 @@ open class SplashActivity : Activity() {
|
|||||||
// Setup shortcuts
|
// Setup shortcuts
|
||||||
Shortcuts.setup(this)
|
Shortcuts.setup(this)
|
||||||
|
|
||||||
val intent = intent(MainActivity::class.java)
|
if (Info.isNewReboot) {
|
||||||
intent.putExtra(Const.Key.OPEN_SECTION, getIntent().getStringExtra(Const.Key.OPEN_SECTION))
|
val shell = Shell.newInstance()
|
||||||
|
shell.newJob().add("mm_patch_dtb").submit {
|
||||||
|
if (it.isSuccess)
|
||||||
|
Notifications.dtboPatched(this)
|
||||||
|
shell.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DONE = true
|
DONE = true
|
||||||
startActivity(intent)
|
|
||||||
|
startActivity(intent<MainActivity>().apply { intent?.also { putExtras(it) } })
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,9 +2,9 @@ package com.topjohnwu.magisk.ui.flash
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.ActivityInfo
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.core.app.NotificationManagerCompat
|
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.topjohnwu.magisk.Const
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
@@ -16,6 +16,7 @@ import com.topjohnwu.magisk.model.events.BackPressEvent
|
|||||||
import com.topjohnwu.magisk.model.events.PermissionEvent
|
import com.topjohnwu.magisk.model.events.PermissionEvent
|
||||||
import com.topjohnwu.magisk.model.events.SnackbarEvent
|
import com.topjohnwu.magisk.model.events.SnackbarEvent
|
||||||
import com.topjohnwu.magisk.model.events.ViewEvent
|
import com.topjohnwu.magisk.model.events.ViewEvent
|
||||||
|
import com.topjohnwu.magisk.view.Notifications
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -32,10 +33,11 @@ open class FlashActivity : BaseActivity<FlashViewModel, ActivityFlashBinding>()
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val id = intent.getIntExtra(Const.Key.DISMISS_ID, -1)
|
val id = intent.getIntExtra(Const.Key.DISMISS_ID, -1)
|
||||||
if (id != -1)
|
if (id != -1)
|
||||||
NotificationManagerCompat.from(this).cancel(id)
|
Notifications.mgr.cancel(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
@@ -60,7 +62,7 @@ open class FlashActivity : BaseActivity<FlashViewModel, ActivityFlashBinding>()
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
private fun intent(context: Context) = context.intent(FlashActivity::class.java)
|
private fun intent(context: Context) = context.intent<FlashActivity>()
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
private fun intent(context: Context, file: File) = intent(context).setData(file.toUri())
|
private fun intent(context: Context, file: File) = intent(context).setData(file.toUri())
|
||||||
|
|
||||||
|
@@ -90,9 +90,7 @@ class HideViewModel(
|
|||||||
.toList()
|
.toList()
|
||||||
.map { it to items.calculateDiff(it) }
|
.map { it to items.calculateDiff(it) }
|
||||||
|
|
||||||
private fun toggleItem(item: HideProcessRvItem) = magiskRepo
|
private fun toggleItem(item: HideProcessRvItem) =
|
||||||
.toggleHide(item.isHidden.value, item.packageName, item.process)
|
magiskRepo.toggleHide(item.isHidden.value, item.packageName, item.process)
|
||||||
.subscribeK()
|
|
||||||
.add()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -92,7 +92,7 @@ class HomeViewModel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val hasRoot = KObservableField(false)
|
val isActive = KObservableField(false)
|
||||||
|
|
||||||
private var shownDialog = false
|
private var shownDialog = false
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ class HomeViewModel(
|
|||||||
if (invalidate)
|
if (invalidate)
|
||||||
Info.envRef.invalidate()
|
Info.envRef.invalidate()
|
||||||
|
|
||||||
hasRoot.value = Shell.rootAccess()
|
isActive.value = Info.env.isActive
|
||||||
|
|
||||||
val fetchUpdate = if (isConnected.value)
|
val fetchUpdate = if (isConnected.value)
|
||||||
magiskRepo.fetchUpdate().ignoreElement()
|
magiskRepo.fetchUpdate().ignoreElement()
|
||||||
|
@@ -104,7 +104,6 @@ class LogViewModel(
|
|||||||
.add()
|
.add()
|
||||||
|
|
||||||
private fun clearMagiskLogs(callback: () -> Unit) = logRepo.clearMagiskLogs()
|
private fun clearMagiskLogs(callback: () -> Unit) = logRepo.clearMagiskLogs()
|
||||||
.ignoreElement()
|
|
||||||
.doOnComplete(callback)
|
.doOnComplete(callback)
|
||||||
.subscribeK { SnackbarEvent(R.string.logs_cleared).publish() }
|
.subscribeK { SnackbarEvent(R.string.logs_cleared).publish() }
|
||||||
.add()
|
.add()
|
||||||
@@ -115,8 +114,7 @@ class LogViewModel(
|
|||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
private fun fetchMagiskLog() = logRepo.fetchMagiskLogs()
|
private fun fetchMagiskLog() = logRepo.fetchMagiskLogs()
|
||||||
.flattenAsFlowable { it }
|
|
||||||
.map { ConsoleRvItem(it) }
|
.map { ConsoleRvItem(it) }
|
||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,7 @@ class ModulesFragment : BaseFragment<ModuleViewModel, FragmentModulesBinding>()
|
|||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) {
|
if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) {
|
||||||
// Get the URI of the selected file
|
// Get the URI of the selected file
|
||||||
val intent = activity.intent(FlashActivity::class.java)
|
val intent = activity.intent<FlashActivity>()
|
||||||
intent.setData(data.data).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP)
|
intent.setData(data.data).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
@@ -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.entity.internal.DownloadSubject
|
||||||
import com.topjohnwu.magisk.model.observer.Observer
|
import com.topjohnwu.magisk.model.observer.Observer
|
||||||
import com.topjohnwu.magisk.utils.*
|
import com.topjohnwu.magisk.utils.*
|
||||||
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import io.reactivex.Completable
|
import io.reactivex.Completable
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
@@ -61,8 +60,8 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
multiuserConfig = findPreference(Config.Key.SU_MULTIUSER_MODE)!!
|
multiuserConfig = findPreference(Config.Key.SU_MULTIUSER_MODE)!!
|
||||||
nsConfig = findPreference(Config.Key.SU_MNT_NS)!!
|
nsConfig = findPreference(Config.Key.SU_MNT_NS)!!
|
||||||
val reauth = findPreference<SwitchPreferenceCompat>(Config.Key.SU_REAUTH)!!
|
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 generalCategory = findPreference<PreferenceCategory>("general")!!
|
||||||
val magiskCategory = findPreference<PreferenceCategory>("magisk")!!
|
val magiskCategory = findPreference<PreferenceCategory>("magisk")!!
|
||||||
val suCategory = findPreference<PreferenceCategory>("superuser")!!
|
val suCategory = findPreference<PreferenceCategory>("superuser")!!
|
||||||
val hideManager = findPreference<Preference>("hide")!!
|
val hideManager = findPreference<Preference>("hide")!!
|
||||||
@@ -88,16 +87,16 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
suCategory.removePreference(reauth)
|
suCategory.removePreference(reauth)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable fingerprint option if not possible
|
// Disable biometric option if not possible
|
||||||
if (!FingerprintHelper.canUseFingerprint()) {
|
if (!BiometricHelper.isSupported) {
|
||||||
fingerprint.isEnabled = false
|
biometric.isEnabled = false
|
||||||
fingerprint.isChecked = false
|
biometric.isChecked = false
|
||||||
fingerprint.setSummary(R.string.disable_fingerprint)
|
biometric.setSummary(R.string.no_biometric)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Const.USER_ID == 0 && Info.isConnected.value && Shell.rootAccess()) {
|
if (Const.USER_ID == 0 && Info.isConnected.value && Info.env.isActive) {
|
||||||
if (activity.packageName == BuildConfig.APPLICATION_ID) {
|
if (activity.packageName == BuildConfig.APPLICATION_ID) {
|
||||||
generalCatagory.removePreference(restoreManager)
|
generalCategory.removePreference(restoreManager)
|
||||||
hideManager.setOnPreferenceClickListener {
|
hideManager.setOnPreferenceClickListener {
|
||||||
showManagerNameDialog {
|
showManagerNameDialog {
|
||||||
PatchAPK.hideManager(requireContext(), it)
|
PatchAPK.hideManager(requireContext(), it)
|
||||||
@@ -105,7 +104,7 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
generalCatagory.removePreference(hideManager)
|
generalCategory.removePreference(hideManager)
|
||||||
restoreManager.setOnPreferenceClickListener {
|
restoreManager.setOnPreferenceClickListener {
|
||||||
DownloadService(requireContext()) {
|
DownloadService(requireContext()) {
|
||||||
subject = DownloadSubject.Manager(Configuration.APK.Restore)
|
subject = DownloadSubject.Manager(Configuration.APK.Restore)
|
||||||
@@ -115,25 +114,32 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Remove if not primary user, no connection, or no root
|
// Remove if not primary user, no connection, or no root
|
||||||
generalCatagory.removePreference(restoreManager)
|
generalCategory.removePreference(restoreManager)
|
||||||
generalCatagory.removePreference(hideManager)
|
generalCategory.removePreference(hideManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Utils.showSuperUser()) {
|
if (!Utils.showSuperUser()) {
|
||||||
preferenceScreen.removePreference(suCategory)
|
preferenceScreen.removePreference(suCategory)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Shell.rootAccess()) {
|
if (!Info.env.isActive) {
|
||||||
preferenceScreen.removePreference(magiskCategory)
|
preferenceScreen.removePreference(magiskCategory)
|
||||||
generalCatagory.removePreference(hideManager)
|
generalCategory.removePreference(hideManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
findPreference<Preference>("clear")?.setOnPreferenceClickListener {
|
findPreference<Preference>("clear")?.also {
|
||||||
Completable.fromAction { repoDB.clear() }.subscribeK {
|
if (Info.env.isActive) {
|
||||||
Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT)
|
it.setOnPreferenceClickListener {
|
||||||
|
Completable.fromAction { repoDB.clear() }.subscribeK {
|
||||||
|
Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
generalCategory.removePreference(it)
|
||||||
}
|
}
|
||||||
true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
findPreference<Preference>("hosts")?.setOnPreferenceClickListener {
|
findPreference<Preference>("hosts")?.setOnPreferenceClickListener {
|
||||||
Shell.su("add_hosts_module").submit {
|
Shell.su("add_hosts_module").submit {
|
||||||
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT)
|
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT)
|
||||||
@@ -143,20 +149,21 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
|
|
||||||
findPreference<Preference>(Config.Key.DOWNLOAD_PATH)?.apply {
|
findPreference<Preference>(Config.Key.DOWNLOAD_PATH)?.apply {
|
||||||
summary = Config.downloadPath
|
summary = Config.downloadPath
|
||||||
}?.setOnPreferenceClickListener { preference ->
|
setOnPreferenceClickListener { pref ->
|
||||||
activity.withExternalRW {
|
activity.withExternalRW {
|
||||||
onSuccess {
|
onSuccess {
|
||||||
showDownloadDialog {
|
showDownloadDialog {
|
||||||
Config.downloadPath = it
|
Config.downloadPath = it
|
||||||
preference.summary = it
|
pref.summary = it
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
true
|
||||||
}
|
}
|
||||||
true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateChannel.setOnPreferenceChangeListener { _, value ->
|
updateChannel.setOnPreferenceChangeListener { _, value ->
|
||||||
val channel = Integer.parseInt(value as String)
|
val channel = value.toString().toInt()
|
||||||
val previous = Config.updateChannel
|
val previous = Config.updateChannel
|
||||||
|
|
||||||
if (channel == Config.Value.CUSTOM_CHANNEL) {
|
if (channel == Config.Value.CUSTOM_CHANNEL) {
|
||||||
@@ -208,13 +215,13 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
|
|
||||||
override fun onPreferenceTreeClick(preference: Preference): Boolean {
|
override fun onPreferenceTreeClick(preference: Preference): Boolean {
|
||||||
when (preference.key) {
|
when (preference.key) {
|
||||||
Config.Key.SU_FINGERPRINT -> {
|
Config.Key.SU_BIOMETRIC -> {
|
||||||
val checked = (preference as SwitchPreferenceCompat).isChecked
|
val checked = (preference as SwitchPreferenceCompat).isChecked
|
||||||
preference.isChecked = !checked
|
preference.isChecked = !checked
|
||||||
FingerprintAuthDialog(requireActivity()) {
|
BiometricHelper.authenticate(requireActivity()) {
|
||||||
preference.isChecked = checked
|
preference.isChecked = checked
|
||||||
Config.suFingerprint = checked
|
Config.suBiometric = checked
|
||||||
}.show()
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
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.PolicyEnableEvent
|
||||||
import com.topjohnwu.magisk.model.events.PolicyUpdateEvent
|
import com.topjohnwu.magisk.model.events.PolicyUpdateEvent
|
||||||
import com.topjohnwu.magisk.model.events.SnackbarEvent
|
import com.topjohnwu.magisk.model.events.SnackbarEvent
|
||||||
|
import com.topjohnwu.magisk.utils.BiometricHelper
|
||||||
import com.topjohnwu.magisk.utils.DiffObservableList
|
import com.topjohnwu.magisk.utils.DiffObservableList
|
||||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
|
||||||
import com.topjohnwu.magisk.utils.RxBus
|
import com.topjohnwu.magisk.utils.RxBus
|
||||||
import com.topjohnwu.magisk.view.dialogs.CustomAlertDialog
|
import com.topjohnwu.magisk.view.dialogs.CustomAlertDialog
|
||||||
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
import me.tatarka.bindingcollectionadapter2.ItemBinding
|
import me.tatarka.bindingcollectionadapter2.ItemBinding
|
||||||
@@ -83,8 +82,8 @@ class SuperuserViewModel(
|
|||||||
.add()
|
.add()
|
||||||
|
|
||||||
withView {
|
withView {
|
||||||
if (FingerprintHelper.useFingerprint()) {
|
if (BiometricHelper.isEnabled) {
|
||||||
FingerprintAuthDialog(this) { updateState() }.show()
|
BiometricHelper.authenticate(this) { updateState() }
|
||||||
} else {
|
} else {
|
||||||
CustomAlertDialog(this)
|
CustomAlertDialog(this)
|
||||||
.setTitle(R.string.su_revoke_title)
|
.setTitle(R.string.su_revoke_title)
|
||||||
@@ -131,12 +130,12 @@ class SuperuserViewModel(
|
|||||||
.add()
|
.add()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FingerprintHelper.useFingerprint()) {
|
if (BiometricHelper.isEnabled) {
|
||||||
withView {
|
withView {
|
||||||
FingerprintAuthDialog(this, { updateState() }, {
|
BiometricHelper.authenticate(this, onError = {
|
||||||
ignoreNext = item
|
ignoreNext = item
|
||||||
item.isEnabled.toggle()
|
item.isEnabled.toggle()
|
||||||
}).show()
|
}) { updateState() }
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
updateState()
|
updateState()
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.ui.surequest
|
package com.topjohnwu.magisk.ui.surequest
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@@ -7,11 +8,11 @@ import android.view.Window
|
|||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.base.BaseActivity
|
import com.topjohnwu.magisk.base.BaseActivity
|
||||||
import com.topjohnwu.magisk.databinding.ActivityRequestBinding
|
import com.topjohnwu.magisk.databinding.ActivityRequestBinding
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
|
||||||
import com.topjohnwu.magisk.model.events.DieEvent
|
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.model.events.ViewEvent
|
||||||
import com.topjohnwu.magisk.model.receiver.GeneralReceiver
|
import com.topjohnwu.magisk.utils.SuHandler
|
||||||
import com.topjohnwu.magisk.utils.SuLogger
|
import com.topjohnwu.magisk.utils.SuHandler.REQUEST
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
open class SuRequestActivity : BaseActivity<SuRequestViewModel, ActivityRequestBinding>() {
|
open class SuRequestActivity : BaseActivity<SuRequestViewModel, ActivityRequestBinding>() {
|
||||||
@@ -21,7 +22,7 @@ open class SuRequestActivity : BaseActivity<SuRequestViewModel, ActivityRequestB
|
|||||||
override val viewModel: SuRequestViewModel by viewModel()
|
override val viewModel: SuRequestViewModel by viewModel()
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
viewModel.handler?.handleAction(MagiskPolicy.DENY, -1)
|
viewModel.denyPressed()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@@ -29,24 +30,34 @@ open class SuRequestActivity : BaseActivity<SuRequestViewModel, ActivityRequestB
|
|||||||
lockOrientation()
|
lockOrientation()
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
val intent = intent
|
fun showRequest() {
|
||||||
|
if (!viewModel.handleRequest(intent))
|
||||||
when (intent?.action) {
|
finish()
|
||||||
GeneralReceiver.REQUEST -> {
|
|
||||||
if (!viewModel.handleRequest(intent))
|
|
||||||
finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
GeneralReceiver.LOG -> SuLogger.handleLogs(this, intent)
|
|
||||||
GeneralReceiver.NOTIFY -> SuLogger.handleNotify(this, intent)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
finish()
|
fun runHandler(action: String?) {
|
||||||
|
SuHandler(this, action, intent.extras)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intent.action == Intent.ACTION_VIEW) {
|
||||||
|
val action = intent.getStringExtra("action")
|
||||||
|
if (action == REQUEST) {
|
||||||
|
showRequest()
|
||||||
|
} else {
|
||||||
|
runHandler(action)
|
||||||
|
}
|
||||||
|
} else if (intent.action == REQUEST) {
|
||||||
|
showRequest()
|
||||||
|
} else {
|
||||||
|
runHandler(intent.action)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onEventDispatched(event: ViewEvent) {
|
override fun onEventDispatched(event: ViewEvent) {
|
||||||
super.onEventDispatched(event)
|
super.onEventDispatched(event)
|
||||||
when (event) {
|
when (event) {
|
||||||
|
is ViewActionEvent -> event.action(this)
|
||||||
is DieEvent -> finish()
|
is DieEvent -> finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,28 +1,25 @@
|
|||||||
package com.topjohnwu.magisk.ui.surequest
|
package com.topjohnwu.magisk.ui.surequest
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.hardware.fingerprint.FingerprintManager
|
|
||||||
import android.os.CountDownTimer
|
import android.os.CountDownTimer
|
||||||
import android.text.TextUtils
|
|
||||||
import com.topjohnwu.magisk.BuildConfig
|
import com.topjohnwu.magisk.BuildConfig
|
||||||
import com.topjohnwu.magisk.Config
|
import com.topjohnwu.magisk.Config
|
||||||
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.base.viewmodel.BaseViewModel
|
import com.topjohnwu.magisk.base.viewmodel.BaseViewModel
|
||||||
import com.topjohnwu.magisk.data.database.PolicyDao
|
import com.topjohnwu.magisk.data.database.PolicyDao
|
||||||
import com.topjohnwu.magisk.databinding.ComparableRvItem
|
import com.topjohnwu.magisk.databinding.ComparableRvItem
|
||||||
import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback
|
|
||||||
import com.topjohnwu.magisk.extensions.now
|
import com.topjohnwu.magisk.extensions.now
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
||||||
import com.topjohnwu.magisk.model.entity.recycler.SpinnerRvItem
|
import com.topjohnwu.magisk.model.entity.recycler.SpinnerRvItem
|
||||||
import com.topjohnwu.magisk.model.entity.toPolicy
|
import com.topjohnwu.magisk.model.entity.toPolicy
|
||||||
import com.topjohnwu.magisk.model.events.DieEvent
|
import com.topjohnwu.magisk.model.events.DieEvent
|
||||||
|
import com.topjohnwu.magisk.utils.BiometricHelper
|
||||||
import com.topjohnwu.magisk.utils.DiffObservableList
|
import com.topjohnwu.magisk.utils.DiffObservableList
|
||||||
import com.topjohnwu.magisk.utils.FingerprintHelper
|
|
||||||
import com.topjohnwu.magisk.utils.KObservableField
|
import com.topjohnwu.magisk.utils.KObservableField
|
||||||
import com.topjohnwu.magisk.utils.SuConnector
|
import com.topjohnwu.magisk.utils.SuConnector
|
||||||
import me.tatarka.bindingcollectionadapter2.BindingListViewAdapter
|
import me.tatarka.bindingcollectionadapter2.BindingListViewAdapter
|
||||||
@@ -45,7 +42,6 @@ class SuRequestViewModel(
|
|||||||
val denyText = KObservableField(resources.getString(R.string.deny))
|
val denyText = KObservableField(resources.getString(R.string.deny))
|
||||||
val warningText = KObservableField<CharSequence>(resources.getString(R.string.su_warning))
|
val warningText = KObservableField<CharSequence>(resources.getString(R.string.su_warning))
|
||||||
|
|
||||||
val canUseFingerprint = KObservableField(FingerprintHelper.useFingerprint())
|
|
||||||
val selectedItemPosition = KObservableField(0)
|
val selectedItemPosition = KObservableField(0)
|
||||||
|
|
||||||
private val items = DiffObservableList(ComparableRvItem.callback)
|
private val items = DiffObservableList(ComparableRvItem.callback)
|
||||||
@@ -58,48 +54,33 @@ class SuRequestViewModel(
|
|||||||
setItems(items)
|
setItems(items)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val cancelTasks = mutableListOf<() -> Unit>()
|
||||||
|
|
||||||
var handler: ActionHandler? = null
|
private lateinit var timer: CountDownTimer
|
||||||
private var timer: CountDownTimer? = null
|
private lateinit var policy: MagiskPolicy
|
||||||
private var policy: MagiskPolicy? = null
|
private lateinit var connector: SuConnector
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
updatePolicy(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
resources.getStringArray(R.array.allow_timeout)
|
|
||||||
.map { SpinnerRvItem(it) }
|
|
||||||
.let { items.update(it) }
|
|
||||||
|
|
||||||
selectedItemPosition.addOnPropertyChangedCallback {
|
|
||||||
Timber.e("Changed position to $it")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updatePolicy(policy: MagiskPolicy?) {
|
|
||||||
policy ?: return
|
|
||||||
|
|
||||||
icon.value = policy.applicationInfo.loadIcon(packageManager)
|
|
||||||
title.value = policy.appName
|
|
||||||
packageName.value = policy.packageName
|
|
||||||
|
|
||||||
selectedItemPosition.value = timeoutPrefs.getInt(policy.packageName, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun cancelTimer() {
|
private fun cancelTimer() {
|
||||||
timer?.cancel()
|
timer.cancel()
|
||||||
denyText.value = resources.getString(R.string.deny)
|
denyText.value = resources.getString(R.string.deny)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun grantPressed() {
|
fun grantPressed() {
|
||||||
handler?.handleAction(MagiskPolicy.ALLOW)
|
cancelTimer()
|
||||||
timer?.cancel()
|
if (BiometricHelper.isEnabled) {
|
||||||
|
withView {
|
||||||
|
BiometricHelper.authenticate(this) {
|
||||||
|
handleAction(MagiskPolicy.ALLOW)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
handleAction(MagiskPolicy.ALLOW)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun denyPressed() {
|
fun denyPressed() {
|
||||||
handler?.handleAction(MagiskPolicy.DENY)
|
handleAction(MagiskPolicy.DENY)
|
||||||
timer?.cancel()
|
timer.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun spinnerTouched(): Boolean {
|
fun spinnerTouched(): Boolean {
|
||||||
@@ -110,75 +91,27 @@ class SuRequestViewModel(
|
|||||||
fun handleRequest(intent: Intent): Boolean {
|
fun handleRequest(intent: Intent): Boolean {
|
||||||
val socketName = intent.getStringExtra("socket") ?: return false
|
val socketName = intent.getStringExtra("socket") ?: return false
|
||||||
|
|
||||||
val connector: SuConnector
|
|
||||||
try {
|
try {
|
||||||
connector = object : SuConnector(socketName) {
|
connector = Connector(socketName)
|
||||||
@Throws(IOException::class)
|
val map = connector.readRequest()
|
||||||
override fun onResponse() {
|
val uid = map["uid"]?.toIntOrNull() ?: return false
|
||||||
out.writeInt(policy?.policy ?: return)
|
policy = uid.toPolicy(packageManager)
|
||||||
}
|
} catch (e: Exception) {
|
||||||
}
|
Timber.e(e)
|
||||||
val bundle = connector.readSocketInput()
|
|
||||||
val uid = bundle.getString("uid")?.toIntOrNull() ?: return false
|
|
||||||
policyDB.deleteOutdated().blockingGet() // wrong!
|
|
||||||
policy = runCatching { policyDB.fetch(uid).blockingGet() }
|
|
||||||
.getOrDefault(uid.toPolicy(packageManager))
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
return false
|
return false
|
||||||
} catch (e: PackageManager.NameNotFoundException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
handler = object : ActionHandler() {
|
|
||||||
override fun handleAction() {
|
|
||||||
connector.response()
|
|
||||||
done()
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("ApplySharedPref")
|
|
||||||
override fun handleAction(action: Int) {
|
|
||||||
val pos = selectedItemPosition.value
|
|
||||||
timeoutPrefs.edit().putInt(policy?.packageName, pos).commit()
|
|
||||||
handleAction(action, Config.Value.TIMEOUT_LIST[pos])
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun handleAction(action: Int, time: Int) {
|
|
||||||
val until = if (time >= 0) {
|
|
||||||
if (time == 0) {
|
|
||||||
0
|
|
||||||
} else {
|
|
||||||
MILLISECONDS.toSeconds(now) + MINUTES.toSeconds(time.toLong())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
policy?.until ?: 0
|
|
||||||
}
|
|
||||||
policy = policy?.copy(policy = action, until = until)?.apply {
|
|
||||||
policyDB.update(this).blockingGet()
|
|
||||||
}
|
|
||||||
|
|
||||||
handleAction()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Never allow com.topjohnwu.magisk (could be malware)
|
// Never allow com.topjohnwu.magisk (could be malware)
|
||||||
if (TextUtils.equals(policy?.packageName, BuildConfig.APPLICATION_ID))
|
if (policy.packageName == BuildConfig.APPLICATION_ID)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
// If not interactive, response directly
|
|
||||||
if (policy?.policy != MagiskPolicy.INTERACTIVE) {
|
|
||||||
handler?.handleAction()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
when (Config.suAutoReponse) {
|
when (Config.suAutoReponse) {
|
||||||
Config.Value.SU_AUTO_DENY -> {
|
Config.Value.SU_AUTO_DENY -> {
|
||||||
handler?.handleAction(MagiskPolicy.DENY, 0)
|
handleAction(MagiskPolicy.DENY, 0)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
Config.Value.SU_AUTO_ALLOW -> {
|
Config.Value.SU_AUTO_ALLOW -> {
|
||||||
handler?.handleAction(MagiskPolicy.ALLOW, 0)
|
handleAction(MagiskPolicy.ALLOW, 0)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,78 +120,65 @@ class SuRequestViewModel(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
|
||||||
private fun showUI() {
|
private fun showUI() {
|
||||||
|
resources.getStringArray(R.array.allow_timeout)
|
||||||
|
.map { SpinnerRvItem(it) }
|
||||||
|
.let { items.update(it) }
|
||||||
|
|
||||||
|
icon.value = policy.applicationInfo.loadIcon(packageManager)
|
||||||
|
title.value = policy.appName
|
||||||
|
packageName.value = policy.packageName
|
||||||
|
selectedItemPosition.value = timeoutPrefs.getInt(policy.packageName, 0)
|
||||||
|
|
||||||
val millis = SECONDS.toMillis(Config.suDefaultTimeout.toLong())
|
val millis = SECONDS.toMillis(Config.suDefaultTimeout.toLong())
|
||||||
timer = object : CountDownTimer(millis, 1000) {
|
timer = object : CountDownTimer(millis, 1000) {
|
||||||
override fun onTick(remains: Long) {
|
override fun onTick(remains: Long) {
|
||||||
denyText.value = "%s (%d)"
|
denyText.value = "${resources.getString(R.string.deny)} (${remains / 1000})"
|
||||||
.format(resources.getString(R.string.deny), remains / 1000)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFinish() {
|
override fun onFinish() {
|
||||||
denyText.value = resources.getString(R.string.deny)
|
denyText.value = resources.getString(R.string.deny)
|
||||||
handler?.handleAction(MagiskPolicy.DENY)
|
handleAction(MagiskPolicy.DENY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
timer?.start()
|
timer.start()
|
||||||
handler?.addCancel(Runnable { cancelTimer() })
|
cancelTasks.add { cancelTimer() }
|
||||||
|
|
||||||
val useFP = canUseFingerprint.value
|
|
||||||
|
|
||||||
if (useFP)
|
|
||||||
try {
|
|
||||||
val helper = SuFingerprint()
|
|
||||||
helper.authenticate()
|
|
||||||
handler?.addCancel(Runnable { helper.cancel() })
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class SuFingerprint @Throws(Exception::class)
|
private fun handleAction() {
|
||||||
internal constructor() : FingerprintHelper() {
|
connector.response()
|
||||||
|
cancelTasks.forEach { it() }
|
||||||
|
DieEvent().publish()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
private fun handleAction(action: Int) {
|
||||||
warningText.value = errString
|
val pos = selectedItemPosition.value
|
||||||
}
|
timeoutPrefs.edit().putInt(policy.packageName, pos).apply()
|
||||||
|
handleAction(action, Config.Value.TIMEOUT_LIST[pos])
|
||||||
|
}
|
||||||
|
|
||||||
override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) {
|
private fun handleAction(action: Int, time: Int) {
|
||||||
warningText.value = helpString
|
val until = if (time > 0)
|
||||||
}
|
MILLISECONDS.toSeconds(now) + MINUTES.toSeconds(time.toLong())
|
||||||
|
else
|
||||||
|
time.toLong()
|
||||||
|
|
||||||
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
|
policy.policy = action
|
||||||
handler?.handleAction(MagiskPolicy.ALLOW)
|
policy.until = until
|
||||||
}
|
policy.uid = policy.uid % 100000 + Const.USER_ID * 100000
|
||||||
|
|
||||||
override fun onAuthenticationFailed() {
|
if (until >= 0)
|
||||||
warningText.value = resources.getString(R.string.auth_fail)
|
policyDB.update(policy).blockingAwait()
|
||||||
|
|
||||||
|
handleAction()
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class Connector @Throws(Exception::class)
|
||||||
|
internal constructor(name: String) : SuConnector(name) {
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun onResponse() {
|
||||||
|
out.writeInt(policy.policy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open inner class ActionHandler {
|
}
|
||||||
private val cancelTasks = mutableListOf<Runnable>()
|
|
||||||
|
|
||||||
internal open fun handleAction() {
|
|
||||||
done()
|
|
||||||
}
|
|
||||||
|
|
||||||
internal open fun handleAction(action: Int) {
|
|
||||||
done()
|
|
||||||
}
|
|
||||||
|
|
||||||
internal open fun handleAction(action: Int, time: Int) {
|
|
||||||
done()
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun addCancel(r: Runnable) {
|
|
||||||
cancelTasks.add(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun done() {
|
|
||||||
cancelTasks.forEach { it.run() }
|
|
||||||
DieEvent().publish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@@ -0,0 +1,60 @@
|
|||||||
|
package com.topjohnwu.magisk.utils
|
||||||
|
|
||||||
|
import androidx.biometric.BiometricManager
|
||||||
|
import androidx.biometric.BiometricPrompt
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import com.topjohnwu.magisk.Config
|
||||||
|
import com.topjohnwu.magisk.R
|
||||||
|
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,
|
||||||
|
ContextCompat.getMainExecutor(activity),
|
||||||
|
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -5,6 +5,7 @@ import android.util.Base64
|
|||||||
import android.util.Base64OutputStream
|
import android.util.Base64OutputStream
|
||||||
import com.topjohnwu.magisk.Config
|
import com.topjohnwu.magisk.Config
|
||||||
import com.topjohnwu.magisk.di.koinModules
|
import com.topjohnwu.magisk.di.koinModules
|
||||||
|
import com.topjohnwu.magisk.utils.PatchAPK.ALPHANUM
|
||||||
import com.topjohnwu.signing.CryptoUtils.readCertificate
|
import com.topjohnwu.signing.CryptoUtils.readCertificate
|
||||||
import com.topjohnwu.signing.CryptoUtils.readPrivateKey
|
import com.topjohnwu.signing.CryptoUtils.readPrivateKey
|
||||||
import com.topjohnwu.superuser.internal.InternalUtils
|
import com.topjohnwu.superuser.internal.InternalUtils
|
||||||
@@ -38,7 +39,6 @@ class Keygen: CertKeyProvider {
|
|||||||
private const val ALIAS = "magisk"
|
private const val ALIAS = "magisk"
|
||||||
private val PASSWORD get() = "magisk".toCharArray()
|
private val PASSWORD get() = "magisk".toCharArray()
|
||||||
private const val TESTKEY_CERT = "61ed377e85d386a8dfee6b864bd85b0bfaa5af81"
|
private const val TESTKEY_CERT = "61ed377e85d386a8dfee6b864bd85b0bfaa5af81"
|
||||||
private const val ALPHANUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
||||||
private const val BASE64_FLAG = Base64.NO_PADDING or Base64.NO_WRAP
|
private const val BASE64_FLAG = Base64.NO_PADDING or Base64.NO_WRAP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ object PatchAPK {
|
|||||||
private val UPPERALPHA = LOWERALPHA.toUpperCase()
|
private val UPPERALPHA = LOWERALPHA.toUpperCase()
|
||||||
private val ALPHA = LOWERALPHA + UPPERALPHA
|
private val ALPHA = LOWERALPHA + UPPERALPHA
|
||||||
private const val DIGITS = "0123456789"
|
private const val DIGITS = "0123456789"
|
||||||
private val ALPHANUM = ALPHA + DIGITS
|
val ALPHANUM = ALPHA + DIGITS
|
||||||
private val ALPHANUMDOTS = "$ALPHANUM............"
|
private val ALPHANUMDOTS = "$ALPHANUM............"
|
||||||
|
|
||||||
private fun genPackageName(prefix: String, length: Int): String {
|
private fun genPackageName(prefix: String, length: Int): String {
|
||||||
@@ -77,8 +77,9 @@ object PatchAPK {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun patchAndHide(context: Context, label: String): Boolean {
|
private fun patchAndHide(context: Context, label: String): Boolean {
|
||||||
// If not running as stub, and we are compatible with stub, use stub
|
val src = if (!isRunningAsStub && SDK_INT >= 28 &&
|
||||||
val src = if (!isRunningAsStub && SDK_INT >= 28 && Info.env.connectionMode == 3) {
|
Info.env.magiskVersionCode >= Const.Version.PROVIDER_CONNECT) {
|
||||||
|
// If not running as stub, and we are compatible with stub, use stub
|
||||||
val stub = File(context.cacheDir, "stub.apk")
|
val stub = File(context.cacheDir, "stub.apk")
|
||||||
val svc = get<GithubRawServices>()
|
val svc = get<GithubRawServices>()
|
||||||
runCatching {
|
runCatching {
|
||||||
@@ -118,7 +119,7 @@ object PatchAPK {
|
|||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun patch(apk: String, out: String, pkg: String, label: String = "Manager"): Boolean {
|
fun patch(apk: String, out: String, pkg: String, label: String = "Manager"): Boolean {
|
||||||
try {
|
try {
|
||||||
val jar = JarMap(apk)
|
val jar = JarMap.open(apk)
|
||||||
val je = jar.getJarEntry(Const.ANDROID_MANIFEST)
|
val je = jar.getJarEntry(Const.ANDROID_MANIFEST)
|
||||||
val xml = jar.getRawData(je)
|
val xml = jar.getRawData(je)
|
||||||
|
|
||||||
|
@@ -2,12 +2,10 @@ package com.topjohnwu.magisk.utils
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.topjohnwu.magisk.Const
|
import com.topjohnwu.magisk.Const
|
||||||
import com.topjohnwu.magisk.Info
|
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.extensions.rawResource
|
import com.topjohnwu.magisk.extensions.rawResource
|
||||||
import com.topjohnwu.magisk.wrap
|
import com.topjohnwu.magisk.wrap
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.topjohnwu.superuser.ShellUtils
|
|
||||||
import com.topjohnwu.superuser.io.SuFile
|
import com.topjohnwu.superuser.io.SuFile
|
||||||
|
|
||||||
class RootInit : Shell.Initializer() {
|
class RootInit : Shell.Initializer() {
|
||||||
@@ -17,9 +15,6 @@ class RootInit : Shell.Initializer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun init(context: Context, shell: Shell): Boolean {
|
fun init(context: Context, shell: Shell): Boolean {
|
||||||
// Invalidate env state if shell is recreated
|
|
||||||
Info.envRef.invalidate()
|
|
||||||
|
|
||||||
val job = shell.newJob()
|
val job = shell.newJob()
|
||||||
if (shell.isRoot) {
|
if (shell.isRoot) {
|
||||||
job.add(context.rawResource(R.raw.util_functions))
|
job.add(context.rawResource(R.raw.util_functions))
|
||||||
@@ -29,15 +24,12 @@ class RootInit : Shell.Initializer() {
|
|||||||
job.add(context.rawResource(R.raw.nonroot_utils))
|
job.add(context.rawResource(R.raw.nonroot_utils))
|
||||||
}
|
}
|
||||||
|
|
||||||
job.add("mount_partitions",
|
job.add(
|
||||||
"get_flags",
|
"mount_partitions",
|
||||||
"run_migrations",
|
"get_flags",
|
||||||
"export BOOTMODE=true")
|
"run_migrations",
|
||||||
.exec()
|
"export BOOTMODE=true"
|
||||||
|
).exec()
|
||||||
Info.keepVerity = ShellUtils.fastCmd("echo \$KEEPVERITY").toBoolean()
|
|
||||||
Info.keepEnc = ShellUtils.fastCmd("echo \$KEEPFORCEENCRYPT").toBoolean()
|
|
||||||
Info.recovery = ShellUtils.fastCmd("echo \$RECOVERYMODE").toBoolean()
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@@ -2,11 +2,9 @@ package com.topjohnwu.magisk.utils
|
|||||||
|
|
||||||
import android.net.LocalSocket
|
import android.net.LocalSocket
|
||||||
import android.net.LocalSocketAddress
|
import android.net.LocalSocketAddress
|
||||||
import android.os.Bundle
|
import androidx.collection.ArrayMap
|
||||||
import android.text.TextUtils
|
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import java.nio.charset.Charset
|
|
||||||
|
|
||||||
abstract class SuConnector @Throws(IOException::class)
|
abstract class SuConnector @Throws(IOException::class)
|
||||||
protected constructor(name: String) {
|
protected constructor(name: String) {
|
||||||
@@ -21,24 +19,23 @@ protected constructor(name: String) {
|
|||||||
input = DataInputStream(BufferedInputStream(socket.inputStream))
|
input = DataInputStream(BufferedInputStream(socket.inputStream))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(IOException::class)
|
|
||||||
private fun readString(): String {
|
private fun readString(): String {
|
||||||
val len = input.readInt()
|
val len = input.readInt()
|
||||||
val buf = ByteArray(len)
|
val buf = ByteArray(len)
|
||||||
input.readFully(buf)
|
input.readFully(buf)
|
||||||
return String(buf, Charset.forName("UTF-8"))
|
return String(buf, Charsets.UTF_8)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun readSocketInput(): Bundle {
|
fun readRequest(): Map<String, String> {
|
||||||
val bundle = Bundle()
|
val ret = ArrayMap<String, String>()
|
||||||
while (true) {
|
while (true) {
|
||||||
val name = readString()
|
val name = readString()
|
||||||
if (TextUtils.equals(name, "eof"))
|
if (name == "eof")
|
||||||
break
|
break
|
||||||
bundle.putString(name, readString())
|
ret[name] = readString()
|
||||||
}
|
}
|
||||||
return bundle
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
fun response() {
|
fun response() {
|
||||||
|
135
app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt
Normal file
135
app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
package com.topjohnwu.magisk.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Process
|
||||||
|
import android.widget.Toast
|
||||||
|
import com.topjohnwu.magisk.*
|
||||||
|
import com.topjohnwu.magisk.data.repository.LogRepository
|
||||||
|
import com.topjohnwu.magisk.extensions.get
|
||||||
|
import com.topjohnwu.magisk.extensions.startActivity
|
||||||
|
import com.topjohnwu.magisk.extensions.startActivityWithRoot
|
||||||
|
import com.topjohnwu.magisk.extensions.subscribeK
|
||||||
|
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
||||||
|
import com.topjohnwu.magisk.model.entity.toLog
|
||||||
|
import com.topjohnwu.magisk.model.entity.toPolicy
|
||||||
|
import com.topjohnwu.magisk.ui.surequest.SuRequestActivity
|
||||||
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
|
object SuHandler : ProviderCallHandler {
|
||||||
|
|
||||||
|
const val REQUEST = "request"
|
||||||
|
const val LOG = "log"
|
||||||
|
const val NOTIFY = "notify"
|
||||||
|
const val TEST = "test"
|
||||||
|
|
||||||
|
override fun call(context: Context, method: String, arg: String?, extras: Bundle?): Bundle? {
|
||||||
|
invoke(context.wrap(), method, extras)
|
||||||
|
return Bundle.EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun invoke(context: Context, action: String?, data: Bundle?) {
|
||||||
|
data ?: return
|
||||||
|
|
||||||
|
// Debug messages
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
Timber.d(action)
|
||||||
|
data.let { bundle ->
|
||||||
|
bundle.keySet().forEach {
|
||||||
|
Timber.d("[%s]=[%s]", it, bundle[it])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
when (action) {
|
||||||
|
REQUEST -> {
|
||||||
|
val intent = context.intent<SuRequestActivity>()
|
||||||
|
.setAction(action)
|
||||||
|
.putExtras(data)
|
||||||
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
|
||||||
|
if (Build.VERSION.SDK_INT >= 29) {
|
||||||
|
// Android Q does not allow starting activity from background
|
||||||
|
intent.startActivityWithRoot()
|
||||||
|
} else {
|
||||||
|
intent.startActivity(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG -> handleLogs(context, data)
|
||||||
|
NOTIFY -> handleNotify(context, data)
|
||||||
|
TEST -> {
|
||||||
|
val mode = data.getInt("mode", 2)
|
||||||
|
Shell.su(
|
||||||
|
"magisk --connect-mode $mode",
|
||||||
|
"magisk --use-broadcast"
|
||||||
|
).submit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Any?.toInt(): Int? {
|
||||||
|
return when (this) {
|
||||||
|
is Int -> this
|
||||||
|
is Long -> this.toInt()
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleLogs(context: Context, data: Bundle) {
|
||||||
|
val fromUid = data["from.uid"].toInt() ?: return
|
||||||
|
if (fromUid == Process.myUid())
|
||||||
|
return
|
||||||
|
|
||||||
|
val pm = context.packageManager
|
||||||
|
|
||||||
|
val notify = data.getBoolean("notify", true)
|
||||||
|
val allow = data["policy"].toInt() ?: return
|
||||||
|
|
||||||
|
val policy = runCatching { fromUid.toPolicy(pm, allow) }.getOrElse { return }
|
||||||
|
|
||||||
|
if (notify)
|
||||||
|
notify(context, policy)
|
||||||
|
|
||||||
|
val toUid = data["to.uid"].toInt() ?: return
|
||||||
|
val pid = data["pid"].toInt() ?: return
|
||||||
|
|
||||||
|
val command = data.getString("command") ?: return
|
||||||
|
val log = policy.toLog(
|
||||||
|
toUid = toUid,
|
||||||
|
fromPid = pid,
|
||||||
|
command = command
|
||||||
|
)
|
||||||
|
|
||||||
|
val logRepo = get<LogRepository>()
|
||||||
|
logRepo.insert(log).subscribeK(onError = { Timber.e(it) })
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleNotify(context: Context, data: Bundle) {
|
||||||
|
val fromUid = data["from.uid"].toInt() ?: return
|
||||||
|
if (fromUid == Process.myUid())
|
||||||
|
return
|
||||||
|
|
||||||
|
val pm = context.packageManager
|
||||||
|
val allow = data["policy"].toInt() ?: return
|
||||||
|
|
||||||
|
runCatching {
|
||||||
|
val policy = fromUid.toPolicy(pm, allow)
|
||||||
|
if (policy.policy >= 0)
|
||||||
|
notify(context, policy)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notify(context: Context, policy: MagiskPolicy) {
|
||||||
|
if (policy.notification && Config.suNotification == Config.Value.NOTIFICATION_TOAST) {
|
||||||
|
val resId = if (policy.policy == MagiskPolicy.ALLOW)
|
||||||
|
R.string.su_allow_toast
|
||||||
|
else
|
||||||
|
R.string.su_deny_toast
|
||||||
|
|
||||||
|
Utils.toast(context.getString(resId, policy.appName), Toast.LENGTH_SHORT)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,92 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.utils
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Process
|
|
||||||
import android.widget.Toast
|
|
||||||
import com.topjohnwu.magisk.Config
|
|
||||||
import com.topjohnwu.magisk.R
|
|
||||||
import com.topjohnwu.magisk.data.database.PolicyDao
|
|
||||||
import com.topjohnwu.magisk.data.repository.LogRepository
|
|
||||||
import com.topjohnwu.magisk.extensions.get
|
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy
|
|
||||||
import com.topjohnwu.magisk.model.entity.toLog
|
|
||||||
import com.topjohnwu.magisk.model.entity.toPolicy
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
object SuLogger {
|
|
||||||
|
|
||||||
fun handleLogs(context: Context, intent: Intent) {
|
|
||||||
|
|
||||||
val fromUid = intent.getIntExtra("from.uid", -1)
|
|
||||||
if (fromUid < 0) return
|
|
||||||
if (fromUid == Process.myUid()) return
|
|
||||||
|
|
||||||
val pm = context.packageManager
|
|
||||||
|
|
||||||
val notify: Boolean
|
|
||||||
val data = intent.extras
|
|
||||||
val policy: MagiskPolicy = if (data!!.containsKey("notify")) {
|
|
||||||
notify = data.getBoolean("notify")
|
|
||||||
runCatching {
|
|
||||||
fromUid.toPolicy(pm)
|
|
||||||
}.getOrElse { return }
|
|
||||||
} else {
|
|
||||||
// Doesn't report whether notify or not, check database ourselves
|
|
||||||
val policyDB = get<PolicyDao>()
|
|
||||||
val policy = policyDB.fetch(fromUid).blockingGet() ?: return
|
|
||||||
notify = policy.notification
|
|
||||||
policy
|
|
||||||
}.copy(policy = data.getInt("policy", -1))
|
|
||||||
|
|
||||||
if (policy.policy < 0)
|
|
||||||
return
|
|
||||||
|
|
||||||
if (notify)
|
|
||||||
handleNotify(context, policy)
|
|
||||||
|
|
||||||
val toUid = intent.getIntExtra("to.uid", -1)
|
|
||||||
if (toUid < 0) return
|
|
||||||
|
|
||||||
val pid = intent.getIntExtra("pid", -1)
|
|
||||||
if (pid < 0) return
|
|
||||||
|
|
||||||
val command = intent.getStringExtra("command") ?: return
|
|
||||||
val log = policy.toLog(
|
|
||||||
toUid = toUid,
|
|
||||||
fromPid = pid,
|
|
||||||
command = command,
|
|
||||||
date = Date()
|
|
||||||
)
|
|
||||||
|
|
||||||
val logRepo = get<LogRepository>()
|
|
||||||
logRepo.put(log).blockingGet()?.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleNotify(context: Context, policy: MagiskPolicy) {
|
|
||||||
if (policy.notification && Config.suNotification == Config.Value.NOTIFICATION_TOAST) {
|
|
||||||
Utils.toast(
|
|
||||||
context.getString(
|
|
||||||
if (policy.policy == MagiskPolicy.ALLOW)
|
|
||||||
R.string.su_allow_toast
|
|
||||||
else
|
|
||||||
R.string.su_deny_toast, policy.appName
|
|
||||||
),
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun handleNotify(context: Context, intent: Intent) {
|
|
||||||
val fromUid = intent.getIntExtra("from.uid", -1)
|
|
||||||
if (fromUid < 0) return
|
|
||||||
if (fromUid == Process.myUid()) return
|
|
||||||
runCatching {
|
|
||||||
val pm = context.packageManager
|
|
||||||
val policy = fromUid.toPolicy(pm)
|
|
||||||
.copy(policy = intent.getIntExtra("policy", -1))
|
|
||||||
if (policy.policy >= 0)
|
|
||||||
handleNotify(context, policy)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -11,7 +11,6 @@ import com.topjohnwu.magisk.*
|
|||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.extensions.get
|
import com.topjohnwu.magisk.extensions.get
|
||||||
import com.topjohnwu.magisk.model.update.UpdateCheckService
|
import com.topjohnwu.magisk.model.update.UpdateCheckService
|
||||||
import com.topjohnwu.superuser.Shell
|
|
||||||
import com.topjohnwu.superuser.internal.UiThreadHandler
|
import com.topjohnwu.superuser.internal.UiThreadHandler
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@@ -34,7 +33,7 @@ object Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun showSuperUser(): Boolean {
|
fun showSuperUser(): Boolean {
|
||||||
return Shell.rootAccess() && (Const.USER_ID == 0
|
return Info.env.isActive && (Const.USER_ID == 0
|
||||||
|| Config.suMultiuserMode != Config.Value.MULTIUSER_MODE_OWNER_MANAGED)
|
|| Config.suMultiuserMode != Config.Value.MULTIUSER_MODE_OWNER_MANAGED)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -47,7 +47,7 @@ object Notifications {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun magiskUpdate(context: Context) {
|
fun magiskUpdate(context: Context) {
|
||||||
val intent = context.intent(SplashActivity::class.java)
|
val intent = context.intent<SplashActivity>()
|
||||||
.putExtra(Const.Key.OPEN_SECTION, "magisk")
|
.putExtra(Const.Key.OPEN_SECTION, "magisk")
|
||||||
val stackBuilder = TaskStackBuilder.create(context)
|
val stackBuilder = TaskStackBuilder.create(context)
|
||||||
stackBuilder.addParentStack(SplashActivity::class.java.cmp(context.packageName))
|
stackBuilder.addParentStack(SplashActivity::class.java.cmp(context.packageName))
|
||||||
@@ -65,7 +65,7 @@ object Notifications {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun managerUpdate(context: Context) {
|
fun managerUpdate(context: Context) {
|
||||||
val intent = context.intent(GeneralReceiver::class.java)
|
val intent = context.intent<GeneralReceiver>()
|
||||||
.setAction(Const.Key.BROADCAST_MANAGER_UPDATE)
|
.setAction(Const.Key.BROADCAST_MANAGER_UPDATE)
|
||||||
.putExtra(Const.Key.INTENT_SET_APP, Info.remote.app)
|
.putExtra(Const.Key.INTENT_SET_APP, Info.remote.app)
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ object Notifications {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun dtboPatched(context: Context) {
|
fun dtboPatched(context: Context) {
|
||||||
val intent = context.intent(GeneralReceiver::class.java)
|
val intent = context.intent<GeneralReceiver>()
|
||||||
.setAction(Const.Key.BROADCAST_REBOOT)
|
.setAction(Const.Key.BROADCAST_REBOOT)
|
||||||
val pendingIntent = PendingIntent.getBroadcast(context,
|
val pendingIntent = PendingIntent.getBroadcast(context,
|
||||||
Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
@@ -7,19 +7,19 @@ import android.content.pm.ShortcutManager
|
|||||||
import android.graphics.drawable.Icon
|
import android.graphics.drawable.Icon
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.core.content.getSystemService
|
||||||
import androidx.core.graphics.drawable.toAdaptiveIcon
|
import androidx.core.graphics.drawable.toAdaptiveIcon
|
||||||
import androidx.core.graphics.drawable.toIcon
|
import androidx.core.graphics.drawable.toIcon
|
||||||
import com.topjohnwu.magisk.*
|
import com.topjohnwu.magisk.*
|
||||||
import com.topjohnwu.magisk.extensions.getBitmap
|
import com.topjohnwu.magisk.extensions.getBitmap
|
||||||
import com.topjohnwu.magisk.ui.SplashActivity
|
import com.topjohnwu.magisk.ui.SplashActivity
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
import com.topjohnwu.superuser.Shell
|
|
||||||
|
|
||||||
object Shortcuts {
|
object Shortcuts {
|
||||||
|
|
||||||
fun setup(context: Context) {
|
fun setup(context: Context) {
|
||||||
if (Build.VERSION.SDK_INT >= 25) {
|
if (Build.VERSION.SDK_INT >= 25) {
|
||||||
val manager = context.getSystemService(ShortcutManager::class.java)
|
val manager = context.getSystemService<ShortcutManager>()
|
||||||
manager?.dynamicShortcuts = getShortCuts(context)
|
manager?.dynamicShortcuts = getShortCuts(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,8 +27,7 @@ object Shortcuts {
|
|||||||
@RequiresApi(api = 25)
|
@RequiresApi(api = 25)
|
||||||
private fun getShortCuts(context: Context): List<ShortcutInfo> {
|
private fun getShortCuts(context: Context): List<ShortcutInfo> {
|
||||||
val shortCuts = mutableListOf<ShortcutInfo>()
|
val shortCuts = mutableListOf<ShortcutInfo>()
|
||||||
val root = Shell.rootAccess()
|
val intent = context.intent<SplashActivity>()
|
||||||
val intent = context.intent(SplashActivity::class.java)
|
|
||||||
|
|
||||||
fun getIcon(id: Int): Icon {
|
fun getIcon(id: Int): Icon {
|
||||||
return if (Build.VERSION.SDK_INT >= 26)
|
return if (Build.VERSION.SDK_INT >= 26)
|
||||||
@@ -52,7 +51,7 @@ object Shortcuts {
|
|||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (root && Info.env.magiskHide) {
|
if (Info.env.magiskHide) {
|
||||||
shortCuts.add(
|
shortCuts.add(
|
||||||
ShortcutInfo.Builder(context, "magiskhide")
|
ShortcutInfo.Builder(context, "magiskhide")
|
||||||
.setShortLabel(context.getString(R.string.magiskhide))
|
.setShortLabel(context.getString(R.string.magiskhide))
|
||||||
@@ -67,7 +66,7 @@ object Shortcuts {
|
|||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (!Config.coreOnly && root && Info.env.magiskVersionCode >= 0) {
|
if (!Config.coreOnly && Info.env.isActive) {
|
||||||
shortCuts.add(
|
shortCuts.add(
|
||||||
ShortcutInfo.Builder(context, "modules")
|
ShortcutInfo.Builder(context, "modules")
|
||||||
.setShortLabel(context.getString(R.string.modules))
|
.setShortLabel(context.getString(R.string.modules))
|
||||||
|
@@ -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
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/grant_btn"
|
android:id="@+id/grant_btn"
|
||||||
style="@style/Widget.Button.Text"
|
style="@style/Widget.Button.Text"
|
||||||
gone="@{viewModel.canUseFingerprint}"
|
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:onClick="@{() -> viewModel.grantPressed()}"
|
android:onClick="@{() -> viewModel.grantPressed()}"
|
||||||
android:text="@string/grant" />
|
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>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
|
@@ -201,7 +201,7 @@
|
|||||||
|
|
||||||
<View
|
<View
|
||||||
style="@style/Widget.Divider.Horizontal"
|
style="@style/Widget.Divider.Horizontal"
|
||||||
gone="@{!viewModel.hasRoot || !viewModel.isConnected}"
|
gone="@{!viewModel.isActive || !viewModel.isConnected}"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_margin="@dimen/margin_generic" />
|
android:layout_margin="@dimen/margin_generic" />
|
||||||
|
|
||||||
@@ -482,13 +482,13 @@
|
|||||||
|
|
||||||
<View
|
<View
|
||||||
style="@style/Widget.Divider.Horizontal"
|
style="@style/Widget.Divider.Horizontal"
|
||||||
gone="@{!viewModel.hasRoot}"
|
gone="@{!viewModel.isActive}"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_margin="@dimen/margin_generic" />
|
android:layout_margin="@dimen/margin_generic" />
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
style="@style/Widget.Button.Text"
|
style="@style/Widget.Button.Text"
|
||||||
gone="@{!viewModel.hasRoot}"
|
gone="@{!viewModel.isActive}"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:onClick="@{() -> viewModel.uninstallPressed()}"
|
android:onClick="@{() -> viewModel.uninstallPressed()}"
|
||||||
|
@@ -59,10 +59,12 @@
|
|||||||
android:layout_gravity="bottom|center_horizontal"
|
android:layout_gravity="bottom|center_horizontal"
|
||||||
android:layout_margin="@dimen/fab_padding"
|
android:layout_margin="@dimen/fab_padding"
|
||||||
android:onClick="@{() -> viewModel.fabPressed()}"
|
android:onClick="@{() -> viewModel.fabPressed()}"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:layout_behavior="com.google.android.material.floatingactionbutton.FloatingActionButton$Behavior"
|
app:layout_behavior="com.google.android.material.floatingactionbutton.FloatingActionButton$Behavior"
|
||||||
app:srcCompat="@drawable/ic_add" />
|
app:srcCompat="@drawable/ic_add" />
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
</data>
|
</data>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:focusable="true"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="monospace"
|
android:fontFamily="monospace"
|
||||||
|
@@ -94,6 +94,8 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/hide_app_checkbox"
|
android:id="@+id/hide_app_checkbox"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
isChecked="@{item.isHiddenState}"
|
isChecked="@{item.isHiddenState}"
|
||||||
android:onClick="@{() -> item.toggle()}"
|
android:onClick="@{() -> item.toggle()}"
|
||||||
|
@@ -18,6 +18,9 @@
|
|||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
android:onClick="@{() -> item.toggle()}">
|
android:onClick="@{() -> item.toggle()}">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
@@ -40,6 +43,9 @@
|
|||||||
android:id="@+id/hide_process_icon"
|
android:id="@+id/hide_process_icon"
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
isChecked="@{item.isHidden}"
|
isChecked="@{item.isHidden}"
|
||||||
|
android:background="@null"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
@@ -106,6 +106,8 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/checkbox"
|
android:id="@+id/checkbox"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
isChecked="@{item.isChecked}"
|
isChecked="@{item.isChecked}"
|
||||||
android:layout_marginEnd="@dimen/margin_generic"
|
android:layout_marginEnd="@dimen/margin_generic"
|
||||||
@@ -127,6 +129,8 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/delete"
|
android:id="@+id/delete"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
srcCompat="@{item.isDeletable ? R.drawable.ic_undelete : R.drawable.ic_delete}"
|
srcCompat="@{item.isDeletable ? R.drawable.ic_undelete : R.drawable.ic_delete}"
|
||||||
android:onClick="@{() -> item.toggleDelete()}"
|
android:onClick="@{() -> item.toggleDelete()}"
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
items="@{item.items}"
|
items="@{item.items}"
|
||||||
scrollPosition="@={viewModel.scrollPosition}"
|
scrollPosition="@={viewModel.scrollPosition}"
|
||||||
scrollPositionSmooth="@{true}"
|
scrollPositionSmooth="@{true}"
|
||||||
|
android:focusable="true"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
@@ -39,6 +40,8 @@
|
|||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
hide="@{viewModel.scrollPosition == item.items.size - 1 || item.items.size == 0}"
|
hide="@{viewModel.scrollPosition == item.items.size - 1 || item.items.size == 0}"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom|end"
|
android:layout_gravity="bottom|end"
|
||||||
@@ -50,4 +53,4 @@
|
|||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
|
@@ -105,6 +105,8 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/download"
|
android:id="@+id/download"
|
||||||
|
android:focusable="true"
|
||||||
|
android:clickable="true"
|
||||||
style="@style/Widget.Icon"
|
style="@style/Widget.Icon"
|
||||||
isEnabled="@{viewModel.isConnected}"
|
isEnabled="@{viewModel.isConnected}"
|
||||||
android:alpha="@{viewModel.isConnected ? 1f : .2f}"
|
android:alpha="@{viewModel.isConnected ? 1f : .2f}"
|
||||||
|
@@ -1,5 +1,3 @@
|
|||||||
# v7.4.0
|
# v7.5.1
|
||||||
- Hide Magisk Manager with stub APKs on Android 9.0+. Not all devices will be supported, please refer to Magisk v20.1 release notes.
|
- Fix toggling app components in MagiskHide screen
|
||||||
- Allow customizing app name when hiding Magisk Manager
|
- Update translations
|
||||||
- Generate random keys to sign the hidden Magisk Manager to prevent signature detections
|
|
||||||
- Fix fingerprint UI infinite loop
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
mount_partitions() {
|
mount_partitions() {
|
||||||
[ "`getprop ro.build.ab_update`" = "true" ] && SLOT=`getprop ro.boot.slot_suffix`
|
[ "`getprop ro.build.ab_update`" = "true" ] && SLOT=`getprop ro.boot.slot_suffix`
|
||||||
[ "`getprop ro.build.system_root_image`" = "true" ] && SYSTEM_ROOT=true || SYSTEM_ROOT=false
|
# Check whether non rootfs root dir exists
|
||||||
|
grep ' / ' /proc/mounts | grep -qv 'rootfs' && SYSTEM_ROOT=true || SYSTEM_ROOT=false
|
||||||
}
|
}
|
||||||
|
|
||||||
get_flags() {
|
get_flags() {
|
||||||
|
@@ -17,16 +17,6 @@ fix_env() {
|
|||||||
cd /
|
cd /
|
||||||
}
|
}
|
||||||
|
|
||||||
run_migrations() {
|
|
||||||
# Move the stock backups
|
|
||||||
if [ -f /data/magisk/stock_boot* ]; then
|
|
||||||
mv /data/magisk/stock_boot* /data 2>/dev/null
|
|
||||||
fi
|
|
||||||
if [ -f /data/adb/magisk/stock_boot* ]; then
|
|
||||||
mv /data/adb/magisk/stock_boot* /data 2>/dev/null
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
direct_install() {
|
direct_install() {
|
||||||
rm -rf $MAGISKBIN/* 2>/dev/null
|
rm -rf $MAGISKBIN/* 2>/dev/null
|
||||||
mkdir -p $MAGISKBIN 2>/dev/null
|
mkdir -p $MAGISKBIN 2>/dev/null
|
||||||
@@ -43,30 +33,43 @@ direct_install() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
mm_patch_dtbo() {
|
mm_patch_dtb() {
|
||||||
$KEEPVERITY && return 1 || patch_dtbo_image
|
local result=1
|
||||||
|
local PATCHED=$TMPDIR/dt.patched
|
||||||
|
for name in dtb dtbo; do
|
||||||
|
local IMAGE=`find_block $name$SLOT`
|
||||||
|
if [ ! -z $IMAGE ]; then
|
||||||
|
if $MAGISKBIN/magiskboot dtb $IMAGE patch $PATCHED; then
|
||||||
|
result=0
|
||||||
|
if [ ! -z $SHA1 ]; then
|
||||||
|
# Backup stuffs
|
||||||
|
mkdir /data/magisk_backup_${SHA1} 2>/dev/null
|
||||||
|
cat $IMAGE | gzip -9 > /data/magisk_backup_${SHA1}/${name}.img.gz
|
||||||
|
fi
|
||||||
|
cat $PATCHED /dev/zero > $IMAGE
|
||||||
|
rm -f $PATCHED
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
restore_imgs() {
|
restore_imgs() {
|
||||||
local SHA1=`grep_prop SHA1 /sbin/.magisk/config`
|
|
||||||
[ -z $SHA1 ] && local SHA1=`cat /.backup/.sha1`
|
|
||||||
[ -z $SHA1 ] && return 1
|
[ -z $SHA1 ] && return 1
|
||||||
local STOCKBOOT=/data/stock_boot_${SHA1}.img.gz
|
local BACKUPDIR=/data/magisk_backup_$SHA1
|
||||||
local STOCKDTBO=/data/stock_dtbo.img.gz
|
[ -d $BACKUPDIR ] || return 1
|
||||||
[ -f $STOCKBOOT ] || return 1
|
|
||||||
|
|
||||||
get_flags
|
get_flags
|
||||||
find_boot_image
|
find_boot_image
|
||||||
find_dtbo_image
|
|
||||||
|
|
||||||
if [ -f $STOCKDTBO -a -b "$DTBOIMAGE" ]; then
|
for name in dtb dtbo; do
|
||||||
flash_image $STOCKDTBO $DTBOIMAGE
|
[ -f $BACKUPDIR/${name}.img.gz ] || continue
|
||||||
fi
|
local IMAGE=`find_block $name$SLOT`
|
||||||
if [ -f $STOCKBOOT -a -b "$BOOTIMAGE" ]; then
|
[ -z $IMAGE ] && continue
|
||||||
flash_image $STOCKBOOT $BOOTIMAGE
|
flash_image $BACKUPDIR/${name}.img.gz $IMAGE
|
||||||
return 0
|
done
|
||||||
fi
|
[ -f $BACKUPDIR/boot.img.gz ] || return 1
|
||||||
return 1
|
flash_image $BACKUPDIR/boot.img.gz $BOOTIMAGE
|
||||||
}
|
}
|
||||||
|
|
||||||
post_ota() {
|
post_ota() {
|
||||||
@@ -119,3 +122,5 @@ force_pm_install() {
|
|||||||
[ "$VERIFY" -eq 1 ] && settings put global package_verifier_enable 1
|
[ "$VERIFY" -eq 1 ] && settings put global package_verifier_enable 1
|
||||||
return $res
|
return $res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHA1=`grep_prop SHA1 /sbin/.magisk/config`
|
||||||
|
@@ -9,7 +9,6 @@
|
|||||||
<string name="settings">الإعدادات</string>
|
<string name="settings">الإعدادات</string>
|
||||||
<string name="install">التثبيت</string>
|
<string name="install">التثبيت</string>
|
||||||
<string name="unsupport_magisk_title">إصدار Magisk غير مدعوم</string>
|
<string name="unsupport_magisk_title">إصدار Magisk غير مدعوم</string>
|
||||||
<string name="unsupport_magisk_message">لا يدعم هذا الإصدار من Magisk Manager إصدارا لـ Magisk vأقل من 18\n\n بإمكانك تحديث Magisk يدويا أو تثبيت إصدار أدنى.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk غير مثبت</string>
|
<string name="magisk_version_error">Magisk غير مثبت</string>
|
||||||
@@ -164,9 +163,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d ثانية</string>
|
<string name="request_timeout_summary">%1$d ثانية</string>
|
||||||
<string name="settings_su_reauth_title">إعادة المصادقة بعد الترقية</string>
|
<string name="settings_su_reauth_title">إعادة المصادقة بعد الترقية</string>
|
||||||
<string name="settings_su_reauth_summary">أعد المصادقة على صلاحيات المستخدم المتميز بعد إجراء ترقيات للتطبيق</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="multiuser_mode">نمط تعدد المستخدمين</string>
|
||||||
<string name="settings_owner_only">مالك الجهاز فقط</string>
|
<string name="settings_owner_only">مالك الجهاز فقط</string>
|
||||||
@@ -183,7 +179,6 @@
|
|||||||
<string name="global_summary">تستخدم كافة جلسات العمل للروت مساحة الاسم ذات التركيب العامة</string>
|
<string name="global_summary">تستخدم كافة جلسات العمل للروت مساحة الاسم ذات التركيب العامة</string>
|
||||||
<string name="requester_summary">سترث جلسات العمل للروت مساحة الأسماء لطالبيها</string>
|
<string name="requester_summary">سترث جلسات العمل للروت مساحة الأسماء لطالبيها</string>
|
||||||
<string name="isolate_summary">سيكون لكل جلسة عمل للروت مساحة اسم معزولة خاصة بها </string>
|
<string name="isolate_summary">سيكون لكل جلسة عمل للروت مساحة اسم معزولة خاصة بها </string>
|
||||||
<string name="disable_fingerprint">لم تُعين بصمات الأصابع أو لا يوجد قارئ بصمات</string>
|
|
||||||
<string name="settings_download_path_error">خطأ عند إنشاء مجلد. عليه أن يكون سهلا الوصول إليه من خلال مجلد التخزين للروت و ألا يكون ملفا.</string>
|
<string name="settings_download_path_error">خطأ عند إنشاء مجلد. عليه أن يكون سهلا الوصول إليه من خلال مجلد التخزين للروت و ألا يكون ملفا.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
@@ -211,7 +206,6 @@
|
|||||||
<string name="su_revoke_msg">تأكيد لسحب صلاحيات %1$s ?</string>
|
<string name="su_revoke_msg">تأكيد لسحب صلاحيات %1$s ?</string>
|
||||||
<string name="toast">ملاحظة منبثقة</string>
|
<string name="toast">ملاحظة منبثقة</string>
|
||||||
<string name="none">بدون</string>
|
<string name="none">بدون</string>
|
||||||
<string name="auth_fail">فشل المصادقة</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Tənzimləmələr</string>
|
<string name="settings">Tənzimləmələr</string>
|
||||||
<string name="install">Quraşdır</string>
|
<string name="install">Quraşdır</string>
|
||||||
<string name="unsupport_magisk_title">Dəstəklənməyən Magisk Versiyası</string>
|
<string name="unsupport_magisk_title">Dəstəklənməyən Magisk Versiyası</string>
|
||||||
<string name="unsupport_magisk_message">Magisk Manager\'in bu versiyası Magisk\'in v18.0 versiyasndan aşağısını dəstəkləmir.\n\nMagisk\'i əllə yüksəldə, yaxud tətbiqi əvvəlki versiyalarına qaytara bilərsiniz.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk yüklənməyib.</string>
|
<string name="magisk_version_error">Magisk yüklənməyib.</string>
|
||||||
@@ -152,9 +151,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d saniyə</string>
|
<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_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_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="multiuser_mode">Çox-istifadəçi modu</string>
|
||||||
<string name="settings_owner_only">Yalnız cihaz sahibi</string>
|
<string name="settings_owner_only">Yalnız cihaz sahibi</string>
|
||||||
<string name="settings_owner_manage">Cihaz sahibinin idarəçiliyində</string>
|
<string name="settings_owner_manage">Cihaz sahibinin idarəçiliyində</string>
|
||||||
@@ -169,7 +165,6 @@
|
|||||||
<string name="global_summary">Bütün root sessyaları qlobal qoşma namespace\'dən istifadə edir.</string>
|
<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="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="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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Superuser Tələbi</string>
|
<string name="su_request_title">Superuser Tələbi</string>
|
||||||
@@ -196,7 +191,6 @@
|
|||||||
<string name="su_revoke_msg">%1$s üçün haqları ləğv etməyi təsdiq edirsiniz?</string>
|
<string name="su_revoke_msg">%1$s üçün haqları ləğv etməyi təsdiq edirsiniz?</string>
|
||||||
<string name="toast">Tost</string>
|
<string name="toast">Tost</string>
|
||||||
<string name="none">Heçnə</string>
|
<string name="none">Heçnə</string>
|
||||||
<string name="auth_fail">İdentifikasiya xətası</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -142,9 +142,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d секунди</string>
|
<string name="request_timeout_summary">%1$d секунди</string>
|
||||||
<string name="settings_su_reauth_title">Повторно запитване след актуализация</string>
|
<string name="settings_su_reauth_title">Повторно запитване след актуализация</string>
|
||||||
<string name="settings_su_reauth_summary">Повторно запитване за Superuser достъп след актуализация на приложенията.</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="multiuser_mode">Потребителски достъп</string>
|
||||||
<string name="settings_owner_only">Само собственик</string>
|
<string name="settings_owner_only">Само собственик</string>
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
<string name="global_summary">Всички сесии с руут достъп използват глобалното именно пространство.</string>
|
<string name="global_summary">Всички сесии с руут достъп използват глобалното именно пространство.</string>
|
||||||
<string name="requester_summary">Всички сесии с руут достъп наследяват именното пространство на запитващото приложение.</string>
|
<string name="requester_summary">Всички сесии с руут достъп наследяват именното пространство на запитващото приложение.</string>
|
||||||
<string name="isolate_summary">Всички сесии с руут достъп имат собствени именни пространства.</string>
|
<string name="isolate_summary">Всички сесии с руут достъп имат собствени именни пространства.</string>
|
||||||
<string name="disable_fingerprint">Не са добавени пръстови отпечатъци или устройството не поддържа тази функция.</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Запитване за Superuser достъп</string>
|
<string name="su_request_title">Запитване за Superuser достъп</string>
|
||||||
@@ -188,7 +184,6 @@
|
|||||||
<string name="su_revoke_msg">Потвърждавате ли анулирането на настройките за достъп на %1$s?</string>
|
<string name="su_revoke_msg">Потвърждавате ли анулирането на настройките за достъп на %1$s?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Без</string>
|
<string name="none">Без</string>
|
||||||
<string name="auth_fail">Неуспешна заверка.</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="target_uid">Целеви UID: %1$d</string>
|
<string name="target_uid">Целеви UID: %1$d</string>
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<string name="settings">Configuració</string>
|
<string name="settings">Configuració</string>
|
||||||
<string name="install">Instal·lar</string>
|
<string name="install">Instal·lar</string>
|
||||||
<string name="unsupport_magisk_title">Versió de Magisk incompatible</string>
|
<string name="unsupport_magisk_title">Versió de Magisk incompatible</string>
|
||||||
<string name="unsupport_magisk_message">Aquesta versió de Magisk Manager no suporta una versió inferior a la 18.0.\n\nPots actualitzar Magisk manualment o pots instalar una versió anterior de la app.</string>
|
<string name="unsupport_magisk_msg">Aquesta versió de Magisk Manager no suporta versions de Magisk més petites que la %1$s.\n\nL\'App es comportarà com si Magisk no estigués instal·lat, si us plau actualitzi Magisk el més aviat possible.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk no està instal·lat</string>
|
<string name="magisk_version_error">Magisk no està instal·lat</string>
|
||||||
@@ -81,10 +81,10 @@
|
|||||||
<string name="direct_install">Instal·lació directa (Recomanat)</string>
|
<string name="direct_install">Instal·lació directa (Recomanat)</string>
|
||||||
<string name="install_inactive_slot">Instal·la a la ranura inactiva (Després d\'una OTA)</string>
|
<string name="install_inactive_slot">Instal·la a la ranura inactiva (Després d\'una OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">El teu dispositiu serà FORÇAT a arrancar en l\'actual ranura inactiva després del reinici!\nUtilitza aquesta opció NOMÉS quan l\'OTA s\'hagi fet.\nContinuar?</string>
|
<string name="install_inactive_slot_msg">El teu dispositiu serà FORÇAT a arrancar en l\'actual ranura inactiva després del reinici!\nUtilitza aquesta opció NOMÉS quan l\'OTA s\'hagi fet.\nContinuar?</string>
|
||||||
<string name="select_method">Sel·lecciona un mètode</string>
|
<string name="select_method">Selecciona un mètode</string>
|
||||||
<string name="setup_title">Instal·lació addicional</string>
|
<string name="setup_title">Instal·lació addicional</string>
|
||||||
<string name="select_patch_file">Sel·lecciona i arranja un arxiu</string>
|
<string name="select_patch_file">Selecciona i arranja un arxiu</string>
|
||||||
<string name="patch_file_msg">Sel·lecciona una imatge crua (*.img) o un ODIN tarfile (*.tar)</string>
|
<string name="patch_file_msg">Selecciona una imatge crua (*.img) o un ODIN tarfile (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Reinici en 5 segons…</string>
|
<string name="reboot_delay_toast">Reinici en 5 segons…</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
@@ -95,7 +95,6 @@
|
|||||||
<string name="settings_reboot_toast">Reinicia per aplicar els canvis</string>
|
<string name="settings_reboot_toast">Reinicia per aplicar els canvis</string>
|
||||||
<string name="release_notes">Notes de llançament</string>
|
<string name="release_notes">Notes de llançament</string>
|
||||||
<string name="repo_cache_cleared">Memòria cau del repositori netejada</string>
|
<string name="repo_cache_cleared">Memòria cau del repositori netejada</string>
|
||||||
|
|
||||||
<string name="dtbo_patched_title">S\'ha arranjat DTBO</string>
|
<string name="dtbo_patched_title">S\'ha arranjat DTBO</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager ha arranjat dtbo.img. Si us plau, reinicia el telèfon.</string>
|
<string name="dtbo_patched_reboot">Magisk Manager ha arranjat dtbo.img. Si us plau, reinicia el telèfon.</string>
|
||||||
<string name="flashing">Arranjament…</string>
|
<string name="flashing">Arranjament…</string>
|
||||||
@@ -111,18 +110,19 @@
|
|||||||
<string name="restore_done">Restauració feta!</string>
|
<string name="restore_done">Restauració feta!</string>
|
||||||
<string name="restore_fail">La còpia de seguretat de Stock no existeix!</string>
|
<string name="restore_fail">La còpia de seguretat de Stock no existeix!</string>
|
||||||
<string name="proprietary_title">Baixar codi propietari</string>
|
<string name="proprietary_title">Baixar codi propietari</string>
|
||||||
<string name="proprietary_notice">Magisk Manager és codi lliure i no conté codi de l\'API de SafetyNet, ja que és codi propietari de Google.\n\nPot permetre que Magisk Manager baixi una extensió que conté el GoogleApiClient per poder fer la comprobació de SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager és codi lliure i no conté codi de l\'API de SafetyNet, ja que és codi propietari de Google.\n\nVot permetre que Magisk Manager baixi una extensió que conté el GoogleApiClient per poder fer la comprovació de SafetyNet?</string>
|
||||||
<string name="setup_fail">Instal·lació fallida.</string>
|
<string name="setup_fail">Instal·lació fallida.</string>
|
||||||
<string name="env_fix_title">Es requereix instal·lació addicional</string>
|
<string name="env_fix_title">Es requereix instal·lació addicional</string>
|
||||||
<string name="env_fix_msg">El teu dispositiu necessita instal·lació addicional per Magisk per funcionar correctament. Es baixarà el ZIP d\'instal·lació de Magisk , vol procedir a l\'instalació ara?</string>
|
<string name="env_fix_msg">El teu dispositiu necessita instal·lació addicional per Magisk per funcionar correctament. Es baixarà el ZIP d\'instal·lació de Magisk , vol procedir a l\'instal·lació ara?</string>
|
||||||
<string name="setup_msg">S\'està executant la configuració de l\'entorn…</string>
|
<string name="setup_msg">S\'està executant la configuració de l\'entorn…</string>
|
||||||
|
<string name="authenticate">Autenticar</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">General</string>
|
<string name="settings_general_category">General</string>
|
||||||
<string name="settings_dark_theme_title">Tema fosc</string>
|
<string name="settings_dark_theme_title">Tema fosc</string>
|
||||||
<string name="settings_dark_theme_summary">Habilitar el tema fosc</string>
|
<string name="settings_dark_theme_summary">Habilitar el tema fosc</string>
|
||||||
<string name="settings_download_path_title">Directori de baixades</string>
|
<string name="settings_download_path_title">Directori de baixades</string>
|
||||||
<string name="settings_download_path_message">Els arxius es desaràn a %1$s</string>
|
<string name="settings_download_path_message">Els arxius es desaran a %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Netejar memòria cau del repositori</string>
|
<string name="settings_clear_cache_title">Netejar memòria cau del repositori</string>
|
||||||
<string name="settings_clear_cache_summary">Neteja l\'informació en memòria cau per als repositoris en línia, força a l\'aplicació a actualitzar-se en línia.</string>
|
<string name="settings_clear_cache_summary">Neteja l\'informació en memòria cau per als repositoris en línia, força a l\'aplicació a actualitzar-se en línia.</string>
|
||||||
<string name="settings_hide_manager_title">Amagar Magisk Manager</string>
|
<string name="settings_hide_manager_title">Amagar Magisk Manager</string>
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<string name="settings_update_custom">Personalitzat</string>
|
<string name="settings_update_custom">Personalitzat</string>
|
||||||
<string name="settings_update_custom_msg">Inserta una URL personalitzada</string>
|
<string name="settings_update_custom_msg">Inserta una URL personalitzada</string>
|
||||||
<string name="settings_core_only_title">Mode nucli de Magisk</string>
|
<string name="settings_core_only_title">Mode nucli de Magisk</string>
|
||||||
<string name="settings_core_only_summary">Habilitar només les funcions principals, no es carregaran tots els mòduls. MagiskSU y MagiskHide seguirán habilitats</string>
|
<string name="settings_core_only_summary">Habilitar només les funcions principals, no es carregaran tots els mòduls. MagiskSU y MagiskHide seguiran habilitats</string>
|
||||||
<string name="settings_magiskhide_summary">Amagar Magisk de varies deteccions</string>
|
<string name="settings_magiskhide_summary">Amagar Magisk de varies deteccions</string>
|
||||||
<string name="settings_hosts_title">Systemless Hosts</string>
|
<string name="settings_hosts_title">Systemless Hosts</string>
|
||||||
<string name="settings_hosts_summary">Suport per aplicacions tipus Adblock fora de la partició del sistema</string>
|
<string name="settings_hosts_summary">Suport per aplicacions tipus Adblock fora de la partició del sistema</string>
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
<string name="settings_app_name">Escriu el nom desitjat per l\'App</string>
|
<string name="settings_app_name">Escriu el nom desitjat per l\'App</string>
|
||||||
<string name="settings_app_name_hint">Nou nom</string>
|
<string name="settings_app_name_hint">Nou nom</string>
|
||||||
<string name="settings_app_name_helper">Es refarà l\'App amb aquest nom</string>
|
<string name="settings_app_name_helper">Es refarà l\'App amb aquest nom</string>
|
||||||
<string name="settings_app_name_error">Format invàl·lid</string>
|
<string name="settings_app_name_error">Format invàlid</string>
|
||||||
<string name="settings_su_app_adb">Aplicacions y ADB</string>
|
<string name="settings_su_app_adb">Aplicacions y ADB</string>
|
||||||
<string name="settings_su_app">Només aplicacions</string>
|
<string name="settings_su_app">Només aplicacions</string>
|
||||||
<string name="settings_su_adb">Només ADB</string>
|
<string name="settings_su_adb">Només ADB</string>
|
||||||
@@ -167,9 +167,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d segons</string>
|
<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_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_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_biometric_title">Activar autenticació biomètrica</string>
|
||||||
<string name="settings_su_fingerprint_summary">Utilitza el sensor d\'Empremta Dactilar per permetre les sol·licituds de superusuari</string>
|
<string name="settings_su_biometric_summary">Utilitza l\'autenticació biomètrica per permetre solicituds de superusuari</string>
|
||||||
<string name="auth_fingerprint">Autenticar Emprempta Digital</string>
|
<string name="no_biometric">El dispositiu no suporta o no té establerta configuració biomètrica</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mode Multiusuari</string>
|
<string name="multiuser_mode">Mode Multiusuari</string>
|
||||||
<string name="settings_owner_only">Només Administrador del Dispositiu</string>
|
<string name="settings_owner_only">Només Administrador del Dispositiu</string>
|
||||||
@@ -186,8 +186,7 @@
|
|||||||
<string name="global_summary">Totes les sessions d\'arrel utilitzen el suport Namespace Global</string>
|
<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="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="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 accessible des de el directori arrel i no pot ser un arxiu.</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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Petició de superusuari</string>
|
<string name="su_request_title">Petició de superusuari</string>
|
||||||
@@ -214,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">Confirma per revocar drets de %1$s</string>
|
<string name="su_revoke_msg">Confirma per revocar drets de %1$s</string>
|
||||||
<string name="toast">Avís</string>
|
<string name="toast">Avís</string>
|
||||||
<string name="none">Cap</string>
|
<string name="none">Cap</string>
|
||||||
<string name="auth_fail">Autenticació fallida</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
@@ -222,6 +220,6 @@
|
|||||||
<string name="command">Ordre: %1$s</string>
|
<string name="command">Ordre: %1$s</string>
|
||||||
|
|
||||||
<!-- MagiskHide -->
|
<!-- MagiskHide -->
|
||||||
<string name="show_system_app">Mostra apps del sistema</string>
|
<string name="show_system_app">Mostra Apps del sistema</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Nastavení</string>
|
<string name="settings">Nastavení</string>
|
||||||
<string name="install">Instalovat</string>
|
<string name="install">Instalovat</string>
|
||||||
<string name="unsupport_magisk_title">Nepodporovaná verze Magisk</string>
|
<string name="unsupport_magisk_title">Nepodporovaná verze Magisk</string>
|
||||||
<string name="unsupport_magisk_message">Tato verze Magisk Managera nepodporuje verzi Magisk nižší než v18.0.\n\nMůžete buď ručně aktualizovat Magisk, nebo aplikaci downgradovat na starší verzi.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk není nainstalován.</string>
|
<string name="magisk_version_error">Magisk není nainstalován.</string>
|
||||||
@@ -155,9 +154,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekund</string>
|
<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_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_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="multiuser_mode">Režim více uživatelů</string>
|
||||||
<string name="settings_owner_only">Pouze vlastník zařízení</string>
|
<string name="settings_owner_only">Pouze vlastník zařízení</string>
|
||||||
@@ -174,7 +170,6 @@
|
|||||||
<string name="global_summary">Všechny relace root používají globální připojení jmenného prostoru.</string>
|
<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="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="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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Požadavek Superuser</string>
|
<string name="su_request_title">Požadavek Superuser</string>
|
||||||
@@ -201,7 +196,6 @@
|
|||||||
<string name="su_revoke_msg">Smazat záznam ohledně oprávnění pro %1$s?</string>
|
<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="toast">Informační text</string>
|
||||||
<string name="none">Žádný</string>
|
<string name="none">Žádný</string>
|
||||||
<string name="auth_fail">Ověření se nezdařilo</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,14 +8,14 @@
|
|||||||
<string name="settings">Einstellungen</string>
|
<string name="settings">Einstellungen</string>
|
||||||
<string name="install">Installieren</string>
|
<string name="install">Installieren</string>
|
||||||
<string name="unsupport_magisk_title">Nicht unterstützte Magisk Version</string>
|
<string name="unsupport_magisk_title">Nicht unterstützte Magisk Version</string>
|
||||||
<string name="unsupport_magisk_message">Diese Version von Magisk Manager unterstützt keine Magisk-Version kleiner als 18.0. \n\nSie können entweder Magisk manuell aktualisieren oder die App auf eine ältere Version herabstufen.</string>
|
<string name="unsupport_magisk_msg">Diese Version von Magisk Manager unterstützt keine Magisk-Versionen unter %1$s.\n\nDie App verhält sich so, als ob kein Magisk installiert ist. Bitte Magisk so schnell wie möglich aktualisieren.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk ist nicht installiert</string>
|
<string name="magisk_version_error">Magisk ist nicht installiert</string>
|
||||||
<string name="checking_for_updates">Suche nach Aktualisierungen…</string>
|
<string name="checking_for_updates">Suche nach Aktualisierungen…</string>
|
||||||
<string name="invalid_update_channel">Ungültiger Aktualisierungskanal</string>
|
<string name="invalid_update_channel">Ungültiger Aktualisierungskanal</string>
|
||||||
<string name="safetyNet_check_text">SafetyNet-Status abfragen</string>
|
<string name="safetyNet_check_text">SafetyNet-Status abfragen</string>
|
||||||
<string name="checking_safetyNet_status">Prüfe SafetyNet-Status…</string>
|
<string name="checking_safetyNet_status">SafetyNet-Status prüfen…</string>
|
||||||
<string name="safetyNet_check_success">SafetyNet-Test erfolgreich</string>
|
<string name="safetyNet_check_success">SafetyNet-Test erfolgreich</string>
|
||||||
<string name="safetyNet_api_error">SafetyNet API Fehler</string>
|
<string name="safetyNet_api_error">SafetyNet API Fehler</string>
|
||||||
<string name="safetyNet_res_invalid">Die Antwort ist ungültig</string>
|
<string name="safetyNet_res_invalid">Die Antwort ist ungültig</string>
|
||||||
@@ -24,11 +24,12 @@
|
|||||||
<string name="advanced_settings_title">Erweiterte Optionen</string>
|
<string name="advanced_settings_title">Erweiterte Optionen</string>
|
||||||
<string name="keep_force_encryption">\"force encryption\" beibehalten</string>
|
<string name="keep_force_encryption">\"force encryption\" beibehalten</string>
|
||||||
<string name="keep_dm_verity">AVB 2.0/dm-verity beibehalten</string>
|
<string name="keep_dm_verity">AVB 2.0/dm-verity beibehalten</string>
|
||||||
|
<string name="recovery_mode">Wiederherstellungsmodus</string>
|
||||||
<string name="current_installed">Installiert: %1$s</string>
|
<string name="current_installed">Installiert: %1$s</string>
|
||||||
<string name="latest_version">Neueste: %1$s</string>
|
<string name="latest_version">Neueste: %1$s</string>
|
||||||
<string name="uninstall">Deinstallieren</string>
|
<string name="uninstall">Deinstallieren</string>
|
||||||
<string name="uninstall_magisk_title">Magisk deinstallieren</string>
|
<string name="uninstall_magisk_title">Magisk deinstallieren</string>
|
||||||
<string name="uninstall_magisk_msg">Alle Module werden deaktiviert/entfernt. Root wird entfernt, und Ihre Daten werden möglicherweise verschlüsselt, wenn nicht bereits der Fall.</string>
|
<string name="uninstall_magisk_msg">Alle Module werden deaktiviert/entfernt. Root wird entfernt, und deine Daten werden möglicherweise verschlüsselt, wenn es nicht bereits der Fall ist.</string>
|
||||||
<string name="update">aktualisieren</string>
|
<string name="update">aktualisieren</string>
|
||||||
<string name="core_only_enabled">(Core only Modus aktiviert)</string>
|
<string name="core_only_enabled">(Core only Modus aktiviert)</string>
|
||||||
|
|
||||||
@@ -44,6 +45,7 @@
|
|||||||
<string name="reboot_recovery">Neustart in das Recovery</string>
|
<string name="reboot_recovery">Neustart in das Recovery</string>
|
||||||
<string name="reboot_bootloader">Neustart in den Bootloader</string>
|
<string name="reboot_bootloader">Neustart in den Bootloader</string>
|
||||||
<string name="reboot_download">Neustart in den Download-Modus</string>
|
<string name="reboot_download">Neustart in den Download-Modus</string>
|
||||||
|
<string name="reboot_edl">Neustart in den EDL-Modus</string>
|
||||||
|
|
||||||
<!--Repo Fragment-->
|
<!--Repo Fragment-->
|
||||||
<string name="update_available">Aktualisierung verfügbar</string>
|
<string name="update_available">Aktualisierung verfügbar</string>
|
||||||
@@ -68,6 +70,8 @@
|
|||||||
<string name="progress_channel">Fortschrittsbenachrichtigungen</string>
|
<string name="progress_channel">Fortschrittsbenachrichtigungen</string>
|
||||||
<string name="download_complete">Download abgeschlossen</string>
|
<string name="download_complete">Download abgeschlossen</string>
|
||||||
<string name="download_file_error">Fehler beim Herunterladen der Datei</string>
|
<string name="download_file_error">Fehler beim Herunterladen der Datei</string>
|
||||||
|
<string name="download_open_parent">Im übergeordneten Ordner anzeigen</string>
|
||||||
|
<string name="download_open_self">Datei anzeigen</string>
|
||||||
<string name="magisk_update_title">Neues Magisk Update verfügbar!</string>
|
<string name="magisk_update_title">Neues Magisk Update verfügbar!</string>
|
||||||
<string name="manager_update_title">Aktualisierung für Magisk Manager verfügbar!</string>
|
<string name="manager_update_title">Aktualisierung für Magisk Manager verfügbar!</string>
|
||||||
|
|
||||||
@@ -75,71 +79,77 @@
|
|||||||
<string name="manager_download_install">Herunterladen und installieren</string>
|
<string name="manager_download_install">Herunterladen und installieren</string>
|
||||||
<string name="download_zip_only">Nur Zip-Datei herunterladen</string>
|
<string name="download_zip_only">Nur Zip-Datei herunterladen</string>
|
||||||
<string name="direct_install">Direkt installieren (empfohlen)</string>
|
<string name="direct_install">Direkt installieren (empfohlen)</string>
|
||||||
<string name="install_inactive_slot">Installiere in inaktiven Slot (Nach OTA)</string>
|
<string name="install_inactive_slot">In inaktiven Slot installieren (Nach OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">Dein Gerät wird GEZWUNGEN in den aktuell inaktiven Slot zu starten, nachdem ein Neustart durchgeführt wurde!\nBenutze diese Option nur, nachdem das OTA beendet wurde.\nFortsetzen?</string>
|
<string name="install_inactive_slot_msg">Dein Gerät wird GEZWUNGEN in den aktuell inaktiven Slot zu starten, nachdem ein Neustart durchgeführt wurde!\nBenutze diese Option nur, nachdem das OTA beendet wurde.\nFortsetzen?</string>
|
||||||
<string name="select_method">Methode auswählen</string>
|
<string name="select_method">Methode auswählen</string>
|
||||||
<string name="setup_title">Zusätzliche Einrichtung</string>
|
<string name="setup_title">Zusätzliche Einrichtung</string>
|
||||||
<string name="select_patch_file">Auswählen und Patchen einer Datei</string>
|
<string name="select_patch_file">Auswählen und Patchen einer Datei</string>
|
||||||
<string name="patch_file_msg">Wählen Sie ein Rohabbild (*.img) oder eine ODIN-Tar-Datei (*.tar) aus.</string>
|
<string name="patch_file_msg">Ein Rohabbild (*.img) oder eine ODIN-Tar-Datei (*.tar) auswählen.</string>
|
||||||
<string name="reboot_delay_toast">Neustart in 5 Sekunden…</string>
|
<string name="reboot_delay_toast">Neustart in 5 Sekunden…</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="repo_install_title">Installiere %1$s</string>
|
<string name="repo_install_title">%1$s installieren</string>
|
||||||
<string name="repo_install_msg">Möchtest du %1$s installieren?</string>
|
<string name="repo_install_msg">Möchtest du %1$s installieren?</string>
|
||||||
<string name="download">Herunterladen</string>
|
<string name="download">Herunterladen</string>
|
||||||
<string name="reboot">Neustart</string>
|
<string name="reboot">Neustart</string>
|
||||||
<string name="settings_reboot_toast">Neustarten, um die Änderungen zu übernehmen</string>
|
<string name="settings_reboot_toast">Neustarten, um die Änderungen zu übernehmen</string>
|
||||||
<string name="release_notes">Versionshinweise</string>
|
<string name="release_notes">Versionshinweise</string>
|
||||||
<string name="repo_cache_cleared">Repo-Cache geleert</string>
|
<string name="repo_cache_cleared">Repo-Cache geleert</string>
|
||||||
|
|
||||||
<string name="dtbo_patched_title">DTBO wurde gepatched!</string>
|
<string name="dtbo_patched_title">DTBO wurde gepatched!</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager hat dtbo.img gepatched, bitte neustarten</string>
|
<string name="dtbo_patched_reboot">Magisk Manager hat dtbo.img gepatched, bitte neustarten</string>
|
||||||
<string name="flashing">Flashing</string>
|
<string name="flashing">Flashing</string>
|
||||||
<string name="done">Erledigt!</string>
|
<string name="done">Erledigt!</string>
|
||||||
<string name="failure">Fehler</string>
|
<string name="failure">Fehler</string>
|
||||||
<string name="hide_manager_title">Verberge Magisk Manager…</string>
|
<string name="hide_manager_title">Magisk Manager verbergen…</string>
|
||||||
<string name="hide_manager_fail_toast">Verbergen von Magisk Manager fehlgeschlagen…</string>
|
<string name="hide_manager_fail_toast">Magisk Manager verbergen ist fehlgeschlagen…</string>
|
||||||
<string name="open_link_failed_toast">Es wurde keine Anwendung gefunden, um diesen Link zu öffnen...</string>
|
<string name="open_link_failed_toast">Es wurde keine App gefunden, um diesen Link zu öffnen…</string>
|
||||||
<string name="warning">Warnung</string>
|
<string name="warning">Warnung</string>
|
||||||
<string name="complete_uninstall">Komplette Deinstallation</string>
|
<string name="complete_uninstall">Komplette Deinstallation</string>
|
||||||
<string name="restore_img">Images wiederherstellen</string>
|
<string name="restore_img">Images wiederherstellen</string>
|
||||||
<string name="restore_img_msg">Wiederherstellen...</string>
|
<string name="restore_img_msg">Wiederherstellen…</string>
|
||||||
<string name="restore_done">Wiederherstellung erfolgreich!</string>
|
<string name="restore_done">Wiederherstellung erfolgreich!</string>
|
||||||
<string name="restore_fail">Kein Original Backup vorhanden!</string>
|
<string name="restore_fail">Kein Original Backup vorhanden!</string>
|
||||||
<string name="proprietary_title">Lade proprietären Code herunter</string>
|
<string name="proprietary_title">Lade proprietären Code herunter</string>
|
||||||
<string name="proprietary_notice">Magisk Manager ist FOSS und enthält keinen proprietären SafetyNet API Code von Google. Magisk Manager erlauben eine Erweiterung (enthält GoogleApiClient) für SafetyNet-Checks herunterzuladen?</string>
|
<string name="proprietary_notice">Magisk Manager ist FOSS und enthält keinen proprietären SafetyNet API Code von Google. Magisk Manager erlauben eine Erweiterung (enthält GoogleApiClient) für SafetyNet-Checks herunterzuladen?</string>
|
||||||
<string name="setup_fail">Einrichtung fehlgeschlagen</string>
|
<string name="setup_fail">Einrichtung fehlgeschlagen</string>
|
||||||
<string name="env_fix_title">Zusätzliche Einrichtung erforderlich</string>
|
<string name="env_fix_title">Zusätzliche Einrichtung erforderlich</string>
|
||||||
<string name="env_fix_msg">Ihr Gerät benötigt zusätzliche Einrichtung, damit Magisk ordnungsgemäß funktioniert. Es wird eine Magisk-Installations-Zip wird heruntergeladen, fortfahren?</string>
|
<string name="env_fix_msg">Dein Gerät benötigt eine zusätzliche Einrichtung, damit Magisk ordnungsgemäß funktioniert. Es wird eine Magisk-Installations-Zip heruntergeladen. Fortfahren?</string>
|
||||||
<string name="setup_msg">Umgebungseinrichtung läuft…</string>
|
<string name="setup_msg">Umgebungseinrichtung läuft…</string>
|
||||||
|
<string name="authenticate">Authentifizieren</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Allgemein</string>
|
<string name="settings_general_category">Allgemein</string>
|
||||||
<string name="settings_dark_theme_title">Dunkles Theme</string>
|
<string name="settings_dark_theme_title">Dunkles Theme</string>
|
||||||
<string name="settings_dark_theme_summary">Dunkles Theme aktivieren</string>
|
<string name="settings_dark_theme_summary">Dunkles Theme aktivieren</string>
|
||||||
|
<string name="settings_download_path_title">Download-Verzeichnis</string>
|
||||||
|
<string name="settings_download_path_message">Dateien werden in %1$s gespeichert</string>
|
||||||
<string name="settings_clear_cache_title">Repo-Cache leeren</string>
|
<string name="settings_clear_cache_title">Repo-Cache leeren</string>
|
||||||
<string name="settings_clear_cache_summary">Löscht die zwischengespeicherten Informationen des Online-Repos. Erzwingt eine Aktualisierung</string>
|
<string name="settings_clear_cache_summary">Löscht die zwischengespeicherten Informationen des Online-Repos. Erzwingt eine Aktualisierung</string>
|
||||||
<string name="settings_hide_manager_title">Magisk Manager verbergen</string>
|
<string name="settings_hide_manager_title">Magisk Manager verbergen</string>
|
||||||
<string name="settings_hide_manager_summary">Magisk Manager mit zufälligem Paketnamen neu packen</string>
|
<string name="settings_hide_manager_summary">Magisk Manager mit zufälligem Paketnamen neu packen</string>
|
||||||
<string name="settings_restore_manager_title">Magisk Manager wiederherstellen</string>
|
<string name="settings_restore_manager_title">Magisk Manager wiederherstellen</string>
|
||||||
<string name="settings_restore_manager_summary">Stellt Magisk Manager mit ursprünglichem Paketnamen wieder her</string>
|
<string name="settings_restore_manager_summary">Magisk Manager mit ursprünglichem Paketnamen wiederherstellen</string>
|
||||||
<string name="language">Sprache</string>
|
<string name="language">Sprache</string>
|
||||||
<string name="system_default">(Systemstandard)</string>
|
<string name="system_default">(Systemstandard)</string>
|
||||||
<string name="settings_update">Aktualisierungs-Einstellungen</string>
|
<string name="settings_update">Aktualisierungs-Einstellungen</string>
|
||||||
<string name="settings_check_update_title">Prüfe nach Aktualisierungen</string>
|
<string name="settings_check_update_title">Auf Aktualisierungen prüfen</string>
|
||||||
<string name="settings_check_update_summary">Prüfe regelmäßig im Hintergrund nach Aktualisierungen</string>
|
<string name="settings_check_update_summary">Regelmäßig im Hintergrund auf Aktualisierungen prüfen</string>
|
||||||
<string name="settings_update_channel_title">Aktualisierungs-Kanal</string>
|
<string name="settings_update_channel_title">Aktualisierungs-Kanal</string>
|
||||||
<string name="settings_update_stable">Stabil</string>
|
<string name="settings_update_stable">Stabil</string>
|
||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Benutzerdefiniert</string>
|
<string name="settings_update_custom">Benutzerdefiniert</string>
|
||||||
<string name="settings_update_custom_msg">Gib eine benutzerdefinierte URL ein</string>
|
<string name="settings_update_custom_msg">Eine benutzerdefinierte URL eingeben</string>
|
||||||
<string name="settings_core_only_title">Nur Kernfunktionen</string>
|
<string name="settings_core_only_title">Nur Kernfunktionen</string>
|
||||||
<string name="settings_core_only_summary">Aktiviert lediglich die Kernfunktionen, Module werden nicht geladen. MagiskSU und Magisk Hide bleiben weiterhin aktiv</string>
|
<string name="settings_core_only_summary">Aktiviert lediglich die Kernfunktionen, Module werden nicht geladen. MagiskSU und Magisk Hide bleiben weiterhin aktiv</string>
|
||||||
<string name="settings_magiskhide_summary">Versteckt Magisk vor diversen Entdeckungsmethoden</string>
|
<string name="settings_magiskhide_summary">Versteckt Magisk vor diversen Entdeckungsmethoden</string>
|
||||||
<string name="settings_hosts_title">Systemlose Hosts-Datei</string>
|
<string name="settings_hosts_title">Systemlose Hosts-Datei</string>
|
||||||
<string name="settings_hosts_summary">Systemlose Unterstützung für Werbeblocker</string>
|
<string name="settings_hosts_summary">Systemlose Unterstützung für Werbeblocker</string>
|
||||||
<string name="settings_hosts_toast">systemless Hosts-Modul hinzugefügt</string>
|
<string name="settings_hosts_toast">Systemless Hosts-Modul hinzugefügt</string>
|
||||||
|
|
||||||
|
<string name="settings_app_name">Den gewünschten App-Namen eingeben</string>
|
||||||
|
<string name="settings_app_name_hint">Neuer Name</string>
|
||||||
|
<string name="settings_app_name_helper">Die App wird unter diesem Namen neu gepackt</string>
|
||||||
|
<string name="settings_app_name_error">Ungültiges Format</string>
|
||||||
<string name="settings_su_app_adb">Apps und ADB</string>
|
<string name="settings_su_app_adb">Apps und ADB</string>
|
||||||
<string name="settings_su_app">Nur Apps</string>
|
<string name="settings_su_app">Nur Apps</string>
|
||||||
<string name="settings_su_adb">Nur ADB</string>
|
<string name="settings_su_adb">Nur ADB</string>
|
||||||
@@ -157,9 +167,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d Sekunden</string>
|
<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_title">Nach Aktualisierung erneut authentifizieren</string>
|
||||||
<string name="settings_su_reauth_summary">Superuser-Zugriff nach App-Aktualisierung erneut abfragen</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_biometric_title">Biometrische Authentifizierung aktivieren</string>
|
||||||
<string name="settings_su_fingerprint_summary">Fingerabdrucksensor benutzen um Superuser-Anfragen zu erlauben</string>
|
<string name="settings_su_biometric_summary">Biometrische Authentifizierung verwenden, um Superuser-Anfragen zu ermöglichen</string>
|
||||||
<string name="auth_fingerprint">Authentifiziere Fingerabdruck</string>
|
<string name="no_biometric">Nicht unterstütztes Gerät oder keine biometrischen Einstellungen aktiviert</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mehrbenutzermodus</string>
|
<string name="multiuser_mode">Mehrbenutzermodus</string>
|
||||||
<string name="settings_owner_only">Nur der Gerätebesitzer</string>
|
<string name="settings_owner_only">Nur der Gerätebesitzer</string>
|
||||||
@@ -176,7 +186,7 @@
|
|||||||
<string name="global_summary">Alle Root-Sitzungen benutzen den global angelegten Namespace</string>
|
<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="requester_summary">Root-Sitzungen erben den Namespace des Abfragenden</string>
|
||||||
<string name="isolate_summary">Jede Root-Sitzung hat ihren isolierten Namespace</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>
|
<string name="settings_download_path_error">Fehler beim Erstellen eines Ordners. Er muss im Stammverzeichnis des Speichers zugänglich und darf keine Datei sein.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Superuser-Anfrage</string>
|
<string name="su_request_title">Superuser-Anfrage</string>
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
<string name="sixtymin">60 Min.</string>
|
<string name="sixtymin">60 Min.</string>
|
||||||
<string name="su_allow_toast">Superuser-Rechte für %1$s gewährt</string>
|
<string name="su_allow_toast">Superuser-Rechte für %1$s gewährt</string>
|
||||||
<string name="su_deny_toast">Superuser-Rechte für %1$s verweigert</string>
|
<string name="su_deny_toast">Superuser-Rechte für %1$s verweigert</string>
|
||||||
<string name="no_apps_found">Keine Applikationen gefunden</string>
|
<string name="no_apps_found">Keine Apps gefunden</string>
|
||||||
<string name="su_snack_grant">Superuser-Rechte werden für %1$s gewährt</string>
|
<string name="su_snack_grant">Superuser-Rechte werden für %1$s gewährt</string>
|
||||||
<string name="su_snack_deny">Superuser-Rechte werden für %1$s verweigert</string>
|
<string name="su_snack_deny">Superuser-Rechte werden für %1$s verweigert</string>
|
||||||
<string name="su_snack_notif_on">Benachrichtigungen für %1$s sind aktiviert</string>
|
<string name="su_snack_notif_on">Benachrichtigungen für %1$s sind aktiviert</string>
|
||||||
@@ -203,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">Möchtest du die Rechte für %1$s entziehen?</string>
|
<string name="su_revoke_msg">Möchtest du die Rechte für %1$s entziehen?</string>
|
||||||
<string name="toast">Popup</string>
|
<string name="toast">Popup</string>
|
||||||
<string name="none">Keine</string>
|
<string name="none">Keine</string>
|
||||||
<string name="auth_fail">Authentifizierung fehlgeschlagen</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
@@ -211,6 +220,6 @@
|
|||||||
<string name="command">Befehl: %1$s</string>
|
<string name="command">Befehl: %1$s</string>
|
||||||
|
|
||||||
<!-- MagiskHide -->
|
<!-- MagiskHide -->
|
||||||
<string name="show_system_app">System Applikationen anzeigen</string>
|
<string name="show_system_app">System-Apps anzeigen</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Ajustes</string>
|
<string name="settings">Ajustes</string>
|
||||||
<string name="install">Instalar</string>
|
<string name="install">Instalar</string>
|
||||||
<string name="unsupport_magisk_title">Versión de Magisk no soportada</string>
|
<string name="unsupport_magisk_title">Versión de Magisk no soportada</string>
|
||||||
<string name="unsupport_magisk_message">Esta versión de Magisk Manager no admite una versión de Magisk inferior a la v18.0.\n\nPuede actualizar Magisk de forma manual o instalar una versión anterior de la aplicación.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk no está instalado</string>
|
<string name="magisk_version_error">Magisk no está instalado</string>
|
||||||
@@ -114,6 +113,7 @@
|
|||||||
<string name="env_fix_title">Se Requiere una Instalación Adicional</string>
|
<string name="env_fix_title">Se Requiere una Instalación Adicional</string>
|
||||||
<string name="env_fix_msg">Su dispositivo requiere una instalación adicional para que Magisk funcione correctamente. Se descargará el zip de instalación de Magisk, desea continuar ahora?</string>
|
<string name="env_fix_msg">Su dispositivo requiere una instalación adicional para que Magisk funcione correctamente. Se descargará el zip de instalación de Magisk, desea continuar ahora?</string>
|
||||||
<string name="setup_msg">Ejecutando Configuración de Entorno</string>
|
<string name="setup_msg">Ejecutando Configuración de Entorno</string>
|
||||||
|
<string name="authenticate">Autenticar</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">General</string>
|
<string name="settings_general_category">General</string>
|
||||||
@@ -160,10 +160,10 @@
|
|||||||
<string name="request_timeout_summary">%1$d segundos</string>
|
<string name="request_timeout_summary">%1$d segundos</string>
|
||||||
<string name="settings_su_reauth_title">Re-autenticación</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_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_biometric_title">Habilitar autenticación biométrica</string>
|
||||||
<string name="settings_su_fingerprint_summary">Utilizar el sensor de Huella Dactilar para permitir las solicitudes de superusuario</string>
|
<string name="settings_su_biometric_summary">Usar autenticación biométrica para permitir solicitudes de superusuario</string>
|
||||||
<string name="auth_fingerprint">Autenticar Huella Dactilar</string>
|
<string name="no_biometric">Dispositivo no compatible o las configuraciones biométricas no están habilitadas</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Modo MultiUsuario</string>
|
<string name="multiuser_mode">Modo MultiUsuario</string>
|
||||||
<string name="settings_owner_only">Sólo Administrador del Dispositivo</string>
|
<string name="settings_owner_only">Sólo Administrador del Dispositivo</string>
|
||||||
<string name="settings_owner_manage">Administrador del Dispositivo</string>
|
<string name="settings_owner_manage">Administrador del Dispositivo</string>
|
||||||
@@ -179,7 +179,6 @@
|
|||||||
<string name="global_summary">Todas las sesiones de root utilizan el soporte Global Namespace</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -207,7 +206,6 @@
|
|||||||
<string name="su_revoke_msg">¿Confirmar para revocar derechos de %1$s?</string>
|
<string name="su_revoke_msg">¿Confirmar para revocar derechos de %1$s?</string>
|
||||||
<string name="toast">Aviso</string>
|
<string name="toast">Aviso</string>
|
||||||
<string name="none">Nada</string>
|
<string name="none">Nada</string>
|
||||||
<string name="auth_fail">Autenticación fallida</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Seaded</string>
|
<string name="settings">Seaded</string>
|
||||||
<string name="install">Installi</string>
|
<string name="install">Installi</string>
|
||||||
<string name="unsupport_magisk_title">Mittetoetatud Magisk\'i versioon</string>
|
<string name="unsupport_magisk_title">Mittetoetatud Magisk\'i versioon</string>
|
||||||
<string name="unsupport_magisk_message">See Magisk Manager\'i versioon ei toeta Magisk\'ist vanemat versiooni kui v18.0.\n\nSa võid kas Magisk\'i käsitsi täiendada või alandad rakenduse vanemale versioonile.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk pole installitud</string>
|
<string name="magisk_version_error">Magisk pole installitud</string>
|
||||||
@@ -163,9 +162,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekundit</string>
|
<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_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_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="multiuser_mode">Mitmikkasutaja režiim</string>
|
||||||
<string name="settings_owner_only">Ainult seadme omanik</string>
|
<string name="settings_owner_only">Ainult seadme omanik</string>
|
||||||
@@ -182,7 +178,6 @@
|
|||||||
<string name="global_summary">Kõik juurkasutaja sessioonid kasutavad globaalset monteerimise nimeruumi.</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -210,7 +205,6 @@
|
|||||||
<string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
|
<string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
|
||||||
<string name="toast">Hüpik</string>
|
<string name="toast">Hüpik</string>
|
||||||
<string name="none">Puudub</string>
|
<string name="none">Puudub</string>
|
||||||
<string name="auth_fail">Autentimine ebaõnnestus</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -3,222 +3,221 @@
|
|||||||
<!--Welcome Activity-->
|
<!--Welcome Activity-->
|
||||||
<string name="modules">Modules</string>
|
<string name="modules">Modules</string>
|
||||||
<string name="downloads">Téléchargements</string>
|
<string name="downloads">Téléchargements</string>
|
||||||
<string name="superuser">Super‐utilisateur</string>
|
<string name="superuser">Super‑utilisateur</string>
|
||||||
<string name="log">Journal</string>
|
<string name="log">Journal</string>
|
||||||
<string name="settings">Paramètres</string>
|
<string name="settings">Paramètres</string>
|
||||||
<string name="install">Installer</string>
|
<string name="install">Installer</string>
|
||||||
<string name="unsupport_magisk_title">Version de Magisk non prise en charge</string>
|
<string name="unsupport_magisk_title">Version de Magisk non prise en charge</string>
|
||||||
<string name="unsupport_magisk_message">Cette version de Magisk Manager ne prend pas en charge les versions de Magisk inférieures à v18.0.\n\nSi vous continuez, toutes les fonctionnalités de Magisk ne seront pas disponibles et vous ne pourrez que mettre à jour Magisk.</string>
|
<string name="unsupport_magisk_msg">Cette version de Magisk Manager ne prend pas en charge les versions de Magisk inférieures à %1$s.\n\nL’application se comportera comme si Magisk n’était pas installé, veuillez mettre à jour Magisk dès que possible.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk n’est pas installé.</string>
|
<string name="magisk_version_error">Magisk n’est pas installé</string>
|
||||||
<string name="checking_for_updates">Vérification des mises à jour…</string>
|
<string name="checking_for_updates">Vérification des mises à jour…</string>
|
||||||
<string name="invalid_update_channel">Canal de mise à jour invalide</string>
|
<string name="invalid_update_channel">Canal de mise à jour invalide</string>
|
||||||
<string name="safetyNet_check_text">Appuyez pour lancer le contrôle SafetyNet.</string>
|
<string name="safetyNet_check_text">Appuyez pour lancer le contrôle SafetyNet</string>
|
||||||
<string name="checking_safetyNet_status">Vérification de l’état de SafetyNet…</string>
|
<string name="checking_safetyNet_status">Vérification de l’état de SafetyNet…</string>
|
||||||
<string name="safetyNet_check_success">Contrôle SafetyNet passé avec succès</string>
|
<string name="safetyNet_check_success">Contrôle SafetyNet réussi</string>
|
||||||
<string name="safetyNet_api_error">Erreur de l’API SafetyNet</string>
|
<string name="safetyNet_api_error">Erreur de l’API SafetyNet</string>
|
||||||
<string name="safetyNet_res_invalid">La réponse est incorrecte.</string>
|
<string name="safetyNet_res_invalid">La réponse est incorrecte</string>
|
||||||
<string name="magisk_up_to_date">Magisk est à jour</string>
|
<string name="magisk_up_to_date">Magisk est à jour</string>
|
||||||
<string name="manager_up_to_date">Magisk Manager est à jour</string>
|
<string name="manager_up_to_date">Magisk Manager est à jour</string>
|
||||||
<string name="advanced_settings_title">Paramètres avancés</string>
|
<string name="advanced_settings_title">Paramètres avancés</string>
|
||||||
<string name="keep_force_encryption">Conserver le chiffrement forcé</string>
|
<string name="keep_force_encryption">Conserver le chiffrement forcé</string>
|
||||||
<string name="keep_dm_verity">Conserver AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Conserver AVB 2.0/dm-verity</string>
|
||||||
<string name="recovery_mode">Mode Récupération</string>
|
<string name="recovery_mode">Mode récupération</string>
|
||||||
<string name="current_installed">Version actuellement installée : %1$s</string>
|
<string name="current_installed">Version actuellement installée : %1$s</string>
|
||||||
<string name="latest_version">Dernière version disponible : %1$s</string>
|
<string name="latest_version">Dernière version disponible : %1$s</string>
|
||||||
<string name="uninstall">Désinstaller</string>
|
<string name="uninstall">Désinstaller</string>
|
||||||
<string name="uninstall_magisk_title">Désinstaller Magisk</string>
|
<string name="uninstall_magisk_title">Désinstaller Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Tous les modules seront désactivés ou supprimés. Les permissions de super‐utilisateur seront perdues et vos données seront potentiellement chiffrées si elles ne le sont pas déjà.</string>
|
<string name="uninstall_magisk_msg">Tous les modules seront désactivés ou supprimés !\nL’accès super‑utiliateur sera perdu !\nVos données seront potentiellement chiffrées si elles ne le sont pas déjà.</string>
|
||||||
<string name="update">Mise à jour</string>
|
<string name="update">Mise à jour</string>
|
||||||
<string name="core_only_enabled">(Mode « sans modules » activé)</string>
|
<string name="core_only_enabled">(mode « sans modules » activé)</string>
|
||||||
|
|
||||||
<!--Module Fragment-->
|
<!--Module Fragment-->
|
||||||
<string name="no_info_provided">(aucune information transmise)</string>
|
<string name="no_info_provided">(aucune information transmise)</string>
|
||||||
<string name="no_modules_found">Aucun module trouvé.</string>
|
<string name="no_modules_found">Aucun module trouvé</string>
|
||||||
<string name="update_file_created">Le module sera mis à jour au prochain redémarrage.</string>
|
<string name="update_file_created">Le module sera mis à jour au prochain redémarrage !</string>
|
||||||
<string name="remove_file_created">Le module sera supprimé au prochain redémarrage.</string>
|
<string name="remove_file_created">Le module sera supprimé au prochain redémarrage !</string>
|
||||||
<string name="remove_file_deleted">Le module ne sera pas supprimé au prochain redémarrage.</string>
|
<string name="remove_file_deleted">Le module ne sera pas supprimé au prochain redémarrage !</string>
|
||||||
<string name="disable_file_created">Le module sera désactivé au prochain redémarrage.</string>
|
<string name="disable_file_created">Le module sera désactivé au prochain redémarrage !</string>
|
||||||
<string name="disable_file_removed">Le module sera activé au prochain redémarrage.</string>
|
<string name="disable_file_removed">Le module sera activé au prochain redémarrage !</string>
|
||||||
<string name="author">Créé par %1$s</string>
|
<string name="author">Créé par %1$s</string>
|
||||||
<string name="reboot_recovery">Redémarrer en mode récupération</string>
|
<string name="reboot_recovery">Redémarrer en mode récupération</string>
|
||||||
<string name="reboot_bootloader">Redémarrer en mode amorçage</string>
|
<string name="reboot_bootloader">Redémarrer en mode amorçage</string>
|
||||||
<string name="reboot_download">Redémarrer en mode téléchargement</string>
|
<string name="reboot_download">Redémarrer en mode téléchargement</string>
|
||||||
<string name="reboot_edl">Redémarrer en mode EDL</string>
|
<string name="reboot_edl">Redémarrer en mode secours (EDL)</string>
|
||||||
|
|
||||||
<!--Repo Fragment-->
|
<!--Repo Fragment-->
|
||||||
<string name="update_available">Mise à jour disponible</string>
|
<string name="update_available">Mise à jour disponible</string>
|
||||||
<string name="installed">Installé</string>
|
<string name="installed">Installé</string>
|
||||||
<string name="not_installed">Non installé</string>
|
<string name="not_installed">Non installé</string>
|
||||||
<string name="updated_on">Mis à jour le : %1$s</string>
|
<string name="updated_on">Mis à jour le : %1$s</string>
|
||||||
<string name="sorting_order">Mode de tri :</string>
|
<string name="sorting_order">Mode de tri</string>
|
||||||
<string name="sort_by_name">par nom</string>
|
<string name="sort_by_name">alphabétique</string>
|
||||||
<string name="sort_by_update">par date décroissante</string>
|
<string name="sort_by_update">antichronologique</string>
|
||||||
|
|
||||||
<!--Log Fragment-->
|
<!--Log Fragment-->
|
||||||
<string name="menuSaveLog">Enregistrer le journal</string>
|
<string name="menuSaveLog">Enregistrer le journal</string>
|
||||||
<string name="menuReload">Actualiser</string>
|
<string name="menuReload">Actualiser</string>
|
||||||
<string name="menuClearLog">Effacer le journal maintenant</string>
|
<string name="menuClearLog">Effacer le journal maintenant</string>
|
||||||
<string name="logs_cleared">Journal effacé avec succès.</string>
|
<string name="logs_cleared">Le journal a bien été effacé.</string>
|
||||||
|
|
||||||
<!--About Activity-->
|
<!--About Activity-->
|
||||||
<string name="app_changelog">Journal</string>
|
<string name="app_changelog">Journal des modifications</string>
|
||||||
|
|
||||||
<!-- System Components, Notifications -->
|
<!-- System Components, Notifications -->
|
||||||
<string name="update_channel">Mises à jour de Magisk</string>
|
<string name="update_channel">Mises à jour de Magisk</string>
|
||||||
<string name="progress_channel">Progression des notifications</string>
|
<string name="progress_channel">Notifications de progression</string>
|
||||||
<string name="download_complete">Téléchargement terminé</string>
|
<string name="download_complete">Téléchargement terminé</string>
|
||||||
<string name="download_file_error">Erreur de téléchargement du fichier</string>
|
<string name="download_file_error">Erreur lors du téléchargement du fichier</string>
|
||||||
<string name="download_open_parent">Afficher dans le dossier parent</string>
|
<string name="download_open_parent">Afficher le dossier parent</string>
|
||||||
<string name="download_open_self">Afficher fichier</string>
|
<string name="download_open_self">Afficher le fichier</string>
|
||||||
<string name="magisk_update_title">Une mise à jour de Magisk est disponible !</string>
|
<string name="magisk_update_title">Une mise à jour de Magisk est disponible !</string>
|
||||||
<string name="manager_update_title">Une mise à jour de Magisk Manager est disponible !</string>
|
<string name="manager_update_title">Une mise à jour de Magisk Manager est disponible !</string>
|
||||||
|
|
||||||
<!-- Installation -->
|
<!-- Installation -->
|
||||||
<string name="manager_download_install">Appuyez pour le télécharger et l’installer.</string>
|
<string name="manager_download_install">Appuyez pour le télécharger et l’installer.</string>
|
||||||
<string name="download_zip_only">Télécharger le ZIP uniquement</string>
|
<string name="download_zip_only">Télécharger le ZIP sans l’installer</string>
|
||||||
<string name="direct_install">Installation directe (recommandée)</string>
|
<string name="direct_install">Installation directe (recommandée)</string>
|
||||||
<string name="install_inactive_slot">Installer dans l’espace inactif (après mise à jour OTA)</string>
|
<string name="install_inactive_slot">Installer dans l’espace inactif (après mise à jour OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">Votre appareil sera réamorcé à partir de l’espace actuellement inactif après un redémarrage!\nN’utilisez cette option qu’uniquement après que la mise à jour OTA ait été effectuée.\nVoulez-vous continuer?</string>
|
<string name="install_inactive_slot_msg">Votre appareil sera obligatoirement réamorcé à partir de l’espace (slot) actuellement inactif après son redémarrage !\nN’utilisez cette option uniquement après que la mise à jour OTA a été effectuée.\nVoulez‑vous continuer ?</string>
|
||||||
<string name="select_method">Sélectionnez la méthode</string>
|
<string name="select_method">Sélectionnez la méthode</string>
|
||||||
<string name="setup_title">Installation additionnelle</string>
|
<string name="setup_title">Configuration supplémentaire</string>
|
||||||
<string name="select_patch_file">Sélectionner et Patcher un Fichier</string>
|
<string name="select_patch_file">Sélectionnez le fichier cible du correctif</string>
|
||||||
<string name="patch_file_msg">Sélectionnez une image brute (*.img) ou un fichier tar ODIN (*.tar)</string>
|
<string name="patch_file_msg">Sélectionnez une image brute (*.img) ou une archive TAR ODIN (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Redémarrage dans 5 secondes…</string>
|
<string name="reboot_delay_toast">Redémarrage dans 5 secondes…</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="repo_install_title">Installer %1$s</string>
|
<string name="repo_install_title">Installer %1$s</string>
|
||||||
<string name="repo_install_msg">Voulez‐vous installer %1$s maintenant ?</string>
|
<string name="repo_install_msg">Voulez‑vous installer %1$s maintenant ?</string>
|
||||||
<string name="download">Télécharger</string>
|
<string name="download">Télécharger</string>
|
||||||
<string name="reboot">Redémarrer</string>
|
<string name="reboot">Redémarrer</string>
|
||||||
<string name="settings_reboot_toast">Redémarrer afin d’appliquer les réglages.</string>
|
<string name="settings_reboot_toast">Redémarrer afin d’appliquer les paramètres</string>
|
||||||
<string name="release_notes">Notes de version</string>
|
<string name="release_notes">Notes de version</string>
|
||||||
<string name="repo_cache_cleared">Cache du dépôt effacé</string>
|
<string name="repo_cache_cleared">Cache du dépôt effacé</string>
|
||||||
|
<string name="dtbo_patched_title">L’arborescence matérielle (DTBO) a été modifiée !</string>
|
||||||
<string name="dtbo_patched_title">DTBO a été modifié !</string>
|
<string name="dtbo_patched_reboot">Magisk Manager a modifié le fichier dtbo.img. Veuillez redémarrer.</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager vient de modifier le fichier dtbo.img, veuillez redémarrer.</string>
|
<string name="flashing">Écriture dans la mémoire Flash…</string>
|
||||||
<string name="flashing">Installation</string>
|
<string name="done">Terminé !</string>
|
||||||
<string name="done">Terminé!</string>
|
<string name="failure">Erreur</string>
|
||||||
<string name="failure">Échec</string>
|
<string name="hide_manager_title">Masquer Magisk Manager…</string>
|
||||||
<string name="hide_manager_title">Masquer Magisk Manager…</string>
|
<string name="hide_manager_fail_toast">Le masquage de Magisk Manager a échoué.</string>
|
||||||
<string name="hide_manager_fail_toast">Le masquage de Magisk Manager a échoué.</string>
|
<string name="open_link_failed_toast">Aucune application permettant d’ouvrir le lien n’a été trouvée</string>
|
||||||
<string name="open_link_failed_toast">Aucune application permettant d’ouvrir le lien n’a été trouvée.</string>
|
|
||||||
<string name="warning">Avertissement</string>
|
<string name="warning">Avertissement</string>
|
||||||
<string name="complete_uninstall">Désinstallation terminée</string>
|
<string name="complete_uninstall">Désinstallation complète</string>
|
||||||
<string name="restore_img">Restauration des images</string>
|
<string name="restore_img">Restauration des images</string>
|
||||||
<string name="restore_img_msg">Restauration…</string>
|
<string name="restore_img_msg">Restauration…</string>
|
||||||
<string name="restore_done">Restauration terminée !</string>
|
<string name="restore_done">Restauration terminée !</string>
|
||||||
<string name="restore_fail">La sauvegarde par défaut n’existe pas !</string>
|
<string name="restore_fail">La sauvegarde par défaut n’existe pas !</string>
|
||||||
<string name="proprietary_title">Téléchargement de code propriétaire</string>
|
<string name="proprietary_title">Téléchargement de code propriétaire</string>
|
||||||
<string name="proprietary_notice">Magisk Manager est un logiciel libre et ne contient pas le code propriétaire de l’API SafetyNet de Google.Voulez‐vous autoriser Magisk Manager à télécharger une extension (contenant GoogleApiClient) pour les contrôles SafetyNet ?</string>
|
<string name="proprietary_notice">Magisk Manager est un logiciel libre et ne contient pas le code propriétaire de l’API SafetyNet de Google. Autorisez‑vous Magisk Manager à télécharger une extension (contenant GoogleApiClient) pour les contrôles SafetyNet ?</string>
|
||||||
<string name="setup_fail">Échec de l’installation</string>
|
<string name="setup_fail">Échec de l’installation</string>
|
||||||
<string name="env_fix_title">Installation additionnelle requise</string>
|
<string name="env_fix_title">Installation supplémentaire requise</string>
|
||||||
<string name="env_fix_msg">Votre appareil a besoin d’une configuration supplémentaire pour que Magisk fonctionne correctement. Pour cela, il est nécessaire de télécharger un fichier ZIP d’installation de Magisk. Voulez‐vous le faire maintenant ?</string>
|
<string name="env_fix_msg">Votre appareil a besoin d’une installation supplémentaire afin que Magisk fonctionne correctement. Un fichier ZIP d’installation pour Magisk devra être téléchargé. Voulez‑vous faire cette installation maintenant ?</string>
|
||||||
<string name="setup_msg">Démarrer l’installation de l’environnement…</string>
|
<string name="setup_msg">Installation de l’environnement en cours…</string>
|
||||||
|
<string name="authenticate">Authentification</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Général</string>
|
<string name="settings_general_category">Général</string>
|
||||||
<string name="settings_dark_theme_title">Thème sombre</string>
|
<string name="settings_dark_theme_title">Thème sombre</string>
|
||||||
<string name="settings_dark_theme_summary">Activer le thème sombre.</string>
|
<string name="settings_dark_theme_summary">Activer le thème sombre</string>
|
||||||
<string name="settings_download_path_title">Emplacement téléchargement</string>
|
<string name="settings_download_path_title">Répertoire de téléchargement</string>
|
||||||
<string name="settings_download_path_message">Les fichiers seront sauvegardés dans %1$s</string>
|
<string name="settings_download_path_message">Les fichiers seront sauvegardés dans %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Effacer le cache du dépôt</string>
|
<string name="settings_clear_cache_title">Effacer le cache du dépôt</string>
|
||||||
<string name="settings_clear_cache_summary">Effacer les informations de cache pour les dépôts en ligne. Cela force l’application à récupérer ses informations en ligne.</string>
|
<string name="settings_clear_cache_summary">Effacer les informations en cache concerant les dépôts en ligne. Ceci force l’application à télécharger des informations à jour.</string>
|
||||||
<string name="settings_hide_manager_title">Masquer Magisk Manager</string>
|
<string name="settings_hide_manager_title">Masquer Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Réempaqueter Magisk Manager avec un nom de paquet aléatoire.</string>
|
<string name="settings_hide_manager_summary">Réempaqueter Magisk Manager avec des noms de paquet et d’application aléatoires.</string>
|
||||||
<string name="settings_restore_manager_title">Restaurer Magisk Manager</string>
|
<string name="settings_restore_manager_title">Restaurer Magisk Manager</string>
|
||||||
<string name="settings_restore_manager_summary">Restaurer Magisk Manager avec son nom de paquet d’origine</string>
|
<string name="settings_restore_manager_summary">Restaurer Magisk Manager avec ses noms de paquet et d’application d’origine</string>
|
||||||
<string name="language">Langue</string>
|
<string name="language">Langue</string>
|
||||||
<string name="system_default">(système par défaut)</string>
|
<string name="system_default">(langue par défaut du système)</string>
|
||||||
<string name="settings_update">Mise à jour des réglages</string>
|
<string name="settings_update">Paramètres de mise à jour</string>
|
||||||
<string name="settings_check_update_title">Vérification des mises à jour</string>
|
<string name="settings_check_update_title">Vérifier les mises à jour</string>
|
||||||
<string name="settings_check_update_summary">Vérifier périodiquement en tâche de fond l’existence d’une mise à jour.</string>
|
<string name="settings_check_update_summary">Vérifier périodiquement en tâche de fond l’existence d’une mise à jour</string>
|
||||||
<string name="settings_update_channel_title">Canal de mise à jour</string>
|
<string name="settings_update_channel_title">Canal de mise à jour</string>
|
||||||
<string name="settings_update_stable">Stable</string>
|
<string name="settings_update_stable">Stable</string>
|
||||||
<string name="settings_update_beta">Bêta</string>
|
<string name="settings_update_beta">Bêta</string>
|
||||||
<string name="settings_update_custom">Personnalisé</string>
|
<string name="settings_update_custom">Personnalisé</string>
|
||||||
<string name="settings_update_custom_msg">Insérez une URL personnalisée</string>
|
<string name="settings_update_custom_msg">Saisissez une URL personnalisée</string>
|
||||||
<string name="settings_core_only_title">Mode Magisk Core uniquement</string>
|
<string name="settings_core_only_title">Mode « sans modules » uniquement</string>
|
||||||
<string name="settings_core_only_summary">Active uniquement les fonctionnalités de base. MagiskSU et MagiskHide resteront activés, mais aucun module ne sera chargé. </string>
|
<string name="settings_core_only_summary">Activer uniquement les fonctionnalités de base. MagiskSU et MagiskHide resteront activés, mais aucun module ne sera chargé.</string>
|
||||||
<string name="settings_magiskhide_summary">Rendre Magisk invisible à diverses formes de détection.</string>
|
<string name="settings_magiskhide_summary">Rendre Magisk invisible à diverses formes de détection.</string>
|
||||||
<string name="settings_hosts_title">Fichier hosts sans système</string>
|
<string name="settings_hosts_title">Fichier hosts hors partition système</string>
|
||||||
<string name="settings_hosts_summary">Prise en charge du fichier hosts sans système pour les applications de type AdBlock.</string>
|
<string name="settings_hosts_summary">Utilisation d’un fichier hosts hors de la partition système pour les applications de blocage de publicité.</string>
|
||||||
<string name="settings_hosts_toast">Ajout d’un module hosts sans système</string>
|
<string name="settings_hosts_toast">Ajout d’un module pour fichier hosts hors système</string>
|
||||||
<string name="settings_app_name">Taper le nom de l\'application désirée</string>
|
|
||||||
|
<string name="settings_app_name">Saisissez le nom de l’application désiré</string>
|
||||||
<string name="settings_app_name_hint">Nouveau nom</string>
|
<string name="settings_app_name_hint">Nouveau nom</string>
|
||||||
<string name="settings_app_name_helper">L\'application sera réempacter sous ce nom</string>
|
<string name="settings_app_name_helper">L’application sera réempaquetée sous ce nom</string>
|
||||||
<string name="settings_app_name_error">Format invalide</string>
|
<string name="settings_app_name_error">Format incorrect</string>
|
||||||
<string name="settings_su_app_adb">Applications et ADB</string>
|
<string name="settings_su_app_adb">Applications et ADB</string>
|
||||||
<string name="settings_su_app">Applications uniquement</string>
|
<string name="settings_su_app">Applications uniquement</string>
|
||||||
<string name="settings_su_adb">ADB uniquement</string>
|
<string name="settings_su_adb">ADB uniquement</string>
|
||||||
<string name="settings_su_disable">Désactivé</string>
|
<string name="settings_su_disable">Désactivé</string>
|
||||||
<string name="settings_su_request_10">10 secondes</string>
|
<string name="settings_su_request_10">10 secondes</string>
|
||||||
<string name="settings_su_request_15">15 secondes</string>
|
<string name="settings_su_request_15">15 secondes</string>
|
||||||
<string name="settings_su_request_20">20 secondes</string>
|
<string name="settings_su_request_20">20 secondes</string>
|
||||||
<string name="settings_su_request_30">30 secondes</string>
|
<string name="settings_su_request_30">30 secondes</string>
|
||||||
<string name="settings_su_request_45">45 secondes</string>
|
<string name="settings_su_request_45">45 secondes</string>
|
||||||
<string name="settings_su_request_60">60 secondes</string>
|
<string name="settings_su_request_60">60 secondes</string>
|
||||||
<string name="superuser_access">Accès super‐utilisateur</string>
|
<string name="superuser_access">Accès super‑utilisateur</string>
|
||||||
<string name="auto_response">Réponse automatique</string>
|
<string name="auto_response">Réponse automatique</string>
|
||||||
<string name="request_timeout">Délai d’expiration de la demande</string>
|
<string name="request_timeout">Délai d’expiration de la demande</string>
|
||||||
<string name="superuser_notification">Notification super‐utilisateur</string>
|
<string name="superuser_notification">Notification super‑utilisateur</string>
|
||||||
<string name="request_timeout_summary">%1$d secondes</string>
|
<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_title">S’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_reauth_summary">Redemander une authentification pour autoriser l’accès en 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_biometric_title">Activer l’authentification biométrique</string>
|
||||||
<string name="settings_su_fingerprint_summary">Utiliser le lecteur d’empreintes digitales pour autoriser les demandes super‐utilisateur</string>
|
<string name="settings_su_biometric_summary">Utiliser l’authentification biométrique pour autoriser les accès en super‑utilisateur</string>
|
||||||
<string name="auth_fingerprint">Authentifier l’empreinte digitale</string>
|
<string name="no_biometric">L’appareil n’est pas pris en charge ou alors aucun paramètre biométrique n’est activé</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mode multi‐utilisateur</string>
|
<string name="multiuser_mode">Mode multi‑utilisateur</string>
|
||||||
<string name="settings_owner_only">Propriétaire de l’appareil uniquement</string>
|
<string name="settings_owner_only">Propriétaire de l’appareil uniquement</string>
|
||||||
<string name="settings_owner_manage">Géré par le propriétaire de l’appareil</string>
|
<string name="settings_owner_manage">Géré par le propriétaire de l’appareil</string>
|
||||||
<string name="settings_user_independent">Indépendant de l’utilisateur</string>
|
<string name="settings_user_independent">Indépendant de l’utilisateur</string>
|
||||||
<string name="owner_only_summary">Seul le propriétaire a un accès super‐utilisateur.</string>
|
<string name="owner_only_summary">Seul le propriétaire possède un accès super‑utilisateur.</string>
|
||||||
<string name="owner_manage_summary">Seul le propriétaire peut gérer l’accès super‐utilisateur et recevoir les demandes de requêtes.</string>
|
<string name="owner_manage_summary">Seul le propriétaire peut gérer l’accès super‑utilisateur et recevoir les demandes d’accès.</string>
|
||||||
<string name="user_indepenent_summary">Chaque utilisateur a ses propres règles super‐utilisateur séparées.</string>
|
<string name="user_indepenent_summary">Chaque utilisateur a ses propres règles d’accès super‑utilisateur séparées.</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Mode d’espace de noms du montage</string>
|
<string name="mount_namespace_mode">Mode d’espace de noms du montage</string>
|
||||||
<string name="settings_ns_global">Espace de noms global</string>
|
<string name="settings_ns_global">Espace de noms global</string>
|
||||||
<string name="settings_ns_requester">Hériter de l’espace de noms</string>
|
<string name="settings_ns_requester">Hériter de l’espace de noms</string>
|
||||||
<string name="settings_ns_isolate">Espace de noms isolé</string>
|
<string name="settings_ns_isolate">Espace de noms isolé</string>
|
||||||
<string name="global_summary">Toutes les sessions super‐utilisateur utilisent l’espace de noms global du montage.</string>
|
<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="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="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. Ce dernier doit être accessible depuis le répertoire racine du stockage et ne doit pas être un fichier.</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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Requête super‐utilisateur</string>
|
<string name="su_request_title">Demande d’accès super‑utilisateur</string>
|
||||||
<string name="deny">Refuser</string>
|
<string name="deny">Refuser</string>
|
||||||
<string name="prompt">Demander</string>
|
<string name="prompt">Demander</string>
|
||||||
<string name="grant">Accepter</string>
|
<string name="grant">Accepter</string>
|
||||||
<string name="su_warning">Autoriser l’accès complet à votre appareil.\nRefusez si vous n’êtes pas sûr !</string>
|
<string name="su_warning">Autoriser l’accès complet à votre appareil.\nRefusez si vous n’êtes pas sûr(e) !</string>
|
||||||
<string name="forever">Toujours</string>
|
<string name="forever">Toujours</string>
|
||||||
<string name="once">Une fois</string>
|
<string name="once">Une fois</string>
|
||||||
<string name="tenmin">10 min</string>
|
<string name="tenmin">10 min</string>
|
||||||
<string name="twentymin">20 min</string>
|
<string name="twentymin">20 min</string>
|
||||||
<string name="thirtymin">30 min</string>
|
<string name="thirtymin">30 min</string>
|
||||||
<string name="sixtymin">60 min</string>
|
<string name="sixtymin">60 min</string>
|
||||||
<string name="su_allow_toast">%1$s a obtenu les droits super‐utilisateur</string>
|
<string name="su_allow_toast">%1$s a obtenu les droits de super‑utilisateur</string>
|
||||||
<string name="su_deny_toast">%1$s n’a pas obtenu les droits super‐utilisateur</string>
|
<string name="su_deny_toast">%1$s s’est vu refuser les droits de super‑utilisateur</string>
|
||||||
<string name="no_apps_found">Aucune application trouvée</string>
|
<string name="no_apps_found">Aucune application trouvée</string>
|
||||||
<string name="su_snack_grant">Les droits super‐utilisateur de %1$s sont accordés</string>
|
<string name="su_snack_grant">Les droits de super‑utilisateur sont accordés à %1$s</string>
|
||||||
<string name="su_snack_deny">Les droits super‐utilisateur de %1$s sont refusés</string>
|
<string name="su_snack_deny">Les droits de super‑utilisateur sont refusés à %1$s</string>
|
||||||
<string name="su_snack_notif_on">Les notifications pour %1$s sont activées</string>
|
<string name="su_snack_notif_on">Les notifications sont activées pour %1$s</string>
|
||||||
<string name="su_snack_notif_off">Les notifications pour %1$s sont désactivées</string>
|
<string name="su_snack_notif_off">Les notifications sont désactivées pour %1$s</string>
|
||||||
<string name="su_snack_log_on">La journalisation pour %1$s est activée</string>
|
<string name="su_snack_log_on">La journalisation est activée pour %1$s</string>
|
||||||
<string name="su_snack_log_off">La journalisation pour %1$s est désactivée</string>
|
<string name="su_snack_log_off">La journalisation est désactivée pour %1$s</string>
|
||||||
<string name="su_revoke_title">Annuler ?</string>
|
<string name="su_revoke_title">Révoquer ?</string>
|
||||||
<string name="su_revoke_msg">Confirmez‐vous l’annulation des droits pour %1$s ?</string>
|
<string name="su_revoke_msg">Confirmez‑vous la révocation des droits accordés à %1$s ?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Aucun</string>
|
<string name="none">Aucun</string>
|
||||||
<string name="auth_fail">Échec de l’authentification</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID : %1$d</string>
|
<string name="pid">PID : %1$d</string>
|
||||||
<string name="target_uid">UID cible : %1$d</string>
|
<string name="target_uid">UID cible : %1$d</string>
|
||||||
<string name="command">Commande : %1$s</string>
|
<string name="command">Commande : %1$s</string>
|
||||||
|
|
||||||
<!-- MagiskHide -->
|
<!-- MagiskHide -->
|
||||||
<string name="show_system_app">Afficher les applications système</string>
|
<string name="show_system_app">Afficher les applications système</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">सेटिंग्स</string>
|
<string name="settings">सेटिंग्स</string>
|
||||||
<string name="install">स्थापित करें</string>
|
<string name="install">स्थापित करें</string>
|
||||||
<string name="unsupport_magisk_title">असमर्थित Magisk संस्करण</string>
|
<string name="unsupport_magisk_title">असमर्थित Magisk संस्करण</string>
|
||||||
<string name="unsupport_magisk_message">Magisk Manager का यह संस्करण Magisk के v18.0 संस्करण से कम का समर्थन नहीं करता है.\n\nआप या तो खुद से Magisk को अपग्रेड करें, या फिर एप्लीकेशन को पुराने संस्करण पे डाउनग्रेड करें .</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk स्थापित नहीं है</string>
|
<string name="magisk_version_error">Magisk स्थापित नहीं है</string>
|
||||||
@@ -163,9 +162,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d सेकंड्स</string>
|
<string name="request_timeout_summary">%1$d सेकंड्स</string>
|
||||||
<string name="settings_su_reauth_title">अपग्रेड के बाद फिर से प्रमाणित करें</string>
|
<string name="settings_su_reauth_title">अपग्रेड के बाद फिर से प्रमाणित करें</string>
|
||||||
<string name="settings_su_reauth_summary">एप्लीकेशन अपग्रेड होने के बाद उत्तम उपयोगकर्ता की अनुमतियों को फिर से प्रमाणित करें</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="multiuser_mode">बहु उपयोगकर्ता मोड</string>
|
||||||
<string name="settings_owner_only">केवल डिवाइस का मालिक</string>
|
<string name="settings_owner_only">केवल डिवाइस का मालिक</string>
|
||||||
@@ -182,7 +178,6 @@
|
|||||||
<string name="global_summary">सभी रूट सत्र वैश्विक माउंट नेमस्पेस का उपयोग करते हैं.</string>
|
<string name="global_summary">सभी रूट सत्र वैश्विक माउंट नेमस्पेस का उपयोग करते हैं.</string>
|
||||||
<string name="requester_summary">रूट सत्रों को उनके अनुरोधकर्ताओं के नेमस्पेस विरासत में मिलेंगे.</string>
|
<string name="requester_summary">रूट सत्रों को उनके अनुरोधकर्ताओं के नेमस्पेस विरासत में मिलेंगे.</string>
|
||||||
<string name="isolate_summary">प्रत्येक रूट सत्र का अपना अलग नेमस्पेस होगा.</string>
|
<string name="isolate_summary">प्रत्येक रूट सत्र का अपना अलग नेमस्पेस होगा.</string>
|
||||||
<string name="disable_fingerprint">कोई फ़िंगरप्रिंट नहीं सेट किया गया या डिवाइस का समर्थन नहीं है.</string>
|
|
||||||
<string name="settings_download_path_error">फोल्डर बनाने में त्रुटि. यह स्टोरेज रूट डायरेक्टरी से एक्सेस होना चाहिए और फाइल नहीं होना चाहिए.</string>
|
<string name="settings_download_path_error">फोल्डर बनाने में त्रुटि. यह स्टोरेज रूट डायरेक्टरी से एक्सेस होना चाहिए और फाइल नहीं होना चाहिए.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
@@ -210,7 +205,6 @@
|
|||||||
<string name="su_revoke_msg">%1$s के अधिकारों को वापस लेने की पुष्टि करें?</string>
|
<string name="su_revoke_msg">%1$s के अधिकारों को वापस लेने की पुष्टि करें?</string>
|
||||||
<string name="toast">पॉप-अप नोट</string>
|
<string name="toast">पॉप-अप नोट</string>
|
||||||
<string name="none">कोई नहीं</string>
|
<string name="none">कोई नहीं</string>
|
||||||
<string name="auth_fail">प्रमाणीकरण विफल हुआ</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<string name="settings">Setelan</string>
|
<string name="settings">Setelan</string>
|
||||||
<string name="install">Pasang</string>
|
<string name="install">Pasang</string>
|
||||||
<string name="unsupport_magisk_title">Versi Magisk Tidak Didukung</string>
|
<string name="unsupport_magisk_title">Versi Magisk Tidak Didukung</string>
|
||||||
<string name="unsupport_magisk_message">Magisk Manager versi ini tidak mendukung versi Magisk di bawah v18.0.\n\nAnda dapat memperbarui Magisk secara manual, atau menurunkan aplikasi ke versi sebelumnya.</string>
|
<string name="unsupport_magisk_msg">Magisk Manager versi ini tidak mendukung versi Magisk di bawah %1$s.\n\nAplikasi akan bertingkah seperti tidak ada Magisk terpasang, silakan perbarui Magisk sesegera mungkin.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk tidak terpasang.</string>
|
<string name="magisk_version_error">Magisk tidak terpasang.</string>
|
||||||
@@ -17,17 +17,18 @@
|
|||||||
<string name="checking_safetyNet_status">Memeriksa status SafetyNet…</string>
|
<string name="checking_safetyNet_status">Memeriksa status SafetyNet…</string>
|
||||||
<string name="safetyNet_check_success">Pemeriksaan SafetyNet Berhasil</string>
|
<string name="safetyNet_check_success">Pemeriksaan SafetyNet Berhasil</string>
|
||||||
<string name="safetyNet_api_error">Kesalahan pada API SafetyNet</string>
|
<string name="safetyNet_api_error">Kesalahan pada API SafetyNet</string>
|
||||||
<string name="safetyNet_res_invalid">Tanggapan tidak valid.</string>
|
<string name="safetyNet_res_invalid">Tanggapan tidak valid</string>
|
||||||
<string name="magisk_up_to_date">Magisk dalam versi terbaru</string>
|
<string name="magisk_up_to_date">Magisk dalam versi terbaru</string>
|
||||||
<string name="manager_up_to_date">Magisk Manager dalam versi terbaru</string>
|
<string name="manager_up_to_date">Magisk Manager dalam versi terbaru</string>
|
||||||
<string name="advanced_settings_title">Opsi Lanjutan</string>
|
<string name="advanced_settings_title">Opsi Lanjutan</string>
|
||||||
<string name="keep_force_encryption">Pertahankan enkripsi paksa</string>
|
<string name="keep_force_encryption">Pertahankan enkripsi paksa</string>
|
||||||
<string name="keep_dm_verity">Pertahankan AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Pertahankan AVB 2.0/dm-verity</string>
|
||||||
|
<string name="recovery_mode">Mode Pemulihan</string>
|
||||||
<string name="current_installed">Terpasang: %1$s</string>
|
<string name="current_installed">Terpasang: %1$s</string>
|
||||||
<string name="latest_version">Terbaru: %1$s</string>
|
<string name="latest_version">Terbaru: %1$s</string>
|
||||||
<string name="uninstall">Copot</string>
|
<string name="uninstall">Copot</string>
|
||||||
<string name="uninstall_magisk_title">Copot Magisk</string>
|
<string name="uninstall_magisk_title">Copot Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Semua modul akan dinonaktifkan/dihapus. Root akan dihapus, dan berpotensi mengenkripsi data Anda jika belum.</string>
|
<string name="uninstall_magisk_msg">Semua modul akan dinonaktifkan/dihapus!\nRoot akan dihapus!\nData Anda berpotensi terenkripsi jika belum!</string>
|
||||||
<string name="update">Perbarui</string>
|
<string name="update">Perbarui</string>
|
||||||
<string name="core_only_enabled">(Mode core only aktif)</string>
|
<string name="core_only_enabled">(Mode core only aktif)</string>
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@
|
|||||||
<string name="manager_update_title">Pembaruan Magisk Manager Tersedia!</string>
|
<string name="manager_update_title">Pembaruan Magisk Manager Tersedia!</string>
|
||||||
|
|
||||||
<!--Installation-->
|
<!--Installation-->
|
||||||
<string name="manager_download_install">Tekan untuk unduh dan pasang.</string>
|
<string name="manager_download_install">Tekan untuk unduh dan pasang</string>
|
||||||
<string name="download_zip_only">Unduh Zip Saja</string>
|
<string name="download_zip_only">Unduh Zip Saja</string>
|
||||||
<string name="direct_install">Pasang Langsung (Direkomendasikan)</string>
|
<string name="direct_install">Pasang Langsung (Direkomendasikan)</string>
|
||||||
<string name="install_inactive_slot">Pasang ke Slot Nonaktif (Setelah OTA)</string>
|
<string name="install_inactive_slot">Pasang ke Slot Nonaktif (Setelah OTA)</string>
|
||||||
@@ -90,7 +91,7 @@
|
|||||||
<string name="repo_install_msg">Apakah Anda ingin memasang %1$s sekarang?</string>
|
<string name="repo_install_msg">Apakah Anda ingin memasang %1$s sekarang?</string>
|
||||||
<string name="download">Unduh</string>
|
<string name="download">Unduh</string>
|
||||||
<string name="reboot">Reboot</string>
|
<string name="reboot">Reboot</string>
|
||||||
<string name="settings_reboot_toast">Reboot untuk menerapkan perubahan.</string>
|
<string name="settings_reboot_toast">Reboot untuk menerapkan perubahan</string>
|
||||||
<string name="release_notes">Catatan rilis</string>
|
<string name="release_notes">Catatan rilis</string>
|
||||||
<string name="repo_cache_cleared">Cache repo dibersihkan</string>
|
<string name="repo_cache_cleared">Cache repo dibersihkan</string>
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@
|
|||||||
<string name="failure">Gagal</string>
|
<string name="failure">Gagal</string>
|
||||||
<string name="hide_manager_title">Menyembunyikan Magisk Manager…</string>
|
<string name="hide_manager_title">Menyembunyikan Magisk Manager…</string>
|
||||||
<string name="hide_manager_fail_toast">Kesalahan menyembunyikan Magisk Manager.</string>
|
<string name="hide_manager_fail_toast">Kesalahan menyembunyikan Magisk Manager.</string>
|
||||||
<string name="open_link_failed_toast">Tidak ada aplikasi ditemukan untuk membuka tautan.</string>
|
<string name="open_link_failed_toast">Tidak ada aplikasi ditemukan untuk membuka tautan</string>
|
||||||
<string name="warning">Peringatan</string>
|
<string name="warning">Peringatan</string>
|
||||||
<string name="complete_uninstall">Copot Total</string>
|
<string name="complete_uninstall">Copot Total</string>
|
||||||
<string name="restore_img">Pulihkan Image</string>
|
<string name="restore_img">Pulihkan Image</string>
|
||||||
@@ -110,28 +111,29 @@
|
|||||||
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
||||||
<string name="proprietary_title">Unduh Kode Proprieter</string>
|
<string name="proprietary_title">Unduh Kode Proprieter</string>
|
||||||
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak menyertakan kode API proprieter Google SafetyNet.\n\nAkankah Anda mengizinkan Magisk Manager untuk mengunduh sebuah ekstensi (berisi GoogleApiClient) untuk pemeriksaan SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak menyertakan kode API proprieter Google SafetyNet.\n\nAkankah Anda mengizinkan Magisk Manager untuk mengunduh sebuah ekstensi (berisi GoogleApiClient) untuk pemeriksaan SafetyNet?</string>
|
||||||
<string name="setup_fail">Penyiapan gagal.</string>
|
<string name="setup_fail">Penyiapan gagal</string>
|
||||||
<string name="env_fix_title">Memerlukan Penyiapan Tambahan</string>
|
<string name="env_fix_title">Memerlukan Penyiapan Tambahan</string>
|
||||||
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan untuk Magisk dapat bekerja dengan baik. Ia akan mengunduh zip penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan untuk Magisk dapat bekerja dengan baik. Ia akan mengunduh zip penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
||||||
<string name="setup_msg">Menjalankan penyiapan lingkungan…</string>
|
<string name="setup_msg">Menjalankan penyiapan lingkungan…</string>
|
||||||
|
<string name="authenticate">Otentikasi</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Umum</string>
|
<string name="settings_general_category">Umum</string>
|
||||||
<string name="settings_dark_theme_title">Tema Gelap</string>
|
<string name="settings_dark_theme_title">Tema Gelap</string>
|
||||||
<string name="settings_dark_theme_summary">Aktifkan tema gelap.</string>
|
<string name="settings_dark_theme_summary">Aktifkan tema gelap</string>
|
||||||
<string name="settings_download_path_title">Lokasi unduhan</string>
|
<string name="settings_download_path_title">Lokasi unduhan</string>
|
||||||
<string name="settings_download_path_message">File akan disimpan ke %1$s</string>
|
<string name="settings_download_path_message">File akan disimpan ke %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Bersihkan Cache Repo</string>
|
<string name="settings_clear_cache_title">Bersihkan Cache Repo</string>
|
||||||
<string name="settings_clear_cache_summary">Bersihkan informasi ter-cache untuk repo online. Ini memaksa apl untuk menyegarkan secara online.</string>
|
<string name="settings_clear_cache_summary">Bersihkan informasi ter-cache untuk repo online. Ini memaksa apl untuk menyegarkan secara online</string>
|
||||||
<string name="settings_hide_manager_title">Sembunyikan Magisk Manager</string>
|
<string name="settings_hide_manager_title">Sembunyikan Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Pak ulang Magisk Manager dengan nama paket acak.</string>
|
<string name="settings_hide_manager_summary">Pak ulang Magisk Manager dengan nama paket dan apl acak</string>
|
||||||
<string name="settings_restore_manager_title">Pulihkan Magisk Manager</string>
|
<string name="settings_restore_manager_title">Pulihkan Magisk Manager</string>
|
||||||
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan paket asli</string>
|
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan paket dan nama asli</string>
|
||||||
<string name="language">Bahasa</string>
|
<string name="language">Bahasa</string>
|
||||||
<string name="system_default">(Default Sistem)</string>
|
<string name="system_default">(Default Sistem)</string>
|
||||||
<string name="settings_update">Setelan Pembaruan</string>
|
<string name="settings_update">Setelan Pembaruan</string>
|
||||||
<string name="settings_check_update_title">Periksa Pembaruan</string>
|
<string name="settings_check_update_title">Periksa Pembaruan</string>
|
||||||
<string name="settings_check_update_summary">Secara periodik memeriksa pembaruan di latar belakang.</string>
|
<string name="settings_check_update_summary">Secara periodik memeriksa pembaruan di latar belakang</string>
|
||||||
<string name="settings_update_channel_title">Kanal Pembaruan</string>
|
<string name="settings_update_channel_title">Kanal Pembaruan</string>
|
||||||
<string name="settings_update_stable">Stabil</string>
|
<string name="settings_update_stable">Stabil</string>
|
||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
@@ -139,11 +141,15 @@
|
|||||||
<string name="settings_update_custom_msg">Masukkan sebuah URL kustom</string>
|
<string name="settings_update_custom_msg">Masukkan sebuah URL kustom</string>
|
||||||
<string name="settings_core_only_title">Magisk Mode Core Only</string>
|
<string name="settings_core_only_title">Magisk Mode Core Only</string>
|
||||||
<string name="settings_core_only_summary">Aktifkan fitur inti saja. MagiskSU dan MagiskHide akan tetap diaktifkan</string>
|
<string name="settings_core_only_summary">Aktifkan fitur inti saja. MagiskSU dan MagiskHide akan tetap diaktifkan</string>
|
||||||
<string name="settings_magiskhide_summary">Sembunyikan Magisk dari berbagai bentuk pendeteksian.</string>
|
<string name="settings_magiskhide_summary">Sembunyikan Magisk dari berbagai bentuk pendeteksian</string>
|
||||||
<string name="settings_hosts_title">Host tanpa sistem</string>
|
<string name="settings_hosts_title">Host tanpa sistem</string>
|
||||||
<string name="settings_hosts_summary">Dukungan host tanpa sistem untuk apl pemblokir iklan.</string>
|
<string name="settings_hosts_summary">Dukungan host tanpa sistem untuk apl pemblokir iklan</string>
|
||||||
<string name="settings_hosts_toast">Ditambahkan modul host tanpa sistem</string>
|
<string name="settings_hosts_toast">Ditambahkan modul host tanpa sistem</string>
|
||||||
|
|
||||||
|
<string name="settings_app_name">Ketik nama apl yang diinginkan</string>
|
||||||
|
<string name="settings_app_name_hint">Nama baru</string>
|
||||||
|
<string name="settings_app_name_helper">Apl akan dipak ulang ke nama ini</string>
|
||||||
|
<string name="settings_app_name_error">Format tidak valid</string>
|
||||||
<string name="settings_su_app_adb">Apl dan ADB</string>
|
<string name="settings_su_app_adb">Apl dan ADB</string>
|
||||||
<string name="settings_su_app">Apl saja</string>
|
<string name="settings_su_app">Apl saja</string>
|
||||||
<string name="settings_su_adb">ADB saja</string>
|
<string name="settings_su_adb">ADB saja</string>
|
||||||
@@ -161,26 +167,25 @@
|
|||||||
<string name="request_timeout_summary">%1$d detik</string>
|
<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_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_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_biometric_title">Aktifkan Otentikasi Biometrik</string>
|
||||||
<string name="settings_su_fingerprint_summary">Gunakan pemindai sidik jari untuk mengizinkan permintaan superuser</string>
|
<string name="settings_su_biometric_summary">Gunakan otentikasi biometrik untuk mengizinkan permintaan superuser</string>
|
||||||
<string name="auth_fingerprint">Otentikasi Sidik Jari</string>
|
<string name="no_biometric">Perangkat tidak didukung atau tidak ada opsi biometrik yang diaktifkan</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mode Multipengguna</string>
|
<string name="multiuser_mode">Mode Multipengguna</string>
|
||||||
<string name="settings_owner_only">Pemilik Perangkat Saja</string>
|
<string name="settings_owner_only">Pemilik Perangkat Saja</string>
|
||||||
<string name="settings_owner_manage">Pemilik Perangkat Mengelola</string>
|
<string name="settings_owner_manage">Pemilik Perangkat Mengelola</string>
|
||||||
<string name="settings_user_independent">Pengguna-Independen</string>
|
<string name="settings_user_independent">Pengguna-Independen</string>
|
||||||
<string name="owner_only_summary">Hanya pemilik yang memiliki akses root.</string>
|
<string name="owner_only_summary">Hanya pemilik yang memiliki akses root</string>
|
||||||
<string name="owner_manage_summary">Hanya pemilik yang dapat mengelola akses root dan menerima permintaan.</string>
|
<string name="owner_manage_summary">Hanya pemilik yang dapat mengelola akses root dan menerima permintaan</string>
|
||||||
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri.</string>
|
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root-nya sendiri</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Mode Mount Ruang Nama</string>
|
<string name="mount_namespace_mode">Mode Mount Ruang Nama</string>
|
||||||
<string name="settings_ns_global">Ruang Nama Global</string>
|
<string name="settings_ns_global">Ruang Nama Global</string>
|
||||||
<string name="settings_ns_requester">Ruang Nama Warisan</string>
|
<string name="settings_ns_requester">Ruang Nama Warisan</string>
|
||||||
<string name="settings_ns_isolate">Ruang Nama Terisolasi</string>
|
<string name="settings_ns_isolate">Ruang Nama Terisolasi</string>
|
||||||
<string name="global_summary">Semua sesi root menggunakan mount ruang nama global.</string>
|
<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="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="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>
|
<string name="settings_download_path_error">Kesalahan membuat folder. Folder harus dapat diakses dari direktori penyimpanan root dan bukan merupakan file.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
@@ -208,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">Konfirmasi untuk mencabut akses %1$s?</string>
|
<string name="su_revoke_msg">Konfirmasi untuk mencabut akses %1$s?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Tidak ada</string>
|
<string name="none">Tidak ada</string>
|
||||||
<string name="auth_fail">Otentikasi Gagal</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Impostazioni</string>
|
<string name="settings">Impostazioni</string>
|
||||||
<string name="install">Installa</string>
|
<string name="install">Installa</string>
|
||||||
<string name="unsupport_magisk_title">Versione di Magisk non supportata</string>
|
<string name="unsupport_magisk_title">Versione di Magisk non supportata</string>
|
||||||
<string name="unsupport_magisk_message">Questa versione di Magisk Manager non supporta versioni di Magisk inferiori alla v18.0.\n\nPuoi aggiornare manualmente Magisk o tornare a una versione meno recente dell\'app.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk non è installato.</string>
|
<string name="magisk_version_error">Magisk non è installato.</string>
|
||||||
@@ -165,9 +164,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d secondi</string>
|
<string name="request_timeout_summary">%1$d secondi</string>
|
||||||
<string name="settings_su_reauth_title">Riautentica dopo aggiornamento</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_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="multiuser_mode">Modalità multiutente</string>
|
||||||
<string name="settings_owner_only">Solo proprietario del dispositivo</string>
|
<string name="settings_owner_only">Solo proprietario del dispositivo</string>
|
||||||
@@ -184,7 +180,6 @@
|
|||||||
<string name="global_summary">Tutte le sessioni di root erediteranno il namespace globale</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -212,7 +207,6 @@
|
|||||||
<string name="su_revoke_msg">Confermi la revoca dei diritti di %1$s?</string>
|
<string name="su_revoke_msg">Confermi la revoca dei diritti di %1$s?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Nessuno</string>
|
<string name="none">Nessuno</string>
|
||||||
<string name="auth_fail">Autenticatione fallita</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">設定</string>
|
<string name="settings">設定</string>
|
||||||
<string name="install">インストール</string>
|
<string name="install">インストール</string>
|
||||||
<string name="unsupport_magisk_title">対応していないMagiskバージョン</string>
|
<string name="unsupport_magisk_title">対応していないMagiskバージョン</string>
|
||||||
<string name="unsupport_magisk_message">このバージョンのMagisk ManagerはMagisk v18.0以下には対応していません。\n\n手動でMagiskを更新するか、または古いバージョンのMagisk Managerをインストールしてください。</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magiskがインストールされていません</string>
|
<string name="magisk_version_error">Magiskがインストールされていません</string>
|
||||||
@@ -149,9 +148,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d秒</string>
|
<string name="request_timeout_summary">%1$d秒</string>
|
||||||
<string name="settings_su_reauth_title">アップグレード後の再認証</string>
|
<string name="settings_su_reauth_title">アップグレード後の再認証</string>
|
||||||
<string name="settings_su_reauth_summary">アプリのアップグレード後にスーパーユーザー権限を再認証します</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="multiuser_mode">マルチユーザーモード</string>
|
||||||
<string name="settings_owner_only">端末の管理者のみ</string>
|
<string name="settings_owner_only">端末の管理者のみ</string>
|
||||||
@@ -168,7 +164,6 @@
|
|||||||
<string name="global_summary">すべてのrootセッションがグローバル名前空間を使用します</string>
|
<string name="global_summary">すべてのrootセッションがグローバル名前空間を使用します</string>
|
||||||
<string name="requester_summary">rootセッションはリクエスト者の名前空間を継承します</string>
|
<string name="requester_summary">rootセッションはリクエスト者の名前空間を継承します</string>
|
||||||
<string name="isolate_summary">rootセッション毎に分離された名前空間を使用します</string>
|
<string name="isolate_summary">rootセッション毎に分離された名前空間を使用します</string>
|
||||||
<string name="disable_fingerprint">指紋が登録されていないか、お使いの端末でサポートされていません。</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">スーパーユーザーリクエスト</string>
|
<string name="su_request_title">スーパーユーザーリクエスト</string>
|
||||||
@@ -195,7 +190,6 @@
|
|||||||
<string name="su_revoke_msg">%1$s の権限を取り消しますか?</string>
|
<string name="su_revoke_msg">%1$s の権限を取り消しますか?</string>
|
||||||
<string name="toast">トースト通知</string>
|
<string name="toast">トースト通知</string>
|
||||||
<string name="none">なし</string>
|
<string name="none">なし</string>
|
||||||
<string name="auth_fail">認証に失敗しました</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">설정</string>
|
<string name="settings">설정</string>
|
||||||
<string name="install">설치</string>
|
<string name="install">설치</string>
|
||||||
<string name="unsupport_magisk_title">지원되지 않는 Magisk 버전</string>
|
<string name="unsupport_magisk_title">지원되지 않는 Magisk 버전</string>
|
||||||
<string name="unsupport_magisk_message">이 버전의 Magisk Manager는 v18.0보다 낮은 버전의 Magisk를 지원하지 않습니다.\n\n직접 Magisk를 업데이트 하거나 이전 버전의 앱으로 다운그레이드하십시오..</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk가 설치되지 않음</string>
|
<string name="magisk_version_error">Magisk가 설치되지 않음</string>
|
||||||
@@ -156,9 +155,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d초</string>
|
<string name="request_timeout_summary">%1$d초</string>
|
||||||
<string name="settings_su_reauth_title">업데이트 후 재승인</string>
|
<string name="settings_su_reauth_title">업데이트 후 재승인</string>
|
||||||
<string name="settings_su_reauth_summary">앱 업데이트 후에 슈퍼유저 권한 재승인</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="multiuser_mode">다중 사용자 모드</string>
|
||||||
<string name="settings_owner_only">기기 소유자만</string>
|
<string name="settings_owner_only">기기 소유자만</string>
|
||||||
@@ -175,7 +171,6 @@
|
|||||||
<string name="global_summary">모든 루트 세션이 전역 마운트 이름공간을 사용합니다.</string>
|
<string name="global_summary">모든 루트 세션이 전역 마운트 이름공간을 사용합니다.</string>
|
||||||
<string name="requester_summary">루트 세션은 요청자의 이름공간을 상속합니다.</string>
|
<string name="requester_summary">루트 세션은 요청자의 이름공간을 상속합니다.</string>
|
||||||
<string name="isolate_summary">각각의 루트 세션은 자신만의 독립된 이름공간을 사용합니다.</string>
|
<string name="isolate_summary">각각의 루트 세션은 자신만의 독립된 이름공간을 사용합니다.</string>
|
||||||
<string name="disable_fingerprint">지문이 등록되지 않았거나 기기가 지문 인식을 지원하지 않습니다.</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">슈퍼유저 요청</string>
|
<string name="su_request_title">슈퍼유저 요청</string>
|
||||||
@@ -202,7 +197,6 @@
|
|||||||
<string name="su_revoke_msg">정말 %1$s의 권한을 취소하시겠습니까?</string>
|
<string name="su_revoke_msg">정말 %1$s의 권한을 취소하시겠습니까?</string>
|
||||||
<string name="toast">토스트</string>
|
<string name="toast">토스트</string>
|
||||||
<string name="none">없음</string>
|
<string name="none">없음</string>
|
||||||
<string name="auth_fail">인증 실패</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -137,8 +137,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekundžių</string>
|
<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_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_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="multiuser_mode">Daugialypio vartotojo režimas</string>
|
||||||
<string name="settings_owner_only">Tik įrenginio savininkas</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="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="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="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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Supervartotojo prašymas</string>
|
<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="su_revoke_msg">Neleisti %1$s naudotis supervartotojo teisėmis?</string>
|
||||||
<string name="toast">Išmesti</string>
|
<string name="toast">Išmesti</string>
|
||||||
<string name="none">Nėra</string>
|
<string name="none">Nėra</string>
|
||||||
<string name="auth_fail">Patvirtinimas žlugo</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="target_uid">Target UID: %1$d</string>
|
<string name="target_uid">Target UID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Поставки</string>
|
<string name="settings">Поставки</string>
|
||||||
<string name="install">Инсталирај</string>
|
<string name="install">Инсталирај</string>
|
||||||
<string name="unsupport_magisk_title">Неподдржана верзија на Magisk</string>
|
<string name="unsupport_magisk_title">Неподдржана верзија на Magisk</string>
|
||||||
<string name="unsupport_magisk_message">Оваа верзија на Magisk Manager не ја поддржува верзијата на Magisk пониска од v18.0.\n\nМожно е да рачно да го надградите Magisk или да ја вратите апликацијата на постара верзија.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk не е инсталиран.</string>
|
<string name="magisk_version_error">Magisk не е инсталиран.</string>
|
||||||
@@ -155,9 +154,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d секунди</string>
|
<string name="request_timeout_summary">%1$d секунди</string>
|
||||||
<string name="settings_su_reauth_title">Повторна автентикација по надградба</string>
|
<string name="settings_su_reauth_title">Повторна автентикација по надградба</string>
|
||||||
<string name="settings_su_reauth_summary">Повторна автентикација за супер-корисник дозвола по надградбата на апликацијата</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="multiuser_mode">Режим на повеќе корисници</string>
|
||||||
<string name="settings_owner_only">Само сопственикот на уредот</string>
|
<string name="settings_owner_only">Само сопственикот на уредот</string>
|
||||||
@@ -174,7 +170,6 @@
|
|||||||
<string name="global_summary">Сите рут сесии го користат глобалниот именски простор.</string>
|
<string name="global_summary">Сите рут сесии го користат глобалниот именски простор.</string>
|
||||||
<string name="requester_summary">Рут сесиите ќе го наследат именскиот простор на нивниот барател.</string>
|
<string name="requester_summary">Рут сесиите ќе го наследат именскиот простор на нивниот барател.</string>
|
||||||
<string name="isolate_summary">Секоја рут сесија ќе има свој изолиран именски простор.</string>
|
<string name="isolate_summary">Секоја рут сесија ќе има свој изолиран именски простор.</string>
|
||||||
<string name="disable_fingerprint">Нема регистрирано отпечатоци од прсти или уредот не ја поддржува оваа функција.</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Супер-корисник барање</string>
|
<string name="su_request_title">Супер-корисник барање</string>
|
||||||
@@ -201,7 +196,6 @@
|
|||||||
<string name="su_revoke_msg">Дали потврдувате анулирање на поставките за пристап на %1$s?</string>
|
<string name="su_revoke_msg">Дали потврдувате анулирање на поставките за пристап на %1$s?</string>
|
||||||
<string name="toast">Тост</string>
|
<string name="toast">Тост</string>
|
||||||
<string name="none">Ниеден</string>
|
<string name="none">Ниеден</string>
|
||||||
<string name="auth_fail">Неуспешна автентикација</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -146,9 +146,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekunder</string>
|
<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_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_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="multiuser_mode">Flerbrukermoduse</string>
|
||||||
<string name="settings_owner_only">Kun enhetens eier</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="global_summary">Alle root-økter benytter det altdekkende monteringsnavnefeltet.</string>
|
||||||
<string name="requester_summary">Root-økter vil arve forespørrerens navnefelt.</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="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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Superbruker-forespørsel</string>
|
<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="su_revoke_msg">Vil du bekrefte for å oppheve %1$s sine rettigheter?</string>
|
||||||
<string name="toast">Varselfelt</string>
|
<string name="toast">Varselfelt</string>
|
||||||
<string name="none">Ingen</string>
|
<string name="none">Ingen</string>
|
||||||
<string name="auth_fail">Autentisering mislyktes</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="target_uid">Mål-UID: %1$d</string>
|
<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="request_timeout_summary">%1$d seconden</string>
|
||||||
<string name="settings_su_reauth_title">Opnieuw verzoeken na bijwerken</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_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="multiuser_mode">Multi-gebruiker modus</string>
|
||||||
<string name="settings_owner_only">Alleen apparaateigenaar</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="global_summary">Alle rootsessies gebruiken de globale naamruimte</string>
|
||||||
<string name="requester_summary">Rootsessies verkrijgen de verzoeker\'s 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="isolate_summary">Iedere rootsessie heeft een eigen geïsoleerde naamruimte</string>
|
||||||
<string name="disable_fingerprint">Geen vingerafdrukken ingesteld, of geen apparaatondersteuning</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Superuser verzoek</string>
|
<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="su_revoke_msg">De rechten van %1$s intrekken?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Geen</string>
|
<string name="none">Geen</string>
|
||||||
<string name="auth_fail">Authenticatie mislukt</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="target_uid">Doel UID: %1$d</string>
|
<string name="target_uid">Doel UID: %1$d</string>
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<string name="settings">Ustawienia</string>
|
<string name="settings">Ustawienia</string>
|
||||||
<string name="install">Instaluj</string>
|
<string name="install">Instaluj</string>
|
||||||
<string name="unsupport_magisk_title">Nieobsługiwana Wersja Magisk</string>
|
<string name="unsupport_magisk_title">Nieobsługiwana Wersja Magisk</string>
|
||||||
<string name="unsupport_magisk_message">Ta wersja Magisk Managera nie obsługuje wersji Magisk niższej niż v18.0.\n\nMożesz albo ręcznie zaktualizować Magisk lub obniżyć w aplikacji do starszej wersji.</string>
|
<string name="unsupport_magisk_msg">Ta wersja Magisk Managera nie obsługuje wersji Magiska poniżej %1$s.\n\nZaktualizuj Magisk.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk nie jest zainstalowany.</string>
|
<string name="magisk_version_error">Magisk nie jest zainstalowany.</string>
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
<string name="advanced_settings_title">Zaawansowane Ustawienia</string>
|
<string name="advanced_settings_title">Zaawansowane Ustawienia</string>
|
||||||
<string name="keep_force_encryption">Zachowaj force encryption (wymuszenie szyfrowania)</string>
|
<string name="keep_force_encryption">Zachowaj force encryption (wymuszenie szyfrowania)</string>
|
||||||
<string name="keep_dm_verity">Zachowaj AVB 2.0/dm-verity (weryfikację procesu bootowania)</string>
|
<string name="keep_dm_verity">Zachowaj AVB 2.0/dm-verity (weryfikację procesu bootowania)</string>
|
||||||
|
<string name="recovery_mode">Tryb Recovery</string>
|
||||||
<string name="current_installed">Zainstalowana: %1$s</string>
|
<string name="current_installed">Zainstalowana: %1$s</string>
|
||||||
<string name="latest_version">Ostatnia: %1$s</string>
|
<string name="latest_version">Ostatnia: %1$s</string>
|
||||||
<string name="uninstall">Odinstaluj</string>
|
<string name="uninstall">Odinstaluj</string>
|
||||||
@@ -145,6 +146,10 @@
|
|||||||
<string name="settings_hosts_summary">Wsparcie systemless dla aplikacji Adblock</string>
|
<string name="settings_hosts_summary">Wsparcie systemless dla aplikacji Adblock</string>
|
||||||
<string name="settings_hosts_toast">Dodano moduł systemless hosts</string>
|
<string name="settings_hosts_toast">Dodano moduł systemless hosts</string>
|
||||||
|
|
||||||
|
<string name="settings_app_name">Wpisz żądaną nazwę aplikacji</string>
|
||||||
|
<string name="settings_app_name_hint">Nowa Nazwa</string>
|
||||||
|
<string name="settings_app_name_helper">Aplikacja zostanie ponownie spakowana do tej nazwy</string>
|
||||||
|
<string name="settings_app_name_error">Zły format</string>
|
||||||
<string name="settings_su_app_adb">Aplikacje i ADB</string>
|
<string name="settings_su_app_adb">Aplikacje i ADB</string>
|
||||||
<string name="settings_su_app">Tylko Aplikacje</string>
|
<string name="settings_su_app">Tylko Aplikacje</string>
|
||||||
<string name="settings_su_adb">Tylko ADB</string>
|
<string name="settings_su_adb">Tylko ADB</string>
|
||||||
@@ -162,10 +167,10 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekund</string>
|
<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_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_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_biometric_title">Uwierzytelnianie odciskiem palca</string>
|
||||||
<string name="settings_su_fingerprint_summary">Użyj skanera linii papilarnych, aby zezwolić na żądania supersu</string>
|
<string name="settings_su_biometric_summary">Użyj odcisku palca aby przyznać uprawnienia superużytkownika</string>
|
||||||
<string name="auth_fingerprint">Uwierzytelnianie Odciskiem Palca</string>
|
<string name="no_biometric">Niewspierane urządzenie lub brak odcisku palca</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Tryb Multiusera</string>
|
<string name="multiuser_mode">Tryb Multiusera</string>
|
||||||
<string name="settings_owner_only">Tylko Właściciel Urządzenia</string>
|
<string name="settings_owner_only">Tylko Właściciel Urządzenia</string>
|
||||||
<string name="settings_owner_manage">Zarządzanie Właścicielami Urządzenia</string>
|
<string name="settings_owner_manage">Zarządzanie Właścicielami Urządzenia</string>
|
||||||
@@ -181,7 +186,6 @@
|
|||||||
<string name="global_summary">Wszystkie sesje root za pomocą globalnej przestrzeni montowań nazw</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -209,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">Potwierdzasz odwołanie uprawnień %1$s?</string>
|
<string name="su_revoke_msg">Potwierdzasz odwołanie uprawnień %1$s?</string>
|
||||||
<string name="toast">Powiadomienie</string>
|
<string name="toast">Powiadomienie</string>
|
||||||
<string name="none">Brak</string>
|
<string name="none">Brak</string>
|
||||||
<string name="auth_fail">Uwierzytelnienie Nieudane</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,23 +8,26 @@
|
|||||||
<string name="log">Registro</string>
|
<string name="log">Registro</string>
|
||||||
<string name="settings">Configurações</string>
|
<string name="settings">Configurações</string>
|
||||||
<string name="install">Instalar</string>
|
<string name="install">Instalar</string>
|
||||||
|
<string name="unsupport_magisk_title">Versão não suportada do Magisk</string>
|
||||||
|
<string name="unsupport_magisk_msg">Esta versão do Magisk Manager não suporta versões do Magisk menores que %1$s.\n\nO aplicativo se comportará como se nenhum Magisk estivesse instalado, por favor, atualize o Magisk o mais rápido possível.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk não está instalado</string>
|
<string name="magisk_version_error">Magisk não está instalado</string>
|
||||||
<string name="checking_for_updates">Verificando por atualizações…</string>
|
<string name="checking_for_updates">Procurando por atualizações…</string>
|
||||||
<string name="invalid_update_channel">Canal de Atualização Inválido</string>
|
<string name="invalid_update_channel">Canal de Atualizações Inválido</string>
|
||||||
<string name="safetyNet_check_text">Verificar SafetyNet</string>
|
<string name="safetyNet_check_text">Toque para iniciar a verificação do SafetyNet</string>
|
||||||
<string name="checking_safetyNet_status">Verificando status de SafetyNet…</string>
|
<string name="checking_safetyNet_status">Verificando o status do SafetyNet…</string>
|
||||||
<string name="safetyNet_check_success">SafetyNet Verificado Com Sucesso</string>
|
<string name="safetyNet_check_success">SafetyNet verificado com sucesso</string>
|
||||||
<string name="safetyNet_api_error">Erro de SafetyNet API</string>
|
<string name="safetyNet_api_error">Erro na API do SafetyNet</string>
|
||||||
<string name="safetyNet_res_invalid">A resposta é inválida</string>
|
<string name="safetyNet_res_invalid">A resposta é inválida</string>
|
||||||
<string name="magisk_up_to_date">Magisk atualizado</string>
|
<string name="magisk_up_to_date">Magisk está atualizado</string>
|
||||||
<string name="manager_up_to_date">Gerenciador Magisk atualizado</string>
|
<string name="manager_up_to_date">Magisk Manager está atualizado</string>
|
||||||
<string name="advanced_settings_title">Configurações Avançadas</string>
|
<string name="advanced_settings_title">Configurações Avançadas</string>
|
||||||
<string name="keep_force_encryption">Manter encriptação forçada</string>
|
<string name="keep_force_encryption">Manter encriptação forçada</string>
|
||||||
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
||||||
|
<string name="recovery_mode">Modo Recuperação</string>
|
||||||
<string name="current_installed">Instalado: %1$s</string>
|
<string name="current_installed">Instalado: %1$s</string>
|
||||||
<string name="latest_version">Último: %1$s</string>
|
<string name="latest_version">Mais recente: %1$s</string>
|
||||||
<string name="uninstall">Desinstalar</string>
|
<string name="uninstall">Desinstalar</string>
|
||||||
<string name="uninstall_magisk_title">Desinstalar o Magisk</string>
|
<string name="uninstall_magisk_title">Desinstalar o Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos. O acesso Root será removido, e seus dados provavelmente serão criptografados se já não estiverem.</string>
|
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos. O acesso Root será removido, e seus dados provavelmente serão criptografados se já não estiverem.</string>
|
||||||
@@ -62,45 +65,70 @@
|
|||||||
<!--About Activity-->
|
<!--About Activity-->
|
||||||
<string name="app_changelog">Registro de mudanças</string>
|
<string name="app_changelog">Registro de mudanças</string>
|
||||||
|
|
||||||
|
<!-- System Components, Notifications -->
|
||||||
|
<string name="update_channel">Atualizações do Magisk</string>
|
||||||
|
<string name="progress_channel">Notificações de Progresso</string>
|
||||||
|
<string name="download_complete">Download completo</string>
|
||||||
|
<string name="download_file_error">Erro ao baixar o aquivo</string>
|
||||||
|
<string name="download_open_parent">Mostrar na pasta</string>
|
||||||
|
<string name="download_open_self">Mostrar arquivo</string>
|
||||||
|
<string name="magisk_update_title">Atualização do Magisk Disponível!</string>
|
||||||
|
<string name="manager_update_title">Atualização do Magisk Manager Disponível!</string>
|
||||||
|
|
||||||
|
<!-- Installation -->
|
||||||
|
<string name="manager_download_install">Toque para baixar e instalar</string>
|
||||||
|
<string name="download_zip_only">Apenas baixar o zip</string>
|
||||||
|
<string name="direct_install">Instalação direta (Recomendado)</string>
|
||||||
|
<string name="install_inactive_slot">Instalar no Slot Inativo (Após o OTA)</string>
|
||||||
|
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nContinuar?</string>
|
||||||
|
<string name="select_method">Selecione o Método</string>
|
||||||
|
<string name="setup_title">Configuração Adicional</string>
|
||||||
|
<string name="select_patch_file">Selecionar e Patchear um Arquivo</string>
|
||||||
|
<string name="patch_file_msg">Selecione uma imagem raw (*.img) ou um arquivo tar do ODIN (*.tar)</string>
|
||||||
|
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="repo_install_title">Instalar %1$s</string>
|
<string name="repo_install_title">Instalar %1$s</string>
|
||||||
<string name="repo_install_msg">Instalar %1$s agora?</string>
|
<string name="repo_install_msg">Você quer instalar %1$s agora?</string>
|
||||||
<string name="download">Baixar</string>
|
<string name="download">Baixar</string>
|
||||||
<string name="reboot">Reiniciar</string>
|
<string name="reboot">Reiniciar</string>
|
||||||
<string name="magisk_update_title">Nova Atualização do Magisk Disponível!</string>
|
<string name="settings_reboot_toast">Reinicie para aplicar as mudanças</string>
|
||||||
<string name="settings_reboot_toast">Reinicie para aplicar as configurações</string>
|
|
||||||
<string name="release_notes">Notas de lançamento</string>
|
<string name="release_notes">Notas de lançamento</string>
|
||||||
<string name="repo_cache_cleared">Cache de repositório limpo</string>
|
<string name="repo_cache_cleared">Cache do repositório limpo</string>
|
||||||
<string name="manager_update_title">Nova Atualização do Magisk Manager Disponível!</string>
|
<string name="dtbo_patched_title">DTBO foi patcheado!</string>
|
||||||
<string name="manager_download_install">Toque para baixar e instalar</string>
|
<string name="dtbo_patched_reboot">Magisk Manager foi patcheado para o dtbo.img. Por favor, reinicie.</string>
|
||||||
<string name="dtbo_patched_title">DTBO foi emendado!</string>
|
<string name="flashing">Flasheando…</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager emendou dtbo.img, reinicie</string>
|
<string name="done">Pronto!</string>
|
||||||
<string name="update_channel">Atualizações do Magisk</string>
|
<string name="failure">Falha</string>
|
||||||
<string name="flashing">Flasheando</string>
|
<string name="hide_manager_title">Ocultando o Magisk Manager…</string>
|
||||||
<string name="hide_manager_title">Ocultando Magisk Manager…</string>
|
<string name="hide_manager_fail_toast">Falha ao ocultar o Magisk Manager.</string>
|
||||||
<string name="hide_manager_fail_toast">Falha ao ocultar Magisk Manager…</string>
|
<string name="open_link_failed_toast">Nenhum aplicativo encontrado para abrir o link</string>
|
||||||
<string name="download_zip_only">Baixar Zip Apenas</string>
|
<string name="warning">Aviso</string>
|
||||||
<string name="direct_install">Instalação Direta (Recomendado)</string>
|
|
||||||
<string name="install_inactive_slot">Instalar no Slot Inativo (Após OTA)</string>
|
|
||||||
<string name="select_method">Selecionar Método</string>
|
|
||||||
<string name="complete_uninstall">Completar Desinstalação</string>
|
<string name="complete_uninstall">Completar Desinstalação</string>
|
||||||
<string name="restore_img">Restaurar Imagens</string>
|
<string name="restore_img">Restaurar Imagens</string>
|
||||||
<string name="restore_done">Restauração concluída!</string>
|
<string name="restore_img_msg">Restaurando…</string>
|
||||||
<string name="restore_fail">Backup original não existe!</string>
|
<string name="restore_done">Restauração completa!</string>
|
||||||
|
<string name="restore_fail">Backup stock não existe!</string>
|
||||||
<string name="proprietary_title">Baixar Código Proprietário</string>
|
<string name="proprietary_title">Baixar Código Proprietário</string>
|
||||||
<string name="proprietary_notice">Magisk Manager é FOSS, que não contém o código proprietário da API SafetyNet da Google.\n\nPermitir ao Magisk Manager baixar uma extensão (que contém a GoogleApiClient) para a verificação SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager é um software livre e de código aberto (FOSS) e não contém código proprietário da API SafetyNet do Google.\n\Permitir o Magisk Manager baixar uma extensão (contém GoogleApiClient) para verificações do SafetyNet?</string>
|
||||||
<string name="download_file_error">Erro ao baixar arquivo</string>
|
<string name="setup_fail">Configuração falhou</string>
|
||||||
|
<string name="env_fix_title">Requer configuração adicional</string>
|
||||||
|
<string name="env_fix_msg">Seu dispositivo precisa de uma configuração adicional para que o Magisk funcione corretamente. Ele fará o download do zip de instalação do Magisk. Deseja continuar agora?</string>
|
||||||
|
<string name="setup_msg">Executando a configuração do ambiente…</string>
|
||||||
|
<string name="authenticate">Autenticar</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Geral</string>
|
<string name="settings_general_category">Geral</string>
|
||||||
<string name="settings_dark_theme_title">Tema Escuro</string>
|
<string name="settings_dark_theme_title">Tema Escuro</string>
|
||||||
<string name="settings_dark_theme_summary">Ativar tema escuro</string>
|
<string name="settings_dark_theme_summary">Ativar o tema escuro</string>
|
||||||
<string name="settings_clear_cache_title">Limpar Cache de Repositório</string>
|
<string name="settings_download_path_title">Caminho de download</string>
|
||||||
<string name="settings_clear_cache_summary">Limpar as informações no cache para repositórios onlines, força o app a reatualizar online</string>
|
<string name="settings_download_path_message">Arquivos serão salvos em %1$s</string>
|
||||||
|
<string name="settings_clear_cache_title">Limpar cache do repositório</string>
|
||||||
|
<string name="settings_clear_cache_summary">Limpar as informações em cache para repositórios online. Isso força o aplicativo a atualizar online</string>
|
||||||
<string name="settings_hide_manager_title">Ocultar Magisk Manager</string>
|
<string name="settings_hide_manager_title">Ocultar Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Reempacotar Magisk Manager com nome de pacote aleatório</string>
|
<string name="settings_hide_manager_summary">Reempacotar o Magisk Manager com nome de pacote e nome do app aleatórios</string>
|
||||||
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
|
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
|
||||||
<string name="settings_restore_manager_summary">Restaurar Magisk Manager com pacote original</string>
|
<string name="settings_restore_manager_summary">Restaurar o Magisk Manager com o nome de pacote e nome do app originais</string>
|
||||||
<string name="language">Idioma</string>
|
<string name="language">Idioma</string>
|
||||||
<string name="system_default">(Padrão do Sistema)</string>
|
<string name="system_default">(Padrão do Sistema)</string>
|
||||||
<string name="settings_update">Configurações de Atualizações</string>
|
<string name="settings_update">Configurações de Atualizações</string>
|
||||||
@@ -117,9 +145,13 @@
|
|||||||
<string name="settings_hosts_title">Hosts sem sistema</string>
|
<string name="settings_hosts_title">Hosts sem sistema</string>
|
||||||
<string name="settings_hosts_summary">Suporte de hosts sem sistema para apps de Adblock</string>
|
<string name="settings_hosts_summary">Suporte de hosts sem sistema para apps de Adblock</string>
|
||||||
|
|
||||||
<string name="settings_su_app_adb">Apps e ADB</string>
|
<string name="settings_app_name">Digite o nome do app desejado</string>
|
||||||
<string name="settings_su_app">Apps apenas</string>
|
<string name="settings_app_name_hint">Novo nome</string>
|
||||||
<string name="settings_su_adb">ADB apenas</string>
|
<string name="settings_app_name_helper">O aplicativo será reempacotado para esse nome</string>
|
||||||
|
<string name="settings_app_name_error">Formato inválido</string>
|
||||||
|
<string name="settings_su_app_adb">Aplicativos e ADB</string>
|
||||||
|
<string name="settings_su_app">Somente aplicativos</string>
|
||||||
|
<string name="settings_su_adb">Somente ADB</string>
|
||||||
<string name="settings_su_disable">Desativado</string>
|
<string name="settings_su_disable">Desativado</string>
|
||||||
<string name="settings_su_request_10">10 segundos</string>
|
<string name="settings_su_request_10">10 segundos</string>
|
||||||
<string name="settings_su_request_15">15 segundos</string>
|
<string name="settings_su_request_15">15 segundos</string>
|
||||||
@@ -132,10 +164,11 @@
|
|||||||
<string name="request_timeout">Tempo Limite de Solicitação</string>
|
<string name="request_timeout">Tempo Limite de Solicitação</string>
|
||||||
<string name="superuser_notification">Notificação de Superusuário</string>
|
<string name="superuser_notification">Notificação de Superusuário</string>
|
||||||
<string name="request_timeout_summary">%1$d segundos</string>
|
<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_title">Reautenticar após uma atualização</string>
|
||||||
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após um app atualizar</string>
|
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após a atualização de um aplicativo</string>
|
||||||
<string name="settings_su_fingerprint_title">Ativar Autenticação de Impressão Digital</string>
|
<string name="settings_su_biometric_title">Habilitar autenticação biométrica</string>
|
||||||
<string name="settings_su_fingerprint_summary">Usar escaneador de impressão digital para permitir solicitações de superusuário</string>
|
<string name="settings_su_biometric_summary">Usar autenticação biométrica para permitir solicitações de superusuário</string>
|
||||||
|
<string name="no_biometric">Dispositivo não suportado ou nenhuma configuração biométrica está ativada</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Modo de Multiusuário</string>
|
<string name="multiuser_mode">Modo de Multiusuário</string>
|
||||||
<string name="settings_owner_only">Proprietário do Dispositivo Apenas</string>
|
<string name="settings_owner_only">Proprietário do Dispositivo Apenas</string>
|
||||||
@@ -145,19 +178,19 @@
|
|||||||
<string name="owner_manage_summary">Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações</string>
|
<string name="owner_manage_summary">Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações</string>
|
||||||
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras root separadas</string>
|
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras root separadas</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Montar Modo de Espaço de Nome</string>
|
<string name="mount_namespace_mode">Modo de montar o namespace</string>
|
||||||
<string name="settings_ns_global">Espaço de Nome Global</string>
|
<string name="settings_ns_global">Namespace Global</string>
|
||||||
<string name="settings_ns_requester">Espaço de Nome Herdado</string>
|
<string name="settings_ns_requester">Herdar Namespace</string>
|
||||||
<string name="settings_ns_isolate">Espaço de Nome Isolado</string>
|
<string name="settings_ns_isolate">Namespace isolado</string>
|
||||||
<string name="global_summary">Todas as sessões root usam montagem de espaço de nome global</string>
|
<string name="global_summary">Todas as sessões de root usam a montagem de namespace global</string>
|
||||||
<string name="requester_summary">As sessões root herdarão espaço de nome de seu solicitante</string>
|
<string name="requester_summary">As sessões de root herdarão o namespace do seu solicitante</string>
|
||||||
<string name="isolate_summary">Cada sessão root terá seu próprio espaço de nome isolado</string>
|
<string name="isolate_summary">Cada sessão root terá seu próprio namespace isolado</string>
|
||||||
<string name="disable_fingerprint">Nenhuma impressão digital foi definida ou o dispostivo não tem suporte</string>
|
<string name="settings_download_path_error">Erro ao criar pasta. Ele deve estar acessível no diretório raiz do armazenamento e não deve ser um arquivo.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Solicitação de Superusuário</string>
|
<string name="su_request_title">Solicitação de Superusuário</string>
|
||||||
<string name="deny">Negar</string>
|
<string name="deny">Negar</string>
|
||||||
<string name="prompt">Solicitar</string>
|
<string name="prompt">Perguntar</string>
|
||||||
<string name="grant">Conceder</string>
|
<string name="grant">Conceder</string>
|
||||||
<string name="su_warning">Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza!</string>
|
<string name="su_warning">Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza!</string>
|
||||||
<string name="forever">Sempre</string>
|
<string name="forever">Sempre</string>
|
||||||
@@ -179,7 +212,6 @@
|
|||||||
<string name="su_revoke_msg">Revogar os direitos de %1$s?</string>
|
<string name="su_revoke_msg">Revogar os direitos de %1$s?</string>
|
||||||
<string name="toast">Notificação toast</string>
|
<string name="toast">Notificação toast</string>
|
||||||
<string name="none">Nenhuma</string>
|
<string name="none">Nenhuma</string>
|
||||||
<string name="auth_fail">Falha de Autenticação</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Setări</string>
|
<string name="settings">Setări</string>
|
||||||
<string name="install">Instalează</string>
|
<string name="install">Instalează</string>
|
||||||
<string name="unsupport_magisk_title">Versiune Magisk nesuportată</string>
|
<string name="unsupport_magisk_title">Versiune Magisk nesuportată</string>
|
||||||
<string name="unsupport_magisk_message">Această versiune de Magisk Manager nu suportă versiunea Magisk mai mică de v18.0.\n\nPoți fie să actualizezi manual Magisk, fie să treci la o versiune mai veche.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk nu este instalat.</string>
|
<string name="magisk_version_error">Magisk nu este instalat.</string>
|
||||||
@@ -162,9 +161,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d secunde</string>
|
<string name="request_timeout_summary">%1$d secunde</string>
|
||||||
<string name="settings_su_reauth_title">Reautentificare după actualizare</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_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="multiuser_mode">Mod de multiutilizator</string>
|
||||||
<string name="settings_owner_only">Numai proprietarul dispozitivului</string>
|
<string name="settings_owner_only">Numai proprietarul dispozitivului</string>
|
||||||
@@ -181,7 +177,6 @@
|
|||||||
<string name="global_summary">Toate sesiunile de root folosesc spațiul de nume global.</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -209,7 +204,6 @@
|
|||||||
<string name="su_revoke_msg">Confirmi revocarea drepturilor pentru %1$s?</string>
|
<string name="su_revoke_msg">Confirmi revocarea drepturilor pentru %1$s?</string>
|
||||||
<string name="toast">Mesaj</string>
|
<string name="toast">Mesaj</string>
|
||||||
<string name="none">Nimic</string>
|
<string name="none">Nimic</string>
|
||||||
<string name="auth_fail">Autentificare eșuată</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<string name="settings">Настройки</string>
|
<string name="settings">Настройки</string>
|
||||||
<string name="install">Установка</string>
|
<string name="install">Установка</string>
|
||||||
<string name="unsupport_magisk_title">Неподдерживаемая версия Magisk</string>
|
<string name="unsupport_magisk_title">Неподдерживаемая версия Magisk</string>
|
||||||
<string name="unsupport_magisk_message">Эта версия Magisk Manager не поддерживает версию Magisk ниже v18.0.\n\nВы можете вручную обновить Magisk или понизить версию приложения до более старой.</string>
|
<string name="unsupport_magisk_msg">Эта версия Magisk Manager не поддерживает версию Magisk ниже %1$s.\n\nПриложение будет работать так, как будто Magisk не установлен, пожалуйста, обновите Magisk как можно быстрее.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk не установлен</string>
|
<string name="magisk_version_error">Magisk не установлен</string>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<string name="logs_cleared">Лог успешно очищен</string>
|
<string name="logs_cleared">Лог успешно очищен</string>
|
||||||
|
|
||||||
<!--About Activity-->
|
<!--About Activity-->
|
||||||
<string name="app_changelog">Список изменений</string>
|
<string name="app_changelog">Изменения</string>
|
||||||
|
|
||||||
<!-- System Components, Notifications -->
|
<!-- System Components, Notifications -->
|
||||||
<string name="update_channel">Обновления Magisk</string>
|
<string name="update_channel">Обновления Magisk</string>
|
||||||
@@ -77,13 +77,13 @@
|
|||||||
|
|
||||||
<!-- Installation -->
|
<!-- Installation -->
|
||||||
<string name="manager_download_install">Нажмите, чтобы загрузить и установить</string>
|
<string name="manager_download_install">Нажмите, чтобы загрузить и установить</string>
|
||||||
<string name="download_zip_only">Только загрузка ZIP</string>
|
<string name="download_zip_only">Загрузка установочного ZIP</string>
|
||||||
<string name="direct_install">Прямая установка (Рекомендуется)</string>
|
<string name="direct_install">Прямая установка (Рекомендуется)</string>
|
||||||
<string name="install_inactive_slot">Установка во второй слот (OTA)</string>
|
<string name="install_inactive_slot">Установка во второй слот (OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">Ваше устройство будет принудительно перезагружено в неактивный (противоположный) слот!\nИспользуйте эту опцию только при интеграции после OTA.\nПродолжить?</string>
|
<string name="install_inactive_slot_msg">Ваше устройство будет принудительно перезагружено в неактивный (противоположный) слот!\nИспользуйте эту опцию только при интеграции после OTA.\nПродолжить?</string>
|
||||||
<string name="select_method">Выбор способа</string>
|
<string name="select_method">Способ установки</string>
|
||||||
<string name="setup_title">Дополнительная установка</string>
|
<string name="setup_title">Дополнительная установка</string>
|
||||||
<string name="select_patch_file">Вручную пропатчить образ</string>
|
<string name="select_patch_file">Пропатчить образ вручную</string>
|
||||||
<string name="patch_file_msg">Выберите файл образа (*.img) или архив ODIN (*.tar)</string>
|
<string name="patch_file_msg">Выберите файл образа (*.img) или архив ODIN (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Перезагрузка через 5 секунд…</string>
|
<string name="reboot_delay_toast">Перезагрузка через 5 секунд…</string>
|
||||||
|
|
||||||
@@ -95,7 +95,6 @@
|
|||||||
<string name="settings_reboot_toast">Для применения настроек перезагрузите устройство</string>
|
<string name="settings_reboot_toast">Для применения настроек перезагрузите устройство</string>
|
||||||
<string name="release_notes">О версии</string>
|
<string name="release_notes">О версии</string>
|
||||||
<string name="repo_cache_cleared">Кэш репозитория очищен</string>
|
<string name="repo_cache_cleared">Кэш репозитория очищен</string>
|
||||||
|
|
||||||
<string name="dtbo_patched_title">DTBO пропатчен!</string>
|
<string name="dtbo_patched_title">DTBO пропатчен!</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager пропатчил dtbo.img. Перезагрузите устройство.</string>
|
<string name="dtbo_patched_reboot">Magisk Manager пропатчил dtbo.img. Перезагрузите устройство.</string>
|
||||||
<string name="flashing">Прошивка…</string>
|
<string name="flashing">Прошивка…</string>
|
||||||
@@ -116,15 +115,16 @@
|
|||||||
<string name="env_fix_title">Требуется дополнительная установка</string>
|
<string name="env_fix_title">Требуется дополнительная установка</string>
|
||||||
<string name="env_fix_msg">Вашему устройству требуется дополнительная установка Magisk для корректной работы. Будет загружен установочный ZIP Magisk, продолжить?</string>
|
<string name="env_fix_msg">Вашему устройству требуется дополнительная установка Magisk для корректной работы. Будет загружен установочный ZIP Magisk, продолжить?</string>
|
||||||
<string name="setup_msg">Настройка рабочей среды…</string>
|
<string name="setup_msg">Настройка рабочей среды…</string>
|
||||||
|
<string name="authenticate">Аутентификация</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Основные</string>
|
<string name="settings_general_category">Основные</string>
|
||||||
<string name="settings_dark_theme_title">Тёмная тема</string>
|
<string name="settings_dark_theme_title">Тёмная тема</string>
|
||||||
<string name="settings_dark_theme_summary">Включить тёмное оформление</string>
|
<string name="settings_dark_theme_summary">Включить тёмное оформление</string>
|
||||||
<string name="settings_download_path_title">Папка загрузки</string>
|
<string name="settings_download_path_title">Папка для загрузки</string>
|
||||||
<string name="settings_download_path_message">Файлы будут загружаться в %1$s</string>
|
<string name="settings_download_path_message">Файлы будут загружаться в %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Очистка кэша репозитория</string>
|
<string name="settings_clear_cache_title">Очистка кэша репозитория</string>
|
||||||
<string name="settings_clear_cache_summary">Очистить кэш репозитория. Будет загружен заново</string>
|
<string name="settings_clear_cache_summary">Очистить кэш репозитория. Кэш будет загружен заново</string>
|
||||||
<string name="settings_hide_manager_title">Скрытие Magisk Manager</string>
|
<string name="settings_hide_manager_title">Скрытие Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Пересобрать Magisk Manager со случайным названием и именем пакета</string>
|
<string name="settings_hide_manager_summary">Пересобрать Magisk Manager со случайным названием и именем пакета</string>
|
||||||
<string name="settings_restore_manager_title">Восстановление Magisk Manager</string>
|
<string name="settings_restore_manager_title">Восстановление Magisk Manager</string>
|
||||||
@@ -142,9 +142,9 @@
|
|||||||
<string name="settings_core_only_title">Magisk Core</string>
|
<string name="settings_core_only_title">Magisk Core</string>
|
||||||
<string name="settings_core_only_summary">Активировать только основные возможности. Модули не будут загружены. MagiskSU и Magisk Hide останутся активными</string>
|
<string name="settings_core_only_summary">Активировать только основные возможности. Модули не будут загружены. MagiskSU и Magisk Hide останутся активными</string>
|
||||||
<string name="settings_magiskhide_summary">Скрывать Magisk от различных обнаружений</string>
|
<string name="settings_magiskhide_summary">Скрывать Magisk от различных обнаружений</string>
|
||||||
<string name="settings_hosts_title">Внесистемные хосты</string>
|
<string name="settings_hosts_title">Внесистемный hosts файл</string>
|
||||||
<string name="settings_hosts_summary">Поддержка внесистемных хостов для приложений, блокирующих рекламу</string>
|
<string name="settings_hosts_summary">Поддержка внесистемного hosts файла для приложений, блокирующих рекламу</string>
|
||||||
<string name="settings_hosts_toast">Добавлен модуль внесистемных хостов</string>
|
<string name="settings_hosts_toast">Добавлен модуль внесистемного hosts файла</string>
|
||||||
|
|
||||||
<string name="settings_app_name">Укажите имя приложения</string>
|
<string name="settings_app_name">Укажите имя приложения</string>
|
||||||
<string name="settings_app_name_hint">Новое имя</string>
|
<string name="settings_app_name_hint">Новое имя</string>
|
||||||
@@ -167,9 +167,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d секунд</string>
|
<string name="request_timeout_summary">%1$d секунд</string>
|
||||||
<string name="settings_su_reauth_title">Повторная аутентификация</string>
|
<string name="settings_su_reauth_title">Повторная аутентификация</string>
|
||||||
<string name="settings_su_reauth_summary">Повторный запрос прав суперпользователя после обновления приложений</string>
|
<string name="settings_su_reauth_summary">Повторный запрос прав суперпользователя после обновления приложений</string>
|
||||||
<string name="settings_su_fingerprint_title">Биометрическая аутентификация</string>
|
<string name="settings_su_biometric_title">Биометрическая аутентификация</string>
|
||||||
<string name="settings_su_fingerprint_summary">Использовать сканер отпечатков пальцев для запросов прав суперпользователя</string>
|
<string name="settings_su_biometric_summary">Использовать биометрическую аутентификацию для запросов прав суперпользователя</string>
|
||||||
<string name="auth_fingerprint">Подтвердите отпечаток пальца</string>
|
<string name="no_biometric">Эта функция не поддерживается устройством или не заданы настройки блокировки экрана</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Многопользовательский режим</string>
|
<string name="multiuser_mode">Многопользовательский режим</string>
|
||||||
<string name="settings_owner_only">Только владелец</string>
|
<string name="settings_owner_only">Только владелец</string>
|
||||||
@@ -186,7 +186,6 @@
|
|||||||
<string name="global_summary">Сессии суперпользователя используют общее пространство имён</string>
|
<string name="global_summary">Сессии суперпользователя используют общее пространство имён</string>
|
||||||
<string name="requester_summary">Сессии суперпользователя наследуют пространство имён запрашивающего</string>
|
<string name="requester_summary">Сессии суперпользователя наследуют пространство имён запрашивающего</string>
|
||||||
<string name="isolate_summary">Сессии суперпользователя используют изолированные пространства имён</string>
|
<string name="isolate_summary">Сессии суперпользователя используют изолированные пространства имён</string>
|
||||||
<string name="disable_fingerprint">Не поддерживается устройством или не заданы отпечатки</string>
|
|
||||||
<string name="settings_download_path_error">Ошибка создания папки. Она должна быть доступна из корневой директории хранилища и не должна быть файлом.</string>
|
<string name="settings_download_path_error">Ошибка создания папки. Она должна быть доступна из корневой директории хранилища и не должна быть файлом.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
@@ -214,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">Сбросить настройки для %1$s?</string>
|
<string name="su_revoke_msg">Сбросить настройки для %1$s?</string>
|
||||||
<string name="toast">Всплывающие уведомления</string>
|
<string name="toast">Всплывающие уведомления</string>
|
||||||
<string name="none">Нет</string>
|
<string name="none">Нет</string>
|
||||||
<string name="auth_fail">Ошибка аутентификации</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,8 +8,6 @@
|
|||||||
<string name="settings">Nastavenia</string>
|
<string name="settings">Nastavenia</string>
|
||||||
<string name="install">Inštalovať</string>
|
<string name="install">Inštalovať</string>
|
||||||
<string name="unsupport_magisk_title">Nepodporovaná verzia Magisku</string>
|
<string name="unsupport_magisk_title">Nepodporovaná verzia Magisku</string>
|
||||||
<string name="unsupport_magisk_message">Táto verzia Magisk Managera podporuje Magisk od verzie v18.0.\n\nBuď upgradujte Magisk manuálne alebo nainštalujte staršiu verziu aplikácie.</string>
|
|
||||||
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk nie je nainštalovaný</string>
|
<string name="magisk_version_error">Magisk nie je nainštalovaný</string>
|
||||||
@@ -25,26 +23,28 @@
|
|||||||
<string name="advanced_settings_title">Pokročilé nastavenia</string>
|
<string name="advanced_settings_title">Pokročilé nastavenia</string>
|
||||||
<string name="keep_force_encryption">Ponechať vynútené šifrovanie</string>
|
<string name="keep_force_encryption">Ponechať vynútené šifrovanie</string>
|
||||||
<string name="keep_dm_verity">Ponechať AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Ponechať AVB 2.0/dm-verity</string>
|
||||||
|
<string name="recovery_mode">Režim Recovery</string>
|
||||||
<string name="current_installed">Nainštalovaná verzia: %1$s</string>
|
<string name="current_installed">Nainštalovaná verzia: %1$s</string>
|
||||||
<string name="latest_version">Najnovšia verzia: %1$s</string>
|
<string name="latest_version">Najnovšia verzia: %1$s</string>
|
||||||
<string name="uninstall">Odinštalovať</string>
|
<string name="uninstall">Odinštalovať</string>
|
||||||
<string name="uninstall_magisk_msg">Všetky moduly budú zakázané/odstránené. Root bude odstránený a teoreticky môže dôjsť k zašifrovaniu vašich dát, ak ich momentálne nemáte zašifrované</string>
|
|
||||||
<string name="uninstall_magisk_title">Odinštalovať Magisk</string>
|
<string name="uninstall_magisk_title">Odinštalovať Magisk</string>
|
||||||
|
<string name="uninstall_magisk_msg">Všetky moduly budú zakázané/odstránené!\nRoot bude odstránený!\nMôže dôjsť k zašifrovaniu vašich dát, ak už nie sú zašifrované!</string>
|
||||||
<string name="update">Aktualizovať</string>
|
<string name="update">Aktualizovať</string>
|
||||||
<string name="core_only_enabled">(Režim Core povolený)</string>
|
<string name="core_only_enabled">(Povolený iba režim Core)</string>
|
||||||
|
|
||||||
<!--Module Fragment-->
|
<!--Module Fragment-->
|
||||||
<string name="no_info_provided">(Nie sú k dispozícii žiadne informácie)</string>
|
<string name="no_info_provided">(Nie sú k dispozícii žiadne informácie)</string>
|
||||||
<string name="no_modules_found">Neboli nájdené žiadne moduly</string>
|
<string name="no_modules_found">Neboli nájdené žiadne moduly</string>
|
||||||
<string name="update_file_created">Modul bude aktualizovaný pri ďalšom reštarte</string>
|
<string name="update_file_created">Modul bude aktualizovaný pri ďalšom reštarte!</string>
|
||||||
<string name="remove_file_created">Modul bude odstránený pri ďalšom reštarte</string>
|
<string name="remove_file_created">Modul bude odstránený pri ďalšom reštarte!</string>
|
||||||
<string name="remove_file_deleted">Modul nebude odstránený pri ďalšom reštarte</string>
|
<string name="remove_file_deleted">Modul nebude odstránený pri ďalšom reštarte!</string>
|
||||||
<string name="disable_file_created">Modul bude zakázaný pri ďalšom reštarte</string>
|
<string name="disable_file_created">Modul bude zakázaný pri ďalšom reštarte!</string>
|
||||||
<string name="disable_file_removed">Modul bude povolený pri ďalšom reštarte</string>
|
<string name="disable_file_removed">Modul bude povolený pri ďalšom reštarte!</string>
|
||||||
<string name="author">Vytvoril %1$s</string>
|
<string name="author">Vytvoril %1$s</string>
|
||||||
<string name="reboot_recovery">Reštartovať do Recovery</string>
|
<string name="reboot_recovery">Reštartovať do Recovery</string>
|
||||||
<string name="reboot_bootloader">Reštartovať do Bootloader</string>
|
<string name="reboot_bootloader">Reštartovať do Bootloader</string>
|
||||||
<string name="reboot_download">Reštartovať do Download</string>
|
<string name="reboot_download">Reštartovať do Download</string>
|
||||||
|
<string name="reboot_edl">Reštartovať do EDL</string>
|
||||||
|
|
||||||
<!--Repo Fragment-->
|
<!--Repo Fragment-->
|
||||||
<string name="update_available">Dostupná aktualizácia</string>
|
<string name="update_available">Dostupná aktualizácia</string>
|
||||||
@@ -59,37 +59,50 @@
|
|||||||
<string name="menuSaveLog">Uložiť záznam</string>
|
<string name="menuSaveLog">Uložiť záznam</string>
|
||||||
<string name="menuReload">Obnoviť</string>
|
<string name="menuReload">Obnoviť</string>
|
||||||
<string name="menuClearLog">Odstrániť záznamy</string>
|
<string name="menuClearLog">Odstrániť záznamy</string>
|
||||||
<string name="logs_cleared">Záznamy boli odstránené</string>
|
<string name="logs_cleared">Záznamy boli odstránené.</string>
|
||||||
|
|
||||||
<!--About Activity-->
|
<!--About Activity-->
|
||||||
<string name="app_changelog">Zoznam zmien</string>
|
<string name="app_changelog">Zoznam zmien</string>
|
||||||
|
|
||||||
<!-- System Components, Notifications -->
|
<!-- System Components, Notifications -->
|
||||||
<string name="update_channel">Aktualizácie Magisk</string>
|
<string name="update_channel">Aktualizácie Magisk</string>
|
||||||
<string name="progress_channel">Notifkikácie priebehu</string>
|
<string name="progress_channel">Upozornenia o priebehu</string>
|
||||||
<string name="download_complete">Sťahovanie ukončené</string>
|
<string name="download_complete">Sťahovanie ukončené</string>
|
||||||
<string name="download_file_error">Chyba sťahovania súboru</string>
|
<string name="download_file_error">Chyba sťahovania súboru</string>
|
||||||
|
<string name="download_open_parent">Zobraziť v nadradenom priečinku</string>
|
||||||
|
<string name="download_open_self">Zobraziť súbor</string>
|
||||||
<string name="magisk_update_title">Je dostupná aktualizácia Magisk!</string>
|
<string name="magisk_update_title">Je dostupná aktualizácia Magisk!</string>
|
||||||
<string name="manager_update_title">Je dostupná aktualizácia Magisk Manager!</string>
|
<string name="manager_update_title">Je dostupná aktualizácia Magisk Manager!</string>
|
||||||
|
|
||||||
|
<!-- Installation -->
|
||||||
|
<string name="manager_download_install">Stlačte pre stiahnutie a inštaláciu</string>
|
||||||
|
<string name="download_zip_only">Stiahnuť iba zip</string>
|
||||||
|
<string name="direct_install">Priama inštalácia (Odporúča sa)</string>
|
||||||
|
<string name="install_inactive_slot">Inštalovať na aktívny slot (Po OTA)</string>
|
||||||
|
<string name="install_inactive_slot_msg">Vaše zariadenie bude po reštarte PRINÚTENÉ nabootovať do aktuálne neaktívneho slotu!\nTúto voľbu použite iba po skončení OTA.\nPokračovať?</string>
|
||||||
|
<string name="select_method">Vyberte metódu</string>
|
||||||
|
<string name="setup_title">Ďalšie nastavenie</string>
|
||||||
|
<string name="select_patch_file">Vybrať a zaplátať súbor</string>
|
||||||
|
<string name="patch_file_msg">Vyberte raw súbor (*.img) alebo tar súbor ODIN (*.tar)</string>
|
||||||
|
<string name="reboot_delay_toast">Reštart o 5 sekúnd…</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="repo_install_title">Nainštalovať %1$s</string>
|
<string name="repo_install_title">Nainštalovať %1$s</string>
|
||||||
<string name="repo_install_msg">Chcete teraz nainštalovať %1$s?</string>
|
<string name="repo_install_msg">Chcete teraz nainštalovať %1$s?</string>
|
||||||
<string name="download">Stiahnuť</string>
|
<string name="download">Stiahnuť</string>
|
||||||
<string name="reboot">Reštart</string>
|
<string name="reboot">Reštartovať</string>
|
||||||
<string name="settings_reboot_toast">Pre aplikovanie nastavení je potrebný reštart</string>
|
<string name="settings_reboot_toast">Pre aplikovanie nastavení je potrebný reštart</string>
|
||||||
<string name="release_notes">Poznámky k vydaniu</string>
|
<string name="release_notes">Poznámky k vydaniu</string>
|
||||||
<string name="repo_cache_cleared">Cache repo odstránená</string>
|
<string name="repo_cache_cleared">Cache repo odstránená</string>
|
||||||
<string name="manager_download_install">Stlačte pre stiahnutie a inštaláciu</string>
|
|
||||||
<string name="dtbo_patched_title">DTBO bol zaplátaný!</string>
|
<string name="dtbo_patched_title">DTBO bol zaplátaný!</string>
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager zaplátal dtbo.img, prosím, reštartujte</string>
|
<string name="dtbo_patched_reboot">Magisk Manager zaplátal dtbo.img, prosím, reštartujte.</string>
|
||||||
<string name="flashing">Flashovanie</string>
|
<string name="flashing">Flashovanie</string>
|
||||||
|
<string name="done">Hotovo!</string>
|
||||||
|
<string name="failure">Zlyhalo</string>
|
||||||
|
<string name="hide_manager_title">Skrytie Magisk Managera…</string>
|
||||||
|
<string name="hide_manager_fail_toast">Skrytie Magisk Manager zlyhalo.</string>
|
||||||
<string name="open_link_failed_toast">Nepodarilo sa nájsť vhodnú aplikáciu na otvorenie odkazu…</string>
|
<string name="open_link_failed_toast">Nepodarilo sa nájsť vhodnú aplikáciu na otvorenie odkazu…</string>
|
||||||
<string name="download_zip_only">Stiahnuť iba zip</string>
|
|
||||||
<string name="direct_install">Priama inštalácia (Odporúča sa)</string>
|
|
||||||
<string name="install_inactive_slot">Inštalovať na aktívny slot (Po OTA)</string>
|
|
||||||
<string name="warning">Upozornenie</string>
|
<string name="warning">Upozornenie</string>
|
||||||
<string name="install_inactive_slot_msg">Vaše zariadenie bude po reštarte PRINÚTENÉ nabootovať do aktuálne neaktívneho slotu!\nTúto voľbu použite iba po skončení OTA.\nPokračovať?</string>
|
|
||||||
<string name="select_method">Vyberte metódu</string>
|
|
||||||
<string name="complete_uninstall">Úplne odinštalovať</string>
|
<string name="complete_uninstall">Úplne odinštalovať</string>
|
||||||
<string name="restore_img">Obnoviť obrazy</string>
|
<string name="restore_img">Obnoviť obrazy</string>
|
||||||
<string name="restore_img_msg">Obnovovanie…</string>
|
<string name="restore_img_msg">Obnovovanie…</string>
|
||||||
@@ -100,14 +113,16 @@
|
|||||||
<string name="setup_fail">Nastavenie zlyhalo</string>
|
<string name="setup_fail">Nastavenie zlyhalo</string>
|
||||||
<string name="env_fix_title">Vyžaduje sa ďalšie nastavenie</string>
|
<string name="env_fix_title">Vyžaduje sa ďalšie nastavenie</string>
|
||||||
<string name="env_fix_msg">Vaše zariadenie si vyžaduje ďalšie nastavenie pre správne fungovanie Magisk. Stiahne sa inštalačný zip súbor Magisk, chcete pokračovať teraz?</string>
|
<string name="env_fix_msg">Vaše zariadenie si vyžaduje ďalšie nastavenie pre správne fungovanie Magisk. Stiahne sa inštalačný zip súbor Magisk, chcete pokračovať teraz?</string>
|
||||||
<string name="setup_title">Ďalšie nastavenie</string>
|
<string name="setup_msg">Nastavenie je spustené…</string>
|
||||||
<string name="setup_msg">Spustené prostredie nastavenia…</string>
|
<string name="authenticate">Autentifikácia</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Všeobecné</string>
|
<string name="settings_general_category">Všeobecné</string>
|
||||||
<string name="settings_dark_theme_title">Tmavý motív</string>
|
<string name="settings_dark_theme_title">Tmavý motív</string>
|
||||||
<string name="settings_dark_theme_summary">Povoliť tmavý motív</string>
|
<string name="settings_dark_theme_summary">Povoliť tmavý motív</string>
|
||||||
<string name="settings_clear_cache_title">Vyčistiť cache repo </string>
|
<string name="settings_download_path_title">Cesta na sťahovanie</string>
|
||||||
|
<string name="settings_download_path_message">Súbory budú uložené do %1$s</string>
|
||||||
|
<string name="settings_clear_cache_title">Vyčistiť cache repo</string>
|
||||||
<string name="settings_clear_cache_summary">Vyčistí uložené informácie pre online repo, aplikácia si nové informácie stiahne online</string>
|
<string name="settings_clear_cache_summary">Vyčistí uložené informácie pre online repo, aplikácia si nové informácie stiahne online</string>
|
||||||
<string name="settings_hide_manager_title">Skryť Magisk Manager</string>
|
<string name="settings_hide_manager_title">Skryť Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Prebalí Magisk Manager s náhodným názvom balíčka</string>
|
<string name="settings_hide_manager_summary">Prebalí Magisk Manager s náhodným názvom balíčka</string>
|
||||||
@@ -124,12 +139,16 @@
|
|||||||
<string name="settings_update_custom">Vlastný</string>
|
<string name="settings_update_custom">Vlastný</string>
|
||||||
<string name="settings_update_custom_msg">Zadajte vlastnú URL</string>
|
<string name="settings_update_custom_msg">Zadajte vlastnú URL</string>
|
||||||
<string name="settings_core_only_title">Režim Magisk Core</string>
|
<string name="settings_core_only_title">Režim Magisk Core</string>
|
||||||
<string name="settings_core_only_summary">Povolí iba hlavné funkcie. Stále budú povolené MagiskSU, MagiskHide a systemless hosts, ale žiadne moduly nebudú zavedené.</string>
|
<string name="settings_core_only_summary">Povolí iba hlavné funkcie. Stále budú povolené MagiskSU, MagiskHide a systemless hosts, ale žiadne moduly nebudú zavedené</string>
|
||||||
<string name="settings_magiskhide_summary">Ukryje Magisk pre rôznymi detekciami</string>
|
<string name="settings_magiskhide_summary">Ukryje Magisk pre rôznymi detekciami</string>
|
||||||
<string name="settings_hosts_title">Systemless hosts</string>
|
<string name="settings_hosts_title">Systemless hosts</string>
|
||||||
<string name="settings_hosts_summary">Podpora pre aplikácie systemless hosts Adblock</string>
|
<string name="settings_hosts_summary">Podpora pre aplikácie systemless hosts Adblock</string>
|
||||||
<string name="settings_hosts_toast">Pridaný modul systemless hosts</string>
|
<string name="settings_hosts_toast">Pridaný modul systemless hosts</string>
|
||||||
|
|
||||||
|
<string name="settings_app_name">Zadajte požadovaný názov aplikácie</string>
|
||||||
|
<string name="settings_app_name_hint">Nový názov</string>
|
||||||
|
<string name="settings_app_name_helper">Zadajte požadovaný názov aplikácie</string>
|
||||||
|
<string name="settings_app_name_error">Neplatný formát</string>
|
||||||
<string name="settings_su_app_adb">Aplikácie a ADB</string>
|
<string name="settings_su_app_adb">Aplikácie a ADB</string>
|
||||||
<string name="settings_su_app">Iba aplikácie</string>
|
<string name="settings_su_app">Iba aplikácie</string>
|
||||||
<string name="settings_su_adb">Iba ADB</string>
|
<string name="settings_su_adb">Iba ADB</string>
|
||||||
@@ -147,9 +166,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d sekúnd</string>
|
<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_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_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_biometric_title">Povoliť biometrickú autentifikáciu</string>
|
||||||
<string name="settings_su_fingerprint_summary">Použite snímač odtlačkov prstov pre povolenie žiadostí superuser</string>
|
<string name="settings_su_biometric_summary">Použite biometrickú autentifikáciu pre povolenie žiadostí superuser</string>
|
||||||
<string name="auth_fingerprint">Autentifikovať odtlačok prsta</string>
|
<string name="no_biometric">Nepodporované zariadenia alebo biometria nie je povolená v nastaveniach</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Režim viacerých používateľov</string>
|
<string name="multiuser_mode">Režim viacerých používateľov</string>
|
||||||
<string name="settings_owner_only">Iba majiteľ zariadenia</string>
|
<string name="settings_owner_only">Iba majiteľ zariadenia</string>
|
||||||
@@ -160,13 +179,13 @@
|
|||||||
<string name="user_indepenent_summary">Každý používateľ má vlastné pravidlá pre root</string>
|
<string name="user_indepenent_summary">Každý používateľ má vlastné pravidlá pre root</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Režim Mount Namespace</string>
|
<string name="mount_namespace_mode">Režim Mount Namespace</string>
|
||||||
<string name="settings_ns_global">Globálne Namespace</string>
|
<string name="settings_ns_global">Globálny Namespace</string>
|
||||||
<string name="settings_ns_requester">Zdedené Namespace</string>
|
<string name="settings_ns_requester">Zdedený Namespace</string>
|
||||||
<string name="settings_ns_isolate">Izolované Namespace</string>
|
<string name="settings_ns_isolate">Izolovaný Namespace</string>
|
||||||
<string name="global_summary">Všetky relácie root použijú globálne mount namespace</string>
|
<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 požadovateľa</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="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-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Žiadosť superuser</string>
|
<string name="su_request_title">Žiadosť superuser</string>
|
||||||
@@ -193,12 +212,12 @@
|
|||||||
<string name="su_revoke_msg">Potvrdzujete zrušenie práv %1$s?</string>
|
<string name="su_revoke_msg">Potvrdzujete zrušenie práv %1$s?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
<string name="none">Nič</string>
|
<string name="none">Nič</string>
|
||||||
<string name="auth_fail">Autentifikácia zlyhala</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID:%1$d</string>
|
<string name="pid">PID:%1$d</string>
|
||||||
<string name="target_uid">Cieľový UID: %1$d</string>
|
<string name="target_uid">Cieľový UID: %1$d</string>
|
||||||
<string name="command">Príkaz: %1$s</string>
|
<string name="command">Príkaz: %1$s</string>
|
||||||
|
|
||||||
<!-- MagiskHide -->
|
<!-- MagiskHide -->
|
||||||
<string name="show_system_app">Zobraziť systémové aplikácie</string>
|
<string name="show_system_app">Zobraziť systémové aplikácie</string>
|
||||||
|
|
||||||
|
@@ -146,9 +146,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d วินาที</string>
|
<string name="request_timeout_summary">%1$d วินาที</string>
|
||||||
<string name="settings_su_reauth_title">ขอสิทธิ์ใหม่หลังจากอัพเกรด</string>
|
<string name="settings_su_reauth_title">ขอสิทธิ์ใหม่หลังจากอัพเกรด</string>
|
||||||
<string name="settings_su_reauth_summary">ขอสิทธิ์ superuser ใหม่หลังจากแอปถูกอัพเกรด</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="multiuser_mode">โหมดผู้ใช้หลายคน</string>
|
||||||
<string name="settings_owner_only">เจ้าของอุปกรณ์เท่านั้น</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="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="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="isolate_summary">Each root session will have its own isolated namespace.</string>
|
||||||
<string name="disable_fingerprint">ไม่มีลายนิ้วมือหรืออุปกรณ์แสกน</string>
|
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">การขอเข้าถึง Superuser</string>
|
<string name="su_request_title">การขอเข้าถึง Superuser</string>
|
||||||
@@ -192,7 +188,6 @@
|
|||||||
<string name="su_revoke_msg">ยืนยันการลบสิทธิ์ของ %1$s?</string>
|
<string name="su_revoke_msg">ยืนยันการลบสิทธิ์ของ %1$s?</string>
|
||||||
<string name="toast">การเตือน</string>
|
<string name="toast">การเตือน</string>
|
||||||
<string name="none">ไม่มี</string>
|
<string name="none">ไม่มี</string>
|
||||||
<string name="auth_fail">การยืนยันล้มเหลว</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="target_uid">UID เป้าหมาย: %1$d</string>
|
<string name="target_uid">UID เป้าหมาย: %1$d</string>
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<string name="settings">Ayarlar</string>
|
<string name="settings">Ayarlar</string>
|
||||||
<string name="install">Yükle</string>
|
<string name="install">Yükle</string>
|
||||||
<string name="unsupport_magisk_title">Desteklenmeyen Magisk Sürümü</string>
|
<string name="unsupport_magisk_title">Desteklenmeyen Magisk Sürümü</string>
|
||||||
<string name="unsupport_magisk_message">Magisk Manager\'ın bu sürümü v18.0\'dan daha düşük Magisk versiyonlarını desteklememektedir.\n\nMagisk\'i manuel olarak yükseltebilir veya uygulamayı daha eski bir sürüme düşürebilirsiniz.</string>
|
<string name="unsupport_magisk_msg">Magisk Manager\'ın bu sürümü, %1$s daha düşük Magisk versiyonlarını desteklememektedir.\n\nUygulama hiçbir Magisk kurulu değil gibi davranacak, lütfen en kısa zamanda Magisk\'i yükseltin.</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk yüklü değil</string>
|
<string name="magisk_version_error">Magisk yüklü değil</string>
|
||||||
@@ -95,8 +95,7 @@
|
|||||||
<string name="settings_reboot_toast">Ayarları uygulamak için yeniden başlatın</string>
|
<string name="settings_reboot_toast">Ayarları uygulamak için yeniden başlatın</string>
|
||||||
<string name="release_notes">Sürüm notları</string>
|
<string name="release_notes">Sürüm notları</string>
|
||||||
<string name="repo_cache_cleared">Repo önbelleği temizlendi</string>
|
<string name="repo_cache_cleared">Repo önbelleği temizlendi</string>
|
||||||
|
<string name="dtbo_patched_title">DTBO yamalandı!</string>
|
||||||
<string name="dtbo_patched_title">DTBO yamalandı!</string>
|
|
||||||
<string name="dtbo_patched_reboot">Magisk Manager dtbo.img\'yi yamaladı, lütfen yeniden başlatın</string>
|
<string name="dtbo_patched_reboot">Magisk Manager dtbo.img\'yi yamaladı, lütfen yeniden başlatın</string>
|
||||||
<string name="flashing">Yükleniyor</string>
|
<string name="flashing">Yükleniyor</string>
|
||||||
<string name="done">Tamamlandı!</string>
|
<string name="done">Tamamlandı!</string>
|
||||||
@@ -116,6 +115,7 @@
|
|||||||
<string name="env_fix_title">Ek Kurulum Gerekli</string>
|
<string name="env_fix_title">Ek Kurulum Gerekli</string>
|
||||||
<string name="env_fix_msg">Cihazınızın Magisk\'in düzgün çalışması için ek kuruluma ihtiyacı var. Bu Magisk kurulum zip dosyasını indirecektir, şimdi devam etmek istiyor musunuz?</string>
|
<string name="env_fix_msg">Cihazınızın Magisk\'in düzgün çalışması için ek kuruluma ihtiyacı var. Bu Magisk kurulum zip dosyasını indirecektir, şimdi devam etmek istiyor musunuz?</string>
|
||||||
<string name="setup_msg">Ortam kurulumu çalışıyor…</string>
|
<string name="setup_msg">Ortam kurulumu çalışıyor…</string>
|
||||||
|
<string name="authenticate">Kimlik doğrulaması</string>
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Settings Activity -->
|
||||||
<string name="settings_general_category">Genel</string>
|
<string name="settings_general_category">Genel</string>
|
||||||
@@ -167,9 +167,9 @@
|
|||||||
<string name="request_timeout_summary">%1$d saniye</string>
|
<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_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_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_biometric_title">Biyometrik 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="settings_su_biometric_summary">Superuser isteklerine izin vermek için biyometrik kimlik doğrulamayı kullanın</string>
|
||||||
<string name="auth_fingerprint">Parmak izini doğrula</string>
|
<string name="no_biometric">Desteklenmeyen cihaz veya biyometrik ayar etkinleştirilmemiş</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Çok Kullanıcılı Mod</string>
|
<string name="multiuser_mode">Çok Kullanıcılı Mod</string>
|
||||||
<string name="settings_owner_only">Yalnızca Cihaz Sahibi</string>
|
<string name="settings_owner_only">Yalnızca Cihaz Sahibi</string>
|
||||||
@@ -186,7 +186,6 @@
|
|||||||
<string name="global_summary">Tüm kök oturumları genel bağlama ad alanını kullanır</string>
|
<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="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="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>
|
<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-->
|
<!--Superuser-->
|
||||||
@@ -214,7 +213,6 @@
|
|||||||
<string name="su_revoke_msg">%1$s hakları geri alınsın mı?</string>
|
<string name="su_revoke_msg">%1$s hakları geri alınsın mı?</string>
|
||||||
<string name="toast">Pencere</string>
|
<string name="toast">Pencere</string>
|
||||||
<string name="none">Hiçbiri</string>
|
<string name="none">Hiçbiri</string>
|
||||||
<string name="auth_fail">Kimlik Doğrulama Başarısız</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
<string name="settings">Налаштування</string>
|
<string name="settings">Налаштування</string>
|
||||||
<string name="install">Встановлення</string>
|
<string name="install">Встановлення</string>
|
||||||
<string name="unsupport_magisk_title">Версія Magisk не підтримується</string>
|
<string name="unsupport_magisk_title">Версія Magisk не підтримується</string>
|
||||||
<string name="unsupport_magisk_message">Ця версія Magisk Manager не підтримує версію Magisk нижчу, ніж v18.0.\n\nВи можете або вручну оновити Magisk, або понизити програму до старішої версії.</string>
|
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Status Fragment-->
|
||||||
<string name="magisk_version_error">Magisk не встановлено.</string>
|
<string name="magisk_version_error">Magisk не встановлено.</string>
|
||||||
@@ -167,9 +166,6 @@
|
|||||||
<string name="request_timeout_summary">%1$d сек.</string>
|
<string name="request_timeout_summary">%1$d сек.</string>
|
||||||
<string name="settings_su_reauth_title">Повторна автентифікація</string>
|
<string name="settings_su_reauth_title">Повторна автентифікація</string>
|
||||||
<string name="settings_su_reauth_summary">Перевидача прав суперкористувача після оновлення програм</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="multiuser_mode">Багатокористувацький режим</string>
|
||||||
<string name="settings_owner_only">Тільки власник</string>
|
<string name="settings_owner_only">Тільки власник</string>
|
||||||
@@ -186,7 +182,6 @@
|
|||||||
<string name="global_summary">Всі сеанси Суперкористувача використовують глобальний простір імен.</string>
|
<string name="global_summary">Всі сеанси Суперкористувача використовують глобальний простір імен.</string>
|
||||||
<string name="requester_summary">Сеанси Суперкористувача наслідують простір імен запитувача.</string>
|
<string name="requester_summary">Сеанси Суперкористувача наслідують простір імен запитувача.</string>
|
||||||
<string name="isolate_summary">Кожнен сеанс Суперкористувача має власний ізольований простір імен.</string>
|
<string name="isolate_summary">Кожнен сеанс Суперкористувача має власний ізольований простір імен.</string>
|
||||||
<string name="disable_fingerprint">Немає відбитків пальця або пристрій не підтримується.</string>
|
|
||||||
<string name="settings_download_path_error">Помилка створення папки. Вона повинна бути доступна з кореневої директорії сховища і не повинна бути файлом.</string>
|
<string name="settings_download_path_error">Помилка створення папки. Вона повинна бути доступна з кореневої директорії сховища і не повинна бути файлом.</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
@@ -214,7 +209,6 @@
|
|||||||
<string name="su_revoke_msg">Підтвердити відкликання прав для %1$s?</string>
|
<string name="su_revoke_msg">Підтвердити відкликання прав для %1$s?</string>
|
||||||
<string name="toast">Спливаюче сповіщення</string>
|
<string name="toast">Спливаюче сповіщення</string>
|
||||||
<string name="none">Ні</string>
|
<string name="none">Ні</string>
|
||||||
<string name="auth_fail">Помилка автентифікації</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Superuser logs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="pid">PID: %1$d</string>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user