mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-14 16:17:27 +00:00
Compare commits
24 Commits
manager-v8
...
manager-v8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
fbcbb20178 | ||
![]() |
0914700fc6 | ||
![]() |
eeced2fb5b | ||
![]() |
6509e3d4f5 | ||
![]() |
317052604b | ||
![]() |
5538f7168c | ||
![]() |
dcb9e4cd93 | ||
![]() |
d9382f59bf | ||
![]() |
403a0c770a | ||
![]() |
f0f1cdc501 | ||
![]() |
4e272b70ef | ||
![]() |
8dc62a0232 | ||
![]() |
9225b47568 | ||
![]() |
d462873e74 | ||
![]() |
fc19b50290 | ||
![]() |
333fe6da0e | ||
![]() |
75fcda9f81 | ||
![]() |
44ba2a9903 | ||
![]() |
2fceb1ad96 | ||
![]() |
bacb5fa462 | ||
![]() |
67f8dc494e | ||
![]() |
3e4caabecb | ||
![]() |
dcd5183b24 | ||
![]() |
d80c6b42a6 |
@@ -15,17 +15,17 @@ Here are some feature highlights:
|
|||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
[](https://github.com/topjohnwu/Magisk/releases/download/manager-v7.5.1/MagiskManager-v7.5.1.apk)
|
[](https://github.com/topjohnwu/Magisk/releases/download/manager-v8.0.1/MagiskManager-v8.0.1.apk)
|
||||||
[](https://raw.githubusercontent.com/topjohnwu/magisk_files/canary/app-debug.apk)
|
[](https://raw.githubusercontent.com/topjohnwu/magisk_files/canary/app-debug.apk)
|
||||||
<br>
|
<br>
|
||||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v20.4)
|
[](https://github.com/topjohnwu/Magisk/releases/tag/v20.4)
|
||||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v20.4)
|
[](https://github.com/topjohnwu/Magisk/releases/tag/v21.0)
|
||||||
|
|
||||||
## Useful Links
|
## Useful Links
|
||||||
|
|
||||||
- [Installation Instruction](https://topjohnwu.github.io/Magisk/install.html)
|
- [Installation Instruction](https://topjohnwu.github.io/Magisk/install.html)
|
||||||
- [Frequently Asked Questions](https://topjohnwu.github.io/Magisk/faq.html)
|
- [Frequently Asked Questions](https://topjohnwu.github.io/Magisk/faq.html)
|
||||||
- [Full Official Docs](https://topjohnwu.github.io/Magisk/)
|
- [Magisk Documentation](https://topjohnwu.github.io/Magisk/)
|
||||||
- [Magisk Troubleshoot Wiki](https://www.didgeridoohan.com/magisk/HomePage) (by [@Didgeridoohan](https://github.com/Didgeridoohan))
|
- [Magisk Troubleshoot Wiki](https://www.didgeridoohan.com/magisk/HomePage) (by [@Didgeridoohan](https://github.com/Didgeridoohan))
|
||||||
|
|
||||||
## Android Version Support
|
## Android Version Support
|
||||||
|
@@ -82,6 +82,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation("com.github.topjohnwu:jtar:1.0.0")
|
implementation("com.github.topjohnwu:jtar:1.0.0")
|
||||||
implementation("com.github.topjohnwu:indeterminate-checkbox:1.0.7")
|
implementation("com.github.topjohnwu:indeterminate-checkbox:1.0.7")
|
||||||
|
implementation("com.github.topjohnwu:lz4-java:1.7.1")
|
||||||
implementation("com.jakewharton.timber:timber:4.7.1")
|
implementation("com.jakewharton.timber:timber:4.7.1")
|
||||||
|
|
||||||
val vBAdapt = "4.0.0"
|
val vBAdapt = "4.0.0"
|
||||||
@@ -118,7 +119,7 @@ dependencies {
|
|||||||
implementation("com.squareup.okhttp3:logging-interceptor:${vOkHttp}")
|
implementation("com.squareup.okhttp3:logging-interceptor:${vOkHttp}")
|
||||||
implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:${vOkHttp}")
|
implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:${vOkHttp}")
|
||||||
|
|
||||||
val vMoshi = "1.10.0"
|
val vMoshi = "1.11.0"
|
||||||
implementation("com.squareup.moshi:moshi:${vMoshi}")
|
implementation("com.squareup.moshi:moshi:${vMoshi}")
|
||||||
kapt("com.squareup.moshi:moshi-kotlin-codegen:${vMoshi}")
|
kapt("com.squareup.moshi:moshi-kotlin-codegen:${vMoshi}")
|
||||||
|
|
||||||
@@ -141,7 +142,7 @@ dependencies {
|
|||||||
implementation("androidx.work:work-runtime-ktx:2.4.0")
|
implementation("androidx.work:work-runtime-ktx:2.4.0")
|
||||||
implementation("androidx.transition:transition:1.3.1")
|
implementation("androidx.transition:transition:1.3.1")
|
||||||
implementation("androidx.multidex:multidex:2.0.1")
|
implementation("androidx.multidex:multidex:2.0.1")
|
||||||
implementation("androidx.core:core-ktx:1.3.1")
|
implementation("androidx.core:core-ktx:1.3.2")
|
||||||
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
|
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
|
||||||
implementation("com.google.android.material:material:1.2.1")
|
implementation("com.google.android.material:material:1.2.1")
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
package com.topjohnwu.magisk.arch
|
package com.topjohnwu.magisk.arch
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -41,11 +40,6 @@ abstract class BaseUIActivity<VM : BaseViewModel, Binding : ViewDataBinding> :
|
|||||||
AppCompatDelegate.setDefaultNightMode(theme)
|
AppCompatDelegate.setDefaultNightMode(theme)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
|
||||||
currentFragment?.onActivityResult(requestCode, resultCode, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
setTheme(themeRes)
|
setTheme(themeRes)
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@@ -17,7 +17,7 @@ import com.topjohnwu.magisk.ktx.startAnimations
|
|||||||
abstract class BaseUIFragment<VM : BaseViewModel, Binding : ViewDataBinding> :
|
abstract class BaseUIFragment<VM : BaseViewModel, Binding : ViewDataBinding> :
|
||||||
Fragment(), BaseUIComponent<VM> {
|
Fragment(), BaseUIComponent<VM> {
|
||||||
|
|
||||||
protected val activity get() = requireActivity() as BaseUIActivity<*, *>
|
val activity get() = requireActivity() as BaseUIActivity<*, *>
|
||||||
protected lateinit var binding: Binding
|
protected lateinit var binding: Binding
|
||||||
protected abstract val layoutRes: Int
|
protected abstract val layoutRes: Int
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.arch
|
package com.topjohnwu.magisk.arch
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -23,5 +22,5 @@ interface ActivityExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface FragmentExecutor {
|
interface FragmentExecutor {
|
||||||
operator fun invoke(fragment: Fragment)
|
operator fun invoke(fragment: BaseUIFragment<*, *>)
|
||||||
}
|
}
|
||||||
|
@@ -12,8 +12,8 @@ object Const {
|
|||||||
|
|
||||||
// Versions
|
// Versions
|
||||||
const val SNET_EXT_VER = 15
|
const val SNET_EXT_VER = 15
|
||||||
const val SNET_REVISION = "d494bc726e86166913a13629e3b1336728ec5d7f"
|
const val SNET_REVISION = "18ab78817087c337ae0edd1ecac38aec49217880"
|
||||||
const val BOOTCTL_REVISION = "a6c47f86f10b310358afa9dbe837037dd5d561df"
|
const val BOOTCTL_REVISION = "18ab78817087c337ae0edd1ecac38aec49217880"
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
const val ANDROID_MANIFEST = "AndroidManifest.xml"
|
const val ANDROID_MANIFEST = "AndroidManifest.xml"
|
||||||
@@ -33,12 +33,12 @@ object Const {
|
|||||||
|
|
||||||
object ID {
|
object ID {
|
||||||
const val FETCH_ZIP = 2
|
const val FETCH_ZIP = 2
|
||||||
const val SELECT_BOOT = 3
|
const val SELECT_FILE = 3
|
||||||
|
const val MAX_ACTIVITY_RESULT = 10
|
||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
const val MAGISK_UPDATE_NOTIFICATION_ID = 4
|
const val MAGISK_UPDATE_NOTIFICATION_ID = 4
|
||||||
const val APK_UPDATE_NOTIFICATION_ID = 5
|
const val APK_UPDATE_NOTIFICATION_ID = 5
|
||||||
const val DTBO_NOTIFICATION_ID = 7
|
|
||||||
const val HIDE_MANAGER_NOTIFICATION_ID = 8
|
const val HIDE_MANAGER_NOTIFICATION_ID = 8
|
||||||
const val UPDATE_NOTIFICATION_CHANNEL = "update"
|
const val UPDATE_NOTIFICATION_CHANNEL = "update"
|
||||||
const val PROGRESS_NOTIFICATION_CHANNEL = "progress"
|
const val PROGRESS_NOTIFICATION_CHANNEL = "progress"
|
||||||
@@ -51,14 +51,14 @@ object Const {
|
|||||||
const val SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk"
|
const val SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk"
|
||||||
|
|
||||||
const val GITHUB_RAW_URL = "https://raw.githubusercontent.com/"
|
const val GITHUB_RAW_URL = "https://raw.githubusercontent.com/"
|
||||||
const val GITHUB_API_URL = "https://api.github.com/users/Magisk-Modules-Repo/"
|
const val GITHUB_API_URL = "https://api.github.com/"
|
||||||
const val GITHUB_PAGE_URL = "https://topjohnwu.github.io/magisk_files/"
|
const val GITHUB_PAGE_URL = "https://topjohnwu.github.io/magisk_files/"
|
||||||
|
const val JS_DELIVR_URL = "https://cdn.jsdelivr.net/gh/"
|
||||||
}
|
}
|
||||||
|
|
||||||
object Key {
|
object Key {
|
||||||
// others
|
// others
|
||||||
const val LINK_KEY = "Link"
|
const val LINK_KEY = "Link"
|
||||||
const val IF_NONE_MATCH = "If-None-Match"
|
|
||||||
const val ETAG_KEY = "ETag"
|
const val ETAG_KEY = "ETag"
|
||||||
// intents
|
// intents
|
||||||
const val OPEN_SECTION = "section"
|
const val OPEN_SECTION = "section"
|
||||||
|
@@ -3,7 +3,7 @@ package com.topjohnwu.magisk.core
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import com.topjohnwu.magisk.BuildConfig
|
import com.topjohnwu.magisk.BuildConfig
|
||||||
import com.topjohnwu.magisk.data.repository.MagiskRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.view.Notifications
|
import com.topjohnwu.magisk.view.Notifications
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -15,14 +15,14 @@ import java.util.concurrent.TimeUnit
|
|||||||
class UpdateCheckService(context: Context, workerParams: WorkerParameters)
|
class UpdateCheckService(context: Context, workerParams: WorkerParameters)
|
||||||
: CoroutineWorker(context, workerParams), KoinComponent {
|
: CoroutineWorker(context, workerParams), KoinComponent {
|
||||||
|
|
||||||
private val magiskRepo: MagiskRepository by inject()
|
private val svc: NetworkService by inject()
|
||||||
|
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
// Make sure shell initializer was ran
|
// Make sure shell initializer was ran
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
Shell.getShell()
|
Shell.getShell()
|
||||||
}
|
}
|
||||||
return magiskRepo.fetchUpdate()?.let {
|
return svc.fetchUpdate()?.let {
|
||||||
if (BuildConfig.VERSION_CODE < it.app.versionCode)
|
if (BuildConfig.VERSION_CODE < it.app.versionCode)
|
||||||
Notifications.managerUpdate(applicationContext)
|
Notifications.managerUpdate(applicationContext)
|
||||||
else if (Info.env.isActive && Info.env.magiskVersionCode < it.magisk.versionCode)
|
else if (Info.env.isActive && Info.env.magiskVersionCode < it.magisk.versionCode)
|
||||||
|
@@ -8,22 +8,24 @@ import android.content.pm.PackageManager
|
|||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.annotation.CallSuper
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.collection.SparseArrayCompat
|
import androidx.collection.SparseArrayCompat
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
|
import com.topjohnwu.magisk.core.Const
|
||||||
import com.topjohnwu.magisk.core.utils.currentLocale
|
import com.topjohnwu.magisk.core.utils.currentLocale
|
||||||
import com.topjohnwu.magisk.core.wrap
|
import com.topjohnwu.magisk.core.wrap
|
||||||
import com.topjohnwu.magisk.ktx.set
|
import com.topjohnwu.magisk.ktx.set
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
typealias RequestCallback = BaseActivity.(Int, Intent?) -> Unit
|
typealias ActivityResultCallback = BaseActivity.(Int, Intent?) -> Unit
|
||||||
|
|
||||||
abstract class BaseActivity : AppCompatActivity() {
|
abstract class BaseActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private val resultCallbacks by lazy { SparseArrayCompat<RequestCallback>() }
|
private val resultCallbacks by lazy { SparseArrayCompat<ActivityResultCallback>() }
|
||||||
|
|
||||||
override fun applyOverrideConfiguration(config: Configuration?) {
|
override fun applyOverrideConfiguration(config: Configuration?) {
|
||||||
// Force applying our preferred local
|
// Force applying our preferred local
|
||||||
@@ -38,8 +40,7 @@ abstract class BaseActivity : AppCompatActivity() {
|
|||||||
fun withPermission(permission: String, builder: PermissionRequestBuilder.() -> Unit) {
|
fun withPermission(permission: String, builder: PermissionRequestBuilder.() -> Unit) {
|
||||||
val request = PermissionRequestBuilder().apply(builder).build()
|
val request = PermissionRequestBuilder().apply(builder).build()
|
||||||
|
|
||||||
if (permission == Manifest.permission.WRITE_EXTERNAL_STORAGE &&
|
if (permission == Manifest.permission.WRITE_EXTERNAL_STORAGE && Build.VERSION.SDK_INT >= 29) {
|
||||||
Build.VERSION.SDK_INT >= 29) {
|
|
||||||
// We do not need external rw on 29+
|
// We do not need external rw on 29+
|
||||||
request.onSuccess()
|
request.onSuccess()
|
||||||
return
|
return
|
||||||
@@ -48,8 +49,11 @@ abstract class BaseActivity : AppCompatActivity() {
|
|||||||
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
|
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
|
||||||
request.onSuccess()
|
request.onSuccess()
|
||||||
} else {
|
} else {
|
||||||
val requestCode = Random.nextInt(256, 512)
|
var requestCode: Int
|
||||||
resultCallbacks[requestCode] = { result, _ ->
|
do {
|
||||||
|
requestCode = Random.nextInt(Const.ID.MAX_ACTIVITY_RESULT + 1, 1 shl 15)
|
||||||
|
} while (resultCallbacks.containsKey(requestCode))
|
||||||
|
resultCallbacks[requestCode] = { result, _ ->
|
||||||
if (result > 0)
|
if (result > 0)
|
||||||
request.onSuccess()
|
request.onSuccess()
|
||||||
else
|
else
|
||||||
@@ -79,16 +83,17 @@ abstract class BaseActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
resultCallbacks[requestCode]?.also {
|
resultCallbacks[requestCode]?.also { callback ->
|
||||||
resultCallbacks.remove(requestCode)
|
resultCallbacks.remove(requestCode)
|
||||||
it(this, resultCode, data)
|
callback(this, resultCode, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startActivityForResult(intent: Intent, requestCode: Int, listener: RequestCallback) {
|
fun startActivityForResult(intent: Intent, requestCode: Int, callback: ActivityResultCallback) {
|
||||||
resultCallbacks[requestCode] = listener
|
resultCallbacks[requestCode] = callback
|
||||||
try {
|
try {
|
||||||
startActivityForResult(intent, requestCode)
|
startActivityForResult(intent, requestCode)
|
||||||
} catch (e: ActivityNotFoundException) {
|
} catch (e: ActivityNotFoundException) {
|
||||||
|
@@ -11,7 +11,7 @@ import com.topjohnwu.magisk.core.base.BaseService
|
|||||||
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.checkSum
|
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.checkSum
|
||||||
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
|
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
|
||||||
import com.topjohnwu.magisk.core.utils.ProgressInputStream
|
import com.topjohnwu.magisk.core.utils.ProgressInputStream
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.withStreams
|
import com.topjohnwu.magisk.ktx.withStreams
|
||||||
import com.topjohnwu.magisk.view.Notifications
|
import com.topjohnwu.magisk.view.Notifications
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -34,7 +34,7 @@ abstract class BaseDownloader : BaseService(), KoinComponent {
|
|||||||
private val notifications = Collections.synchronizedMap(HashMap<Int, Notification.Builder>())
|
private val notifications = Collections.synchronizedMap(HashMap<Int, Notification.Builder>())
|
||||||
private val coroutineScope = CoroutineScope(Dispatchers.IO)
|
private val coroutineScope = CoroutineScope(Dispatchers.IO)
|
||||||
|
|
||||||
val service: GithubRawServices by inject()
|
val service: NetworkService by inject()
|
||||||
|
|
||||||
// -- Service overrides
|
// -- Service overrides
|
||||||
|
|
||||||
|
@@ -41,3 +41,13 @@ data class StubJson(
|
|||||||
val versionCode: Int = -1,
|
val versionCode: Int = -1,
|
||||||
val link: String = ""
|
val link: String = ""
|
||||||
) : Parcelable
|
) : Parcelable
|
||||||
|
|
||||||
|
@JsonClass(generateAdapter = true)
|
||||||
|
data class CommitInfo(
|
||||||
|
val sha: String
|
||||||
|
)
|
||||||
|
|
||||||
|
@JsonClass(generateAdapter = true)
|
||||||
|
data class BranchInfo(
|
||||||
|
val commit: CommitInfo
|
||||||
|
)
|
||||||
|
@@ -4,7 +4,7 @@ import android.os.Parcelable
|
|||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import com.topjohnwu.magisk.core.Const
|
import com.topjohnwu.magisk.core.Const
|
||||||
import com.topjohnwu.magisk.data.repository.StringRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.get
|
import com.topjohnwu.magisk.ktx.get
|
||||||
import com.topjohnwu.magisk.ktx.legalFilename
|
import com.topjohnwu.magisk.ktx.legalFilename
|
||||||
import kotlinx.android.parcel.Parcelize
|
import kotlinx.android.parcel.Parcelize
|
||||||
@@ -23,7 +23,7 @@ data class Repo(
|
|||||||
var last_update: Long
|
var last_update: Long
|
||||||
) : BaseModule(), Parcelable {
|
) : BaseModule(), Parcelable {
|
||||||
|
|
||||||
private val stringRepo: StringRepository get() = get()
|
private val svc: NetworkService get() = get()
|
||||||
|
|
||||||
val lastUpdate get() = Date(last_update)
|
val lastUpdate get() = Date(last_update)
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ data class Repo(
|
|||||||
|
|
||||||
val downloadFilename: String get() = "$name-$version($versionCode).zip".legalFilename()
|
val downloadFilename: String get() = "$name-$version($versionCode).zip".legalFilename()
|
||||||
|
|
||||||
suspend fun readme() = stringRepo.getReadme(this)
|
suspend fun readme() = svc.fetchReadme(this)
|
||||||
|
|
||||||
val zipUrl: String get() = Const.Url.ZIP_URL.format(id)
|
val zipUrl: String get() = Const.Url.ZIP_URL.format(id)
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ data class Repo(
|
|||||||
@Throws(IllegalRepoException::class)
|
@Throws(IllegalRepoException::class)
|
||||||
suspend fun update(lastUpdate: Date? = null) {
|
suspend fun update(lastUpdate: Date? = null) {
|
||||||
lastUpdate?.let { last_update = it.time }
|
lastUpdate?.let { last_update = it.time }
|
||||||
loadProps(stringRepo.getMetadata(this))
|
loadProps(svc.fetchMetadata(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
class IllegalRepoException(message: String) : Exception(message)
|
class IllegalRepoException(message: String) : Exception(message)
|
||||||
|
@@ -13,7 +13,7 @@ import com.topjohnwu.magisk.core.Config
|
|||||||
import com.topjohnwu.magisk.core.utils.MediaStoreUtils
|
import com.topjohnwu.magisk.core.utils.MediaStoreUtils
|
||||||
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.inputStream
|
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.inputStream
|
||||||
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
|
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.di.Protected
|
import com.topjohnwu.magisk.di.Protected
|
||||||
import com.topjohnwu.magisk.events.dialog.EnvFixDialog
|
import com.topjohnwu.magisk.events.dialog.EnvFixDialog
|
||||||
import com.topjohnwu.magisk.ktx.reboot
|
import com.topjohnwu.magisk.ktx.reboot
|
||||||
@@ -29,6 +29,7 @@ import com.topjohnwu.superuser.io.SuFileInputStream
|
|||||||
import com.topjohnwu.superuser.io.SuFileOutputStream
|
import com.topjohnwu.superuser.io.SuFileOutputStream
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import net.jpountz.lz4.LZ4FrameInputStream
|
||||||
import org.kamranzafar.jtar.TarEntry
|
import org.kamranzafar.jtar.TarEntry
|
||||||
import org.kamranzafar.jtar.TarHeader
|
import org.kamranzafar.jtar.TarHeader
|
||||||
import org.kamranzafar.jtar.TarInputStream
|
import org.kamranzafar.jtar.TarInputStream
|
||||||
@@ -38,6 +39,7 @@ import org.koin.core.get
|
|||||||
import org.koin.core.inject
|
import org.koin.core.inject
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.*
|
import java.io.*
|
||||||
|
import java.nio.ByteBuffer
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
import java.util.zip.ZipInputStream
|
import java.util.zip.ZipInputStream
|
||||||
|
|
||||||
@@ -51,7 +53,7 @@ abstract class MagiskInstallImpl : KoinComponent {
|
|||||||
private val logs: MutableList<String>
|
private val logs: MutableList<String>
|
||||||
private var tarOut: TarOutputStream? = null
|
private var tarOut: TarOutputStream? = null
|
||||||
|
|
||||||
private val service: GithubRawServices by inject()
|
private val service: NetworkService by inject()
|
||||||
protected val context: Context by inject()
|
protected val context: Context by inject()
|
||||||
|
|
||||||
protected constructor() {
|
protected constructor() {
|
||||||
@@ -97,8 +99,7 @@ abstract class MagiskInstallImpl : KoinComponent {
|
|||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
private fun extractZip(): Boolean {
|
private fun extractZip(): Boolean {
|
||||||
val arch: String
|
val arch = if (Build.VERSION.SDK_INT >= 21) {
|
||||||
arch = if (Build.VERSION.SDK_INT >= 21) {
|
|
||||||
val abis = listOf(*Build.SUPPORTED_ABIS)
|
val abis = listOf(*Build.SUPPORTED_ABIS)
|
||||||
if (abis.contains("x86")) "x86" else "arm"
|
if (abis.contains("x86")) "x86" else "arm"
|
||||||
} else {
|
} else {
|
||||||
@@ -163,21 +164,36 @@ abstract class MagiskInstallImpl : KoinComponent {
|
|||||||
val tarOut = TarOutputStream(output)
|
val tarOut = TarOutputStream(output)
|
||||||
TarInputStream(input).use { tarIn ->
|
TarInputStream(input).use { tarIn ->
|
||||||
lateinit var entry: TarEntry
|
lateinit var entry: TarEntry
|
||||||
|
|
||||||
|
fun decompressedStream() =
|
||||||
|
if (entry.name.contains(".lz4")) LZ4FrameInputStream(tarIn) else tarIn
|
||||||
|
|
||||||
while (tarIn.nextEntry?.let { entry = it } != null) {
|
while (tarIn.nextEntry?.let { entry = it } != null) {
|
||||||
if (entry.name.contains("boot.img") ||
|
if (entry.name.contains("boot.img") ||
|
||||||
(Config.recovery && entry.name.contains("recovery.img"))) {
|
(Config.recovery && entry.name.contains("recovery.img"))) {
|
||||||
val name = entry.name
|
val name = entry.name.replace(".lz4", "")
|
||||||
console.add("-- Extracting: $name")
|
console.add("-- Extracting: $name")
|
||||||
|
|
||||||
val extract = File(installDir, name)
|
val extract = File(installDir, name)
|
||||||
FileOutputStream(extract).use { tarIn.copyTo(it) }
|
FileOutputStream(extract).use { decompressedStream().copyTo(it) }
|
||||||
if (name.contains(".lz4")) {
|
} else if (entry.name.contains("vbmeta.img")) {
|
||||||
console.add("-- Decompressing: $name")
|
val rawData = ByteArrayOutputStream().let {
|
||||||
"./magiskboot decompress $extract".sh()
|
decompressedStream().copyTo(it)
|
||||||
|
it.toByteArray()
|
||||||
}
|
}
|
||||||
|
// Valid vbmeta.img should be at least 256 bytes
|
||||||
|
if (rawData.size < 256)
|
||||||
|
continue
|
||||||
|
|
||||||
|
// Patch flags to AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED
|
||||||
|
console.add("-- Patching: vbmeta.img")
|
||||||
|
ByteBuffer.wrap(rawData).putInt(120, 2)
|
||||||
|
tarOut.putNextEntry(newEntry("vbmeta.img", rawData.size.toLong()))
|
||||||
|
tarOut.write(rawData)
|
||||||
} else {
|
} else {
|
||||||
console.add("-- Copying: " + entry.name)
|
console.add("-- Copying: ${entry.name}")
|
||||||
tarOut.putNextEntry(entry)
|
tarOut.putNextEntry(entry)
|
||||||
tarIn.copyTo(tarOut)
|
tarIn.copyTo(tarOut, bufferSize = 1024 * 1024)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val boot = SuFile.open(installDir, "boot.img")
|
val boot = SuFile.open(installDir, "boot.img")
|
||||||
|
@@ -10,7 +10,7 @@ import com.topjohnwu.magisk.core.Info
|
|||||||
import com.topjohnwu.magisk.core.isRunningAsStub
|
import com.topjohnwu.magisk.core.isRunningAsStub
|
||||||
import com.topjohnwu.magisk.core.utils.AXML
|
import com.topjohnwu.magisk.core.utils.AXML
|
||||||
import com.topjohnwu.magisk.core.utils.Keygen
|
import com.topjohnwu.magisk.core.utils.Keygen
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.get
|
import com.topjohnwu.magisk.ktx.get
|
||||||
import com.topjohnwu.magisk.ktx.writeTo
|
import com.topjohnwu.magisk.ktx.writeTo
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
@@ -91,7 +91,7 @@ object PatchAPK {
|
|||||||
val dlStub = !isRunningAsStub && SDK_INT >= 28 && Const.Version.atLeast_20_2()
|
val dlStub = !isRunningAsStub && SDK_INT >= 28 && Const.Version.atLeast_20_2()
|
||||||
val src = if (dlStub) {
|
val src = if (dlStub) {
|
||||||
val stub = File(context.cacheDir, "stub.apk")
|
val stub = File(context.cacheDir, "stub.apk")
|
||||||
val svc = get<GithubRawServices>()
|
val svc = get<NetworkService>()
|
||||||
try {
|
try {
|
||||||
svc.fetchFile(Info.remote.stub.link).byteStream().use {
|
svc.fetchFile(Info.remote.stub.link).byteStream().use {
|
||||||
it.writeTo(stub)
|
it.writeTo(stub)
|
||||||
|
@@ -4,7 +4,7 @@ import com.squareup.moshi.JsonClass
|
|||||||
import com.topjohnwu.magisk.core.Const
|
import com.topjohnwu.magisk.core.Const
|
||||||
import com.topjohnwu.magisk.core.model.module.Repo
|
import com.topjohnwu.magisk.core.model.module.Repo
|
||||||
import com.topjohnwu.magisk.data.database.RepoDao
|
import com.topjohnwu.magisk.data.database.RepoDao
|
||||||
import com.topjohnwu.magisk.data.network.GithubApiServices
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.synchronized
|
import com.topjohnwu.magisk.ktx.synchronized
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
@@ -14,7 +14,7 @@ import java.util.*
|
|||||||
import kotlin.collections.HashSet
|
import kotlin.collections.HashSet
|
||||||
|
|
||||||
class RepoUpdater(
|
class RepoUpdater(
|
||||||
private val api: GithubApiServices,
|
private val svc: NetworkService,
|
||||||
private val repoDB: RepoDao
|
private val repoDB: RepoDao
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ class RepoUpdater(
|
|||||||
etag: String = ""
|
etag: String = ""
|
||||||
): PageResult = coroutineScope {
|
): PageResult = coroutineScope {
|
||||||
runCatching {
|
runCatching {
|
||||||
val result = api.fetchRepos(page, etag)
|
val result = svc.fetchRepos(page, etag)
|
||||||
result.run {
|
result.run {
|
||||||
if (code() == HttpURLConnection.HTTP_NOT_MODIFIED)
|
if (code() == HttpURLConnection.HTTP_NOT_MODIFIED)
|
||||||
return@coroutineScope PageResult.CACHED
|
return@coroutineScope PageResult.CACHED
|
||||||
|
@@ -101,7 +101,7 @@ object MediaStoreUtils {
|
|||||||
|
|
||||||
fun Uri.inputStream() = cr.openInputStream(this) ?: throw FileNotFoundException()
|
fun Uri.inputStream() = cr.openInputStream(this) ?: throw FileNotFoundException()
|
||||||
|
|
||||||
fun Uri.outputStream() = cr.openOutputStream(this) ?: throw FileNotFoundException()
|
fun Uri.outputStream() = cr.openOutputStream(this, "rwt") ?: throw FileNotFoundException()
|
||||||
|
|
||||||
val Uri.displayName: String get() {
|
val Uri.displayName: String get() {
|
||||||
if (scheme == "file") {
|
if (scheme == "file") {
|
||||||
|
@@ -1,12 +1,24 @@
|
|||||||
package com.topjohnwu.magisk.data.network
|
package com.topjohnwu.magisk.data.network
|
||||||
|
|
||||||
import com.topjohnwu.magisk.core.Const
|
import com.topjohnwu.magisk.core.Const
|
||||||
|
import com.topjohnwu.magisk.core.model.BranchInfo
|
||||||
import com.topjohnwu.magisk.core.model.UpdateInfo
|
import com.topjohnwu.magisk.core.model.UpdateInfo
|
||||||
import com.topjohnwu.magisk.core.tasks.GithubRepoInfo
|
import com.topjohnwu.magisk.core.tasks.GithubRepoInfo
|
||||||
import okhttp3.ResponseBody
|
import okhttp3.ResponseBody
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import retrofit2.http.*
|
import retrofit2.http.*
|
||||||
|
|
||||||
|
private const val REVISION = "revision"
|
||||||
|
private const val MODULE = "module"
|
||||||
|
private const val FILE = "file"
|
||||||
|
private const val IF_NONE_MATCH = "If-None-Match"
|
||||||
|
private const val BRANCH = "branch"
|
||||||
|
private const val REPO = "repo"
|
||||||
|
|
||||||
|
const val MAGISK_FILES = "topjohnwu/magisk_files"
|
||||||
|
const val MAGISK_MAIN = "topjohnwu/Magisk"
|
||||||
|
private const val MAGISK_MODULES = "Magisk-Modules-Repo"
|
||||||
|
|
||||||
interface GithubPageServices {
|
interface GithubPageServices {
|
||||||
|
|
||||||
@GET("stable.json")
|
@GET("stable.json")
|
||||||
@@ -16,43 +28,32 @@ interface GithubPageServices {
|
|||||||
suspend fun fetchBetaUpdate(): UpdateInfo
|
suspend fun fetchBetaUpdate(): UpdateInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface JSDelivrServices {
|
||||||
|
|
||||||
|
@GET("$MAGISK_FILES@{$REVISION}/snet")
|
||||||
|
@Streaming
|
||||||
|
suspend fun fetchSafetynet(@Path(REVISION) revision: String = Const.SNET_REVISION): ResponseBody
|
||||||
|
|
||||||
|
@GET("$MAGISK_FILES@{$REVISION}/bootctl")
|
||||||
|
@Streaming
|
||||||
|
suspend fun fetchBootctl(@Path(REVISION) revision: String = Const.BOOTCTL_REVISION): ResponseBody
|
||||||
|
|
||||||
|
@GET("$MAGISK_FILES@{$REVISION}/canary.json")
|
||||||
|
suspend fun fetchCanaryUpdate(@Path(REVISION) revision: String): UpdateInfo
|
||||||
|
|
||||||
|
@GET("$MAGISK_MAIN@{$REVISION}/scripts/module_installer.sh")
|
||||||
|
@Streaming
|
||||||
|
suspend fun fetchInstaller(@Path(REVISION) revision: String): ResponseBody
|
||||||
|
}
|
||||||
|
|
||||||
interface GithubRawServices {
|
interface GithubRawServices {
|
||||||
|
|
||||||
//region topjohnwu/magisk_files
|
|
||||||
|
|
||||||
@GET("$MAGISK_FILES/master/stable.json")
|
|
||||||
suspend fun fetchStableUpdate(): UpdateInfo
|
|
||||||
|
|
||||||
@GET("$MAGISK_FILES/master/beta.json")
|
|
||||||
suspend fun fetchBetaUpdate(): UpdateInfo
|
|
||||||
|
|
||||||
@GET("$MAGISK_FILES/canary/debug.json")
|
|
||||||
suspend fun fetchCanaryUpdate(): UpdateInfo
|
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
suspend fun fetchCustomUpdate(@Url url: String): UpdateInfo
|
suspend fun fetchCustomUpdate(@Url url: String): UpdateInfo
|
||||||
|
|
||||||
@GET("$MAGISK_FILES/{$REVISION}/snet.jar")
|
|
||||||
@Streaming
|
|
||||||
suspend fun fetchSafetynet(@Path(REVISION) revision: String = Const.SNET_REVISION): ResponseBody
|
|
||||||
|
|
||||||
@GET("$MAGISK_FILES/{$REVISION}/bootctl")
|
|
||||||
@Streaming
|
|
||||||
suspend fun fetchBootctl(@Path(REVISION) revision: String = Const.BOOTCTL_REVISION): ResponseBody
|
|
||||||
|
|
||||||
@GET("$MAGISK_MASTER/scripts/module_installer.sh")
|
|
||||||
@Streaming
|
|
||||||
suspend fun fetchInstaller(): ResponseBody
|
|
||||||
|
|
||||||
@GET("$MAGISK_MODULES/{$MODULE}/master/{$FILE}")
|
@GET("$MAGISK_MODULES/{$MODULE}/master/{$FILE}")
|
||||||
suspend fun fetchModuleFile(@Path(MODULE) id: String, @Path(FILE) file: String): String
|
suspend fun fetchModuleFile(@Path(MODULE) id: String, @Path(FILE) file: String): String
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method shall be used exclusively for fetching files from urls from previous requests.
|
|
||||||
* Him, who uses it in a wrong way, shall die in an eternal flame.
|
|
||||||
* */
|
|
||||||
@GET
|
@GET
|
||||||
@Streaming
|
@Streaming
|
||||||
suspend fun fetchFile(@Url url: String): ResponseBody
|
suspend fun fetchFile(@Url url: String): ResponseBody
|
||||||
@@ -60,28 +61,24 @@ interface GithubRawServices {
|
|||||||
@GET
|
@GET
|
||||||
suspend fun fetchString(@Url url: String): String
|
suspend fun fetchString(@Url url: String): String
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val REVISION = "revision"
|
|
||||||
private const val MODULE = "module"
|
|
||||||
private const val FILE = "file"
|
|
||||||
|
|
||||||
|
|
||||||
private const val MAGISK_FILES = "topjohnwu/magisk_files"
|
|
||||||
private const val MAGISK_MASTER = "topjohnwu/Magisk/master"
|
|
||||||
private const val MAGISK_MODULES = "Magisk-Modules-Repo"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface GithubApiServices {
|
interface GithubApiServices {
|
||||||
|
|
||||||
@GET("repos")
|
@GET("users/$MAGISK_MODULES/repos")
|
||||||
|
@Headers("Accept: application/vnd.github.v3+json")
|
||||||
suspend fun fetchRepos(
|
suspend fun fetchRepos(
|
||||||
@Query("page") page: Int,
|
@Query("page") page: Int,
|
||||||
@Header(Const.Key.IF_NONE_MATCH) etag: String,
|
@Header(IF_NONE_MATCH) etag: String,
|
||||||
@Query("sort") sort: String = "pushed",
|
@Query("sort") sort: String = "pushed",
|
||||||
@Query("per_page") count: Int = 100
|
@Query("per_page") count: Int = 100
|
||||||
): Response<List<GithubRepoInfo>>
|
): Response<List<GithubRepoInfo>>
|
||||||
|
|
||||||
|
@GET("repos/{$REPO}/branches/{$BRANCH}")
|
||||||
|
@Headers("Accept: application/vnd.github.v3+json")
|
||||||
|
suspend fun fetchBranch(
|
||||||
|
@Path(REPO, encoded = true) repo: String,
|
||||||
|
@Path(BRANCH) branch: String
|
||||||
|
): BranchInfo
|
||||||
}
|
}
|
||||||
|
|
@@ -1,39 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.repository
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.core.Config
|
|
||||||
import com.topjohnwu.magisk.core.Info
|
|
||||||
import com.topjohnwu.magisk.data.network.GithubPageServices
|
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
|
||||||
import retrofit2.HttpException
|
|
||||||
import timber.log.Timber
|
|
||||||
import java.io.IOException
|
|
||||||
|
|
||||||
class MagiskRepository(
|
|
||||||
private val rawSvc: GithubRawServices,
|
|
||||||
private val pageSvc: GithubPageServices
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend fun fetchUpdate() = try {
|
|
||||||
var info = when (Config.updateChannel) {
|
|
||||||
Config.Value.DEFAULT_CHANNEL, Config.Value.STABLE_CHANNEL -> pageSvc.fetchStableUpdate()
|
|
||||||
Config.Value.BETA_CHANNEL -> pageSvc.fetchBetaUpdate()
|
|
||||||
Config.Value.CANARY_CHANNEL -> rawSvc.fetchCanaryUpdate()
|
|
||||||
Config.Value.CUSTOM_CHANNEL -> rawSvc.fetchCustomUpdate(Config.customChannelUrl)
|
|
||||||
else -> throw IllegalArgumentException()
|
|
||||||
}
|
|
||||||
if (info.magisk.versionCode < Info.env.magiskVersionCode &&
|
|
||||||
Config.updateChannel == Config.Value.DEFAULT_CHANNEL) {
|
|
||||||
Config.updateChannel = Config.Value.BETA_CHANNEL
|
|
||||||
info = pageSvc.fetchBetaUpdate()
|
|
||||||
}
|
|
||||||
Info.remote = info
|
|
||||||
info
|
|
||||||
} catch (e: IOException) {
|
|
||||||
Timber.e(e)
|
|
||||||
null
|
|
||||||
} catch (e: HttpException) {
|
|
||||||
Timber.e(e)
|
|
||||||
null
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -0,0 +1,89 @@
|
|||||||
|
package com.topjohnwu.magisk.data.repository
|
||||||
|
|
||||||
|
import com.topjohnwu.magisk.core.Config
|
||||||
|
import com.topjohnwu.magisk.core.Config.Value.BETA_CHANNEL
|
||||||
|
import com.topjohnwu.magisk.core.Config.Value.CANARY_CHANNEL
|
||||||
|
import com.topjohnwu.magisk.core.Config.Value.CUSTOM_CHANNEL
|
||||||
|
import com.topjohnwu.magisk.core.Config.Value.DEFAULT_CHANNEL
|
||||||
|
import com.topjohnwu.magisk.core.Config.Value.STABLE_CHANNEL
|
||||||
|
import com.topjohnwu.magisk.core.Const
|
||||||
|
import com.topjohnwu.magisk.core.Info
|
||||||
|
import com.topjohnwu.magisk.core.model.*
|
||||||
|
import com.topjohnwu.magisk.core.model.module.Repo
|
||||||
|
import com.topjohnwu.magisk.data.network.*
|
||||||
|
import okhttp3.ResponseBody
|
||||||
|
import retrofit2.HttpException
|
||||||
|
import timber.log.Timber
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
class NetworkService(
|
||||||
|
private val pages: GithubPageServices,
|
||||||
|
private val raw: GithubRawServices,
|
||||||
|
private val jsd: JSDelivrServices,
|
||||||
|
private val api: GithubApiServices
|
||||||
|
) {
|
||||||
|
suspend fun fetchUpdate() = try {
|
||||||
|
var info = when (Config.updateChannel) {
|
||||||
|
DEFAULT_CHANNEL, STABLE_CHANNEL -> fetchStableUpdate()
|
||||||
|
BETA_CHANNEL -> fetchBetaUpdate()
|
||||||
|
CANARY_CHANNEL -> fetchCanaryUpdate()
|
||||||
|
CUSTOM_CHANNEL -> fetchCustomUpdate(Config.customChannelUrl)
|
||||||
|
else -> throw IllegalArgumentException()
|
||||||
|
}
|
||||||
|
if (info.magisk.versionCode < Info.env.magiskVersionCode &&
|
||||||
|
Config.updateChannel == DEFAULT_CHANNEL
|
||||||
|
) {
|
||||||
|
Config.updateChannel = BETA_CHANNEL
|
||||||
|
info = fetchBetaUpdate()
|
||||||
|
}
|
||||||
|
Info.remote = info
|
||||||
|
info
|
||||||
|
} catch (e: IOException) {
|
||||||
|
Timber.e(e)
|
||||||
|
null
|
||||||
|
} catch (e: HttpException) {
|
||||||
|
Timber.e(e)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateInfo
|
||||||
|
suspend fun fetchStableUpdate() = pages.fetchStableUpdate()
|
||||||
|
suspend fun fetchBetaUpdate() = pages.fetchBetaUpdate()
|
||||||
|
suspend fun fetchCustomUpdate(url: String) = raw.fetchCustomUpdate(url)
|
||||||
|
suspend fun fetchCanaryUpdate(): UpdateInfo {
|
||||||
|
val sha = fetchCanaryVersion()
|
||||||
|
val info = jsd.fetchCanaryUpdate(sha)
|
||||||
|
|
||||||
|
fun genCDNUrl(name: String) = "${Const.Url.JS_DELIVR_URL}${MAGISK_FILES}@${sha}/${name}"
|
||||||
|
fun ManagerJson.updateCopy() = copy(link = genCDNUrl(link), note = genCDNUrl(note))
|
||||||
|
fun MagiskJson.updateCopy() = copy(link = genCDNUrl(link), note = genCDNUrl(note))
|
||||||
|
fun StubJson.updateCopy() = copy(link = genCDNUrl(link))
|
||||||
|
fun UninstallerJson.updateCopy() = copy(link = genCDNUrl(link))
|
||||||
|
|
||||||
|
return info.copy(
|
||||||
|
app = info.app.updateCopy(),
|
||||||
|
magisk = info.magisk.updateCopy(),
|
||||||
|
stub = info.stub.updateCopy(),
|
||||||
|
uninstaller = info.uninstaller.updateCopy()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Byte streams
|
||||||
|
suspend fun fetchSafetynet() = jsd.fetchSafetynet()
|
||||||
|
suspend fun fetchBootctl() = jsd.fetchBootctl()
|
||||||
|
suspend fun fetchInstaller(): ResponseBody {
|
||||||
|
val sha = fetchMainVersion()
|
||||||
|
return jsd.fetchInstaller(sha)
|
||||||
|
}
|
||||||
|
suspend fun fetchFile(url: String) = raw.fetchFile(url)
|
||||||
|
|
||||||
|
// Strings
|
||||||
|
suspend fun fetchMetadata(repo: Repo) = raw.fetchModuleFile(repo.id, "module.prop")
|
||||||
|
suspend fun fetchReadme(repo: Repo) = raw.fetchModuleFile(repo.id, "README.md")
|
||||||
|
suspend fun fetchString(url: String) = raw.fetchString(url)
|
||||||
|
|
||||||
|
// API calls
|
||||||
|
suspend fun fetchRepos(page: Int, etag: String) = api.fetchRepos(page, etag)
|
||||||
|
private suspend fun fetchCanaryVersion() = api.fetchBranch(MAGISK_FILES, "canary").commit.sha
|
||||||
|
private suspend fun fetchMainVersion() = api.fetchBranch(MAGISK_MAIN, "master").commit.sha
|
||||||
|
}
|
@@ -1,16 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.data.repository
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.core.model.module.Repo
|
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
|
||||||
|
|
||||||
class StringRepository(
|
|
||||||
private val api: GithubRawServices
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend fun getString(url: String) = api.fetchString(url)
|
|
||||||
|
|
||||||
suspend fun getMetadata(repo: Repo) = api.fetchModuleFile(repo.id, "module.prop")
|
|
||||||
|
|
||||||
suspend fun getReadme(repo: Repo) = api.fetchModuleFile(repo.id, "README.md")
|
|
||||||
|
|
||||||
}
|
|
@@ -9,6 +9,7 @@ import com.topjohnwu.magisk.core.Info
|
|||||||
import com.topjohnwu.magisk.data.network.GithubApiServices
|
import com.topjohnwu.magisk.data.network.GithubApiServices
|
||||||
import com.topjohnwu.magisk.data.network.GithubPageServices
|
import com.topjohnwu.magisk.data.network.GithubPageServices
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.network.GithubRawServices
|
||||||
|
import com.topjohnwu.magisk.data.network.JSDelivrServices
|
||||||
import com.topjohnwu.magisk.ktx.precomputedText
|
import com.topjohnwu.magisk.ktx.precomputedText
|
||||||
import com.topjohnwu.magisk.net.Networking
|
import com.topjohnwu.magisk.net.Networking
|
||||||
import com.topjohnwu.magisk.net.NoSSLv3SocketFactory
|
import com.topjohnwu.magisk.net.NoSSLv3SocketFactory
|
||||||
@@ -32,6 +33,7 @@ val networkingModule = module {
|
|||||||
single { createApiService<GithubRawServices>(get(), Const.Url.GITHUB_RAW_URL) }
|
single { createApiService<GithubRawServices>(get(), Const.Url.GITHUB_RAW_URL) }
|
||||||
single { createApiService<GithubApiServices>(get(), Const.Url.GITHUB_API_URL) }
|
single { createApiService<GithubApiServices>(get(), Const.Url.GITHUB_API_URL) }
|
||||||
single { createApiService<GithubPageServices>(get(), Const.Url.GITHUB_PAGE_URL) }
|
single { createApiService<GithubPageServices>(get(), Const.Url.GITHUB_PAGE_URL) }
|
||||||
|
single { createApiService<JSDelivrServices>(get(), Const.Url.JS_DELIVR_URL) }
|
||||||
single { createMarkwon(get(), get()) }
|
single { createMarkwon(get(), get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,13 +1,11 @@
|
|||||||
package com.topjohnwu.magisk.di
|
package com.topjohnwu.magisk.di
|
||||||
|
|
||||||
import com.topjohnwu.magisk.data.repository.LogRepository
|
import com.topjohnwu.magisk.data.repository.LogRepository
|
||||||
import com.topjohnwu.magisk.data.repository.MagiskRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.data.repository.StringRepository
|
|
||||||
import org.koin.dsl.module
|
import org.koin.dsl.module
|
||||||
|
|
||||||
|
|
||||||
val repositoryModule = module {
|
val repositoryModule = module {
|
||||||
single { MagiskRepository(get(), get()) }
|
|
||||||
single { LogRepository(get()) }
|
single { LogRepository(get()) }
|
||||||
single { StringRepository(get()) }
|
single { NetworkService(get(), get(), get(), get()) }
|
||||||
}
|
}
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.events
|
|
||||||
|
|
||||||
import android.Manifest
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.ActivityNotFoundException
|
|
||||||
import android.content.Intent
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.annotation.RequiresPermission
|
|
||||||
import androidx.navigation.NavDirections
|
|
||||||
import com.topjohnwu.magisk.MainDirections
|
|
||||||
import com.topjohnwu.magisk.R
|
|
||||||
import com.topjohnwu.magisk.arch.ActivityExecutor
|
|
||||||
import com.topjohnwu.magisk.arch.BaseUIActivity
|
|
||||||
import com.topjohnwu.magisk.arch.ViewEvent
|
|
||||||
import com.topjohnwu.magisk.core.Const
|
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
|
||||||
|
|
||||||
class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor {
|
|
||||||
|
|
||||||
@RequiresPermission(allOf = [Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE])
|
|
||||||
override fun invoke(activity: BaseUIActivity<*, *>) {
|
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
|
||||||
intent.type = "application/zip"
|
|
||||||
try {
|
|
||||||
activity.startActivityForResult(intent, Const.ID.FETCH_ZIP)
|
|
||||||
} catch (e: ActivityNotFoundException) {
|
|
||||||
Utils.toast(R.string.app_not_found, Toast.LENGTH_SHORT)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): NavDirections? {
|
|
||||||
if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) {
|
|
||||||
val data = data.data
|
|
||||||
if (data != null) {
|
|
||||||
return MainDirections.actionFlashFragment(data, Const.Value.FLASH_ZIP)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -6,8 +6,11 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.navigation.NavDirections
|
import androidx.navigation.NavDirections
|
||||||
|
import com.topjohnwu.magisk.MainDirections
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.arch.*
|
import com.topjohnwu.magisk.arch.*
|
||||||
|
import com.topjohnwu.magisk.core.Const
|
||||||
|
import com.topjohnwu.magisk.core.base.ActivityResultCallback
|
||||||
import com.topjohnwu.magisk.core.base.BaseActivity
|
import com.topjohnwu.magisk.core.base.BaseActivity
|
||||||
import com.topjohnwu.magisk.core.model.module.Repo
|
import com.topjohnwu.magisk.core.model.module.Repo
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
import com.topjohnwu.magisk.utils.Utils
|
||||||
@@ -67,27 +70,16 @@ class RecreateEvent : ViewEvent(), ActivityExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RequestFileEvent : ViewEvent(), ActivityExecutor {
|
class MagiskInstallFileEvent(private val callback: ActivityResultCallback)
|
||||||
|
: ViewEvent(), ActivityExecutor {
|
||||||
override fun invoke(activity: BaseUIActivity<*, *>) {
|
override fun invoke(activity: BaseUIActivity<*, *>) {
|
||||||
Intent(Intent.ACTION_GET_CONTENT)
|
val intent = Intent(Intent.ACTION_GET_CONTENT).setType("*/*")
|
||||||
.setType("*/*")
|
try {
|
||||||
.addCategory(Intent.CATEGORY_OPENABLE)
|
activity.startActivityForResult(intent, Const.ID.SELECT_FILE, callback)
|
||||||
.also {
|
Utils.toast(R.string.patch_file_msg, Toast.LENGTH_LONG)
|
||||||
try {
|
} catch (e: ActivityNotFoundException) {
|
||||||
activity.startActivityForResult(it, REQUEST_CODE)
|
Utils.toast(R.string.app_not_found, Toast.LENGTH_SHORT)
|
||||||
Utils.toast(R.string.patch_file_msg, Toast.LENGTH_LONG)
|
}
|
||||||
} catch (e: ActivityNotFoundException) {
|
|
||||||
Utils.toast(R.string.app_not_found, Toast.LENGTH_SHORT)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val REQUEST_CODE = 10
|
|
||||||
fun resolve(requestCode: Int, resultCode: Int, data: Intent?) = data
|
|
||||||
?.takeIf { resultCode == Activity.RESULT_OK }
|
|
||||||
?.takeIf { requestCode == REQUEST_CODE }
|
|
||||||
?.data
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,3 +98,22 @@ class AddHomeIconEvent : ViewEvent(), ContextExecutor {
|
|||||||
Shortcuts.addHomeIcon(context)
|
Shortcuts.addHomeIcon(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SelectModuleEvent : ViewEvent(), FragmentExecutor {
|
||||||
|
override fun invoke(fragment: BaseUIFragment<*, *>) {
|
||||||
|
val intent = Intent(Intent.ACTION_GET_CONTENT).setType("application/zip")
|
||||||
|
try {
|
||||||
|
fragment.apply {
|
||||||
|
activity.startActivityForResult(intent, Const.ID.FETCH_ZIP) { code, intent ->
|
||||||
|
if (code == Activity.RESULT_OK && intent != null) {
|
||||||
|
intent.data?.also {
|
||||||
|
MainDirections.actionFlashFragment(it, Const.Value.FLASH_ZIP).navigate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: ActivityNotFoundException) {
|
||||||
|
Utils.toast(R.string.app_not_found, Toast.LENGTH_SHORT)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.events.dialog
|
package com.topjohnwu.magisk.events.dialog
|
||||||
|
|
||||||
|
import android.app.ProgressDialog
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.core.Info
|
import com.topjohnwu.magisk.core.Info
|
||||||
@@ -17,8 +18,7 @@ class UninstallDialog : DialogEvent() {
|
|||||||
.applyMessage(R.string.uninstall_magisk_msg)
|
.applyMessage(R.string.uninstall_magisk_msg)
|
||||||
.applyButton(MagiskDialog.ButtonType.POSITIVE) {
|
.applyButton(MagiskDialog.ButtonType.POSITIVE) {
|
||||||
titleRes = R.string.restore_img
|
titleRes = R.string.restore_img
|
||||||
preventDismiss = true
|
onClick { restore() }
|
||||||
onClick { restore(dialog) }
|
|
||||||
}
|
}
|
||||||
if (Info.remote.uninstaller.link.isNotEmpty()) {
|
if (Info.remote.uninstaller.link.isNotEmpty()) {
|
||||||
dialog.applyButton(MagiskDialog.ButtonType.NEGATIVE) {
|
dialog.applyButton(MagiskDialog.ButtonType.NEGATIVE) {
|
||||||
@@ -28,13 +28,12 @@ class UninstallDialog : DialogEvent() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun restore(dialog: MagiskDialog) {
|
@Suppress("DEPRECATION")
|
||||||
dialog.applyTitle(R.string.restore_img)
|
private fun restore() {
|
||||||
.applyMessage(R.string.restore_img_msg)
|
val dialog = ProgressDialog(dialog.context).apply {
|
||||||
.applyButton(MagiskDialog.ButtonType.POSITIVE) {
|
setMessage(dialog.context.getString(R.string.restore_img_msg))
|
||||||
title = ""
|
show()
|
||||||
}
|
}
|
||||||
.cancellable(false)
|
|
||||||
|
|
||||||
Shell.su("restore_imgs").submit { result ->
|
Shell.su("restore_imgs").submit { result ->
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
|
@@ -39,14 +39,19 @@ class HideItem(
|
|||||||
get() = state
|
get() = state
|
||||||
set(value) = set(value, state, { state = it }, BR.hiddenState) {
|
set(value) = set(value, state, { state = it }, BR.hiddenState) {
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
processes.filterNot { it.isHidden }
|
processes
|
||||||
|
.filterNot { it.isHidden }
|
||||||
|
.filter { isExpanded || it.process.name == it.process.packageName }
|
||||||
} else {
|
} else {
|
||||||
processes
|
processes
|
||||||
|
.filter { it.isHidden }
|
||||||
|
.filter { isExpanded || it.process.name == it.process.packageName }
|
||||||
}.forEach { it.toggle() }
|
}.forEach { it.toggle() }
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
processes.forEach { it.addOnPropertyChangedCallback(BR.hidden) { recalculateChecked() } }
|
processes.forEach { it.addOnPropertyChangedCallback(BR.hidden) { recalculateChecked() } }
|
||||||
|
addOnPropertyChangedCallback(BR.expanded) { recalculateChecked() }
|
||||||
recalculateChecked()
|
recalculateChecked()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,10 +62,14 @@ class HideItem(
|
|||||||
|
|
||||||
private fun recalculateChecked() {
|
private fun recalculateChecked() {
|
||||||
itemsChecked = processes.count { it.isHidden }
|
itemsChecked = processes.count { it.isHidden }
|
||||||
state = when (itemsChecked) {
|
state = if (isExpanded) {
|
||||||
0 -> false
|
when (itemsChecked) {
|
||||||
processes.size -> true
|
0 -> false
|
||||||
else -> null
|
processes.size -> true
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
processes.find { it.isHidden && it.process.name == it.process.packageName } != null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@ import com.topjohnwu.magisk.core.download.Subject
|
|||||||
import com.topjohnwu.magisk.core.download.Subject.Manager
|
import com.topjohnwu.magisk.core.download.Subject.Manager
|
||||||
import com.topjohnwu.magisk.core.model.MagiskJson
|
import com.topjohnwu.magisk.core.model.MagiskJson
|
||||||
import com.topjohnwu.magisk.core.model.ManagerJson
|
import com.topjohnwu.magisk.core.model.ManagerJson
|
||||||
import com.topjohnwu.magisk.data.repository.MagiskRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.events.OpenInappLinkEvent
|
import com.topjohnwu.magisk.events.OpenInappLinkEvent
|
||||||
import com.topjohnwu.magisk.events.SnackbarEvent
|
import com.topjohnwu.magisk.events.SnackbarEvent
|
||||||
import com.topjohnwu.magisk.events.dialog.EnvFixDialog
|
import com.topjohnwu.magisk.events.dialog.EnvFixDialog
|
||||||
@@ -32,7 +32,7 @@ enum class MagiskState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class HomeViewModel(
|
class HomeViewModel(
|
||||||
private val repoMagisk: MagiskRepository
|
private val svc: NetworkService
|
||||||
) : BaseViewModel() {
|
) : BaseViewModel() {
|
||||||
|
|
||||||
@get:Bindable
|
@get:Bindable
|
||||||
@@ -84,7 +84,7 @@ class HomeViewModel(
|
|||||||
state = State.LOADING
|
state = State.LOADING
|
||||||
notifyPropertyChanged(BR.showUninstall)
|
notifyPropertyChanged(BR.showUninstall)
|
||||||
notifyPropertyChanged(BR.showSafetyNet)
|
notifyPropertyChanged(BR.showSafetyNet)
|
||||||
repoMagisk.fetchUpdate()?.apply {
|
svc.fetchUpdate()?.apply {
|
||||||
state = State.LOADED
|
state = State.LOADED
|
||||||
stateMagisk = when {
|
stateMagisk = when {
|
||||||
!Info.env.isActive -> MagiskState.NOT_INSTALLED
|
!Info.env.isActive -> MagiskState.NOT_INSTALLED
|
||||||
|
@@ -1,12 +1,14 @@
|
|||||||
package com.topjohnwu.magisk.ui.install
|
package com.topjohnwu.magisk.ui.install
|
||||||
|
|
||||||
import android.content.Intent
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.arch.BaseUIFragment
|
import com.topjohnwu.magisk.arch.BaseUIFragment
|
||||||
import com.topjohnwu.magisk.core.download.BaseDownloader
|
import com.topjohnwu.magisk.core.download.BaseDownloader
|
||||||
import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding
|
import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding
|
||||||
import com.topjohnwu.magisk.events.RequestFileEvent
|
|
||||||
import com.topjohnwu.magisk.ktx.coroutineScope
|
import com.topjohnwu.magisk.ktx.coroutineScope
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
@@ -15,11 +17,6 @@ class InstallFragment : BaseUIFragment<InstallViewModel, FragmentInstallMd2Bindi
|
|||||||
override val layoutRes = R.layout.fragment_install_md2
|
override val layoutRes = R.layout.fragment_install_md2
|
||||||
override val viewModel by viewModel<InstallViewModel>()
|
override val viewModel by viewModel<InstallViewModel>()
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
|
||||||
viewModel.data = RequestFileEvent.resolve(requestCode, resultCode, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
requireActivity().setTitle(R.string.install)
|
requireActivity().setTitle(R.string.install)
|
||||||
@@ -29,4 +26,20 @@ class InstallFragment : BaseUIFragment<InstallViewModel, FragmentInstallMd2Bindi
|
|||||||
BaseDownloader.observeProgress(this, viewModel::onProgressUpdate)
|
BaseDownloader.observeProgress(this, viewModel::onProgressUpdate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View? {
|
||||||
|
viewModel._method = savedInstanceState?.getInt(KEY_CURRENT_METHOD, -1) ?: -1
|
||||||
|
return super.onCreateView(inflater, container, savedInstanceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
outState.putInt(KEY_CURRENT_METHOD, viewModel.method)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val KEY_CURRENT_METHOD = "current_method"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.topjohnwu.magisk.ui.install
|
package com.topjohnwu.magisk.ui.install
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.databinding.Bindable
|
import androidx.databinding.Bindable
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
@@ -10,8 +11,8 @@ import com.topjohnwu.magisk.core.Info
|
|||||||
import com.topjohnwu.magisk.core.download.Action
|
import com.topjohnwu.magisk.core.download.Action
|
||||||
import com.topjohnwu.magisk.core.download.DownloadService
|
import com.topjohnwu.magisk.core.download.DownloadService
|
||||||
import com.topjohnwu.magisk.core.download.Subject
|
import com.topjohnwu.magisk.core.download.Subject
|
||||||
import com.topjohnwu.magisk.data.repository.StringRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.events.RequestFileEvent
|
import com.topjohnwu.magisk.events.MagiskInstallFileEvent
|
||||||
import com.topjohnwu.magisk.events.dialog.SecondSlotWarningDialog
|
import com.topjohnwu.magisk.events.dialog.SecondSlotWarningDialog
|
||||||
import com.topjohnwu.magisk.utils.set
|
import com.topjohnwu.magisk.utils.set
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
@@ -20,7 +21,7 @@ import org.koin.core.get
|
|||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
class InstallViewModel(
|
class InstallViewModel(
|
||||||
stringRepo: StringRepository
|
svc: NetworkService
|
||||||
) : BaseViewModel(State.LOADED) {
|
) : BaseViewModel(State.LOADED) {
|
||||||
|
|
||||||
val isRooted = Shell.rootAccess()
|
val isRooted = Shell.rootAccess()
|
||||||
@@ -30,12 +31,18 @@ class InstallViewModel(
|
|||||||
var step = if (skipOptions) 1 else 0
|
var step = if (skipOptions) 1 else 0
|
||||||
set(value) = set(value, field, { field = it }, BR.step)
|
set(value) = set(value, field, { field = it }, BR.step)
|
||||||
|
|
||||||
|
var _method = -1
|
||||||
|
|
||||||
@get:Bindable
|
@get:Bindable
|
||||||
var method = -1
|
var method
|
||||||
set(value) = set(value, field, { field = it }, BR.method) {
|
get() = _method
|
||||||
|
set(value) = set(value, _method, { _method = it }, BR.method) {
|
||||||
when (it) {
|
when (it) {
|
||||||
R.id.method_patch -> {
|
R.id.method_patch -> {
|
||||||
RequestFileEvent().publish()
|
MagiskInstallFileEvent { code, intent ->
|
||||||
|
if (code == Activity.RESULT_OK)
|
||||||
|
data = intent?.data
|
||||||
|
}.publish()
|
||||||
}
|
}
|
||||||
R.id.method_inactive_slot -> {
|
R.id.method_inactive_slot -> {
|
||||||
SecondSlotWarningDialog().publish()
|
SecondSlotWarningDialog().publish()
|
||||||
@@ -57,7 +64,7 @@ class InstallViewModel(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
notes = stringRepo.getString(Info.remote.magisk.note)
|
notes = svc.fetchString(Info.remote.magisk.note)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
package com.topjohnwu.magisk.ui.module
|
package com.topjohnwu.magisk.ui.module
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
@@ -14,7 +13,6 @@ import com.topjohnwu.magisk.arch.ReselectionTarget
|
|||||||
import com.topjohnwu.magisk.arch.ViewEvent
|
import com.topjohnwu.magisk.arch.ViewEvent
|
||||||
import com.topjohnwu.magisk.core.download.BaseDownloader
|
import com.topjohnwu.magisk.core.download.BaseDownloader
|
||||||
import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding
|
import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding
|
||||||
import com.topjohnwu.magisk.events.InstallExternalModuleEvent
|
|
||||||
import com.topjohnwu.magisk.ktx.hideKeyboard
|
import com.topjohnwu.magisk.ktx.hideKeyboard
|
||||||
import com.topjohnwu.magisk.ui.MainActivity
|
import com.topjohnwu.magisk.ui.MainActivity
|
||||||
import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
|
import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
|
||||||
@@ -40,13 +38,6 @@ class ModuleFragment : BaseUIFragment<ModuleViewModel, FragmentModuleMd2Binding>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
|
||||||
InstallExternalModuleEvent.onActivityResult(requestCode, resultCode, data)?.also {
|
|
||||||
it.navigate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
|
@@ -14,7 +14,7 @@ import com.topjohnwu.magisk.core.tasks.RepoUpdater
|
|||||||
import com.topjohnwu.magisk.data.database.RepoByNameDao
|
import com.topjohnwu.magisk.data.database.RepoByNameDao
|
||||||
import com.topjohnwu.magisk.data.database.RepoByUpdatedDao
|
import com.topjohnwu.magisk.data.database.RepoByUpdatedDao
|
||||||
import com.topjohnwu.magisk.databinding.RvItem
|
import com.topjohnwu.magisk.databinding.RvItem
|
||||||
import com.topjohnwu.magisk.events.InstallExternalModuleEvent
|
import com.topjohnwu.magisk.events.SelectModuleEvent
|
||||||
import com.topjohnwu.magisk.events.OpenChangelogEvent
|
import com.topjohnwu.magisk.events.OpenChangelogEvent
|
||||||
import com.topjohnwu.magisk.events.SnackbarEvent
|
import com.topjohnwu.magisk.events.SnackbarEvent
|
||||||
import com.topjohnwu.magisk.events.dialog.ModuleInstallDialog
|
import com.topjohnwu.magisk.events.dialog.ModuleInstallDialog
|
||||||
@@ -311,7 +311,7 @@ class ModuleViewModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun installPressed() = withExternalRW {
|
fun installPressed() = withExternalRW {
|
||||||
InstallExternalModuleEvent().publish()
|
SelectModuleEvent().publish()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun infoPressed(item: RepoItem) =
|
fun infoPressed(item: RepoItem) =
|
||||||
|
@@ -5,7 +5,7 @@ import com.topjohnwu.magisk.R
|
|||||||
import com.topjohnwu.magisk.arch.ContextExecutor
|
import com.topjohnwu.magisk.arch.ContextExecutor
|
||||||
import com.topjohnwu.magisk.arch.ViewEventWithScope
|
import com.topjohnwu.magisk.arch.ViewEventWithScope
|
||||||
import com.topjohnwu.magisk.core.Const
|
import com.topjohnwu.magisk.core.Const
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.DynamicClassLoader
|
import com.topjohnwu.magisk.ktx.DynamicClassLoader
|
||||||
import com.topjohnwu.magisk.ktx.writeTo
|
import com.topjohnwu.magisk.ktx.writeTo
|
||||||
import com.topjohnwu.magisk.view.MagiskDialog
|
import com.topjohnwu.magisk.view.MagiskDialog
|
||||||
@@ -28,7 +28,7 @@ class CheckSafetyNetEvent(
|
|||||||
private val callback: (SafetyNetResult) -> Unit = {}
|
private val callback: (SafetyNetResult) -> Unit = {}
|
||||||
) : ViewEventWithScope(), ContextExecutor, KoinComponent, SafetyNetHelper.Callback {
|
) : ViewEventWithScope(), ContextExecutor, KoinComponent, SafetyNetHelper.Callback {
|
||||||
|
|
||||||
private val svc by inject<GithubRawServices>()
|
private val svc by inject<NetworkService>()
|
||||||
|
|
||||||
private lateinit var apk: File
|
private lateinit var apk: File
|
||||||
private lateinit var dex: File
|
private lateinit var dex: File
|
||||||
|
@@ -4,7 +4,7 @@ import android.content.Context
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.data.repository.StringRepository
|
import com.topjohnwu.magisk.data.repository.NetworkService
|
||||||
import com.topjohnwu.magisk.ktx.coroutineScope
|
import com.topjohnwu.magisk.ktx.coroutineScope
|
||||||
import io.noties.markwon.Markwon
|
import io.noties.markwon.Markwon
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
@@ -18,12 +18,12 @@ import kotlin.coroutines.coroutineContext
|
|||||||
|
|
||||||
object MarkDownWindow : KoinComponent {
|
object MarkDownWindow : KoinComponent {
|
||||||
|
|
||||||
private val repo: StringRepository by inject()
|
private val svc: NetworkService by inject()
|
||||||
private val markwon: Markwon by inject()
|
private val markwon: Markwon by inject()
|
||||||
|
|
||||||
suspend fun show(activity: Context, title: String?, url: String) {
|
suspend fun show(activity: Context, title: String?, url: String) {
|
||||||
show(activity, title) {
|
show(activity, title) {
|
||||||
repo.getString(url)
|
svc.fetchString(url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,15 @@
|
|||||||
|
## v8.0.2
|
||||||
|
|
||||||
|
- Fix an issue with requesting permission on devices older than Android 10
|
||||||
|
- Make more files download through CDN
|
||||||
|
|
||||||
|
## v8.0.1
|
||||||
|
|
||||||
|
- Fix `vbmeta.img` patching for Samsung `AP.tar` files. This fixes bootloops on devices like Galaxy S10 after flashing updated AP files.
|
||||||
|
- Properly truncate existing files before writing to prevent corrupted files
|
||||||
|
- Prevent a possible UI loop when device ran into very low memory
|
||||||
|
- Switch to use JSDelivr CDN for several files
|
||||||
|
|
||||||
## v8.0.0
|
## v8.0.0
|
||||||
|
|
||||||
- 100% full app rewrite! Will highlight functional changes below.
|
- 100% full app rewrite! Will highlight functional changes below.
|
||||||
|
@@ -175,7 +175,9 @@
|
|||||||
<string name="no_biometric">El dispositiu no suporta o no té establerta configuració biomètrica</string>
|
<string name="no_biometric">El dispositiu no suporta o no té establerta configuració biomètrica</string>
|
||||||
<string name="settings_customization">Personalització</string>
|
<string name="settings_customization">Personalització</string>
|
||||||
<string name="setting_add_shortcut_summary">Afegeix una bonica drecera a la pantalla d\'inici en cas que el nom i la icona siguin difícils de reconèixer després d\'amagar l\'aplicació.</string>
|
<string name="setting_add_shortcut_summary">Afegeix una bonica drecera a la pantalla d\'inici en cas que el nom i la icona siguin difícils de reconèixer després d\'amagar l\'aplicació.</string>
|
||||||
|
<string name="settings_doh_title">DNS sobre HTTPS</string>
|
||||||
|
<string name="settings_doh_description">Solució per enverinament de DNS en algunes nacions</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>
|
||||||
<string name="settings_owner_manage">Administrador del Dispositiu</string>
|
<string name="settings_owner_manage">Administrador del Dispositiu</string>
|
||||||
@@ -234,5 +236,6 @@
|
|||||||
<string name="external_rw_permission_denied">Ha de donar permís d\'emmagatzematge per activar aquesta funcionalitat</string>
|
<string name="external_rw_permission_denied">Ha de donar permís d\'emmagatzematge per activar aquesta funcionalitat</string>
|
||||||
<string name="add_shortcut_title">Afegeix una drecera a la pantalla d\'inici</string>
|
<string name="add_shortcut_title">Afegeix una drecera a la pantalla d\'inici</string>
|
||||||
<string name="add_shortcut_msg">Després d\'amagar Magisk Manager, el seu nom i icona poden ser difícils de reconèixer. Vols afegir una bonica drecera a la teva pantalla d\'inici?</string>
|
<string name="add_shortcut_msg">Després d\'amagar Magisk Manager, el seu nom i icona poden ser difícils de reconèixer. Vols afegir una bonica drecera a la teva pantalla d\'inici?</string>
|
||||||
|
<string name="app_not_found">No s\'ha trobat una aplicació per emprar aquesta acció</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -1,55 +1,48 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<!--Welcome Activity-->
|
<!--Sections-->
|
||||||
<string name="modules">Moodulid</string>
|
<string name="modules">Moodulid</string>
|
||||||
<string name="superuser">Superkasutaja</string>
|
<string name="superuser">Superkasutaja</string>
|
||||||
<string name="logs">Logi</string>
|
<string name="logs">Logid</string>
|
||||||
<string name="settings">Seaded</string>
|
<string name="settings">Seaded</string>
|
||||||
|
<string name="refresh">Värskenda kohalikud andmed</string>
|
||||||
<string name="install">Installi</string>
|
<string name="install">Installi</string>
|
||||||
<string name="unsupport_magisk_title">Mittetoetatud Magisk\'i versioon</string>
|
<string name="section_home">Kodu</string>
|
||||||
|
<string name="section_theme">Teemad</string>
|
||||||
|
<string name="safetynet">SafetyNet</string>
|
||||||
|
|
||||||
<!--Status Fragment-->
|
<!--Home-->
|
||||||
|
<string name="no_connection">Ühendus puudub</string>
|
||||||
|
<string name="app_changelog">Muudatuste logi</string>
|
||||||
|
<string name="manager">Manager</string>
|
||||||
|
<string name="loading">Laadimine…</string>
|
||||||
|
<string name="update">Uuenda</string>
|
||||||
|
<string name="not_available">puudub</string>
|
||||||
|
<string name="hide">Peida</string>
|
||||||
|
<string name="status">Olek</string>
|
||||||
|
<string name="home_package">Pakett</string>
|
||||||
|
|
||||||
|
<string name="home_notice_content">Veendu alati, et kasutad avatud lähtekoodiga Magisk Manageri. Tundmatust allikast pärinev Manager võib teha pahatahtlikke toiminguid.</string>
|
||||||
|
<string name="home_support_title">Toeta meid</string>
|
||||||
|
<string name="home_item_source">Lähtekood</string>
|
||||||
|
<string name="home_support_content">Magisk on ja jääb alati tasuta ning avatud lähtekoodiga kättesaadavaks. Siiski, sa võid meile väikese annetuse näol toetust üles näidata.</string>
|
||||||
|
<string name="home_status_normal">Tavaline</string>
|
||||||
|
<string name="home_status_stub">Makett</string>
|
||||||
|
<string name="home_installed_version">Installitud</string>
|
||||||
|
<string name="home_latest_version">Viimatine</string>
|
||||||
<string name="invalid_update_channel">Sobimatu uuenduste kanal</string>
|
<string name="invalid_update_channel">Sobimatu uuenduste kanal</string>
|
||||||
<string name="safetynet_api_error">SafetyNet\'i API viga</string>
|
<string name="uninstall_magisk_title">Eemalda Magisk</string>
|
||||||
<string name="safetynet_res_invalid">Vastus on sobimatu.</string>
|
<string name="uninstall_magisk_msg">Kõik moodulid keelatakse/eemaldatakse!\nJuurkasutaja eemaldatakse!\nSinu andmeid võidakse krüpteerida, kui need juba ei ole krüpteeritud!</string>
|
||||||
|
<string name="home_check_safetynet">Kontrolli SafetyNeti</string>
|
||||||
|
|
||||||
|
<!--Install-->
|
||||||
<string name="keep_force_encryption">Säilita sunnitud krüpteering</string>
|
<string name="keep_force_encryption">Säilita sunnitud krüpteering</string>
|
||||||
<string name="keep_dm_verity">Säilita AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Säilita AVB 2.0/dm-verity</string>
|
||||||
<string name="recovery_mode">Taastusrežiim</string>
|
<string name="recovery_mode">Taastusrežiim</string>
|
||||||
<string name="uninstall_magisk_title">Eemalda Magisk</string>
|
<string name="install_options_title">Valikud</string>
|
||||||
<string name="uninstall_magisk_msg">Kõik moodulid keelatakse/eemaldatakse. Juurkasutaja eemaldatakse ning su andmed potensiaalselt krüpteeritakse, kui need ei ole juba krüpteeritud.</string>
|
<string name="install_method_title">Meetod</string>
|
||||||
<string name="update">Uuenda</string>
|
<string name="install_next">Edasi</string>
|
||||||
|
<string name="install_start">Läksime</string>
|
||||||
<!--Module Fragment-->
|
|
||||||
<string name="no_info_provided">(Info puudub)</string>
|
|
||||||
<string name="reboot_recovery">Taaskäivita taastusesse</string>
|
|
||||||
<string name="reboot_bootloader">Taaskäivita käivitushaldurisse</string>
|
|
||||||
<string name="reboot_download">Taaskäivita allalaadimisrežiimi</string>
|
|
||||||
<string name="reboot_edl">Taaskäivita EDL\'i</string>
|
|
||||||
|
|
||||||
<!--Repo Fragment-->
|
|
||||||
<string name="update_available">Uuendus saadaval</string>
|
|
||||||
<string name="home_installed_version">Installitud</string>
|
|
||||||
<string name="sorting_order">Sorteerimisjärjekord</string>
|
|
||||||
|
|
||||||
<!--Log Fragment-->
|
|
||||||
<string name="menuSaveLog">Salvesta logi</string>
|
|
||||||
<string name="menuClearLog">Tühjenda logi nüüd</string>
|
|
||||||
<string name="logs_cleared">Logi edukalt tühjendatud.</string>
|
|
||||||
|
|
||||||
<!--About Activity-->
|
|
||||||
<string name="app_changelog">Muutuste logi</string>
|
|
||||||
|
|
||||||
<!-- System Components, Notifications -->
|
|
||||||
<string name="update_channel">Magisk\'i uuendused</string>
|
|
||||||
<string name="progress_channel">Edenemise teated</string>
|
|
||||||
<string name="download_complete">Allalaadimine valmis</string>
|
|
||||||
<string name="download_file_error">Faili allalaadimisel esines viga</string>
|
|
||||||
<string name="download_open_parent">Kuva ülemkaustas</string>
|
|
||||||
<string name="download_open_self">Kuva fail</string>
|
|
||||||
<string name="magisk_update_title">Magisk\'ile on uuendus saadaval!</string>
|
|
||||||
<string name="manager_update_title">Magisk Manager\'ile on uuendus saadaval!</string>
|
|
||||||
|
|
||||||
<!-- Installation -->
|
|
||||||
<string name="manager_download_install">Vajuta allalaadimiseks ja installimiseks.</string>
|
<string name="manager_download_install">Vajuta allalaadimiseks ja installimiseks.</string>
|
||||||
<string name="download_zip_only">Laadi ainult ZIP alla</string>
|
<string name="download_zip_only">Laadi ainult ZIP alla</string>
|
||||||
<string name="direct_install">Otsene install (soovitatud)</string>
|
<string name="direct_install">Otsene install (soovitatud)</string>
|
||||||
@@ -59,42 +52,92 @@
|
|||||||
<string name="select_patch_file">Vali ja paika fail</string>
|
<string name="select_patch_file">Vali ja paika fail</string>
|
||||||
<string name="patch_file_msg">Vali toortõmmis (*.img) või ODIN tar-fail (*.tar)</string>
|
<string name="patch_file_msg">Vali toortõmmis (*.img) või ODIN tar-fail (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Taaskäivitamine 5 sekundi pärast…</string>
|
<string name="reboot_delay_toast">Taaskäivitamine 5 sekundi pärast…</string>
|
||||||
|
<string name="flash_screen_title">Installimine</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Superuser-->
|
||||||
<string name="repo_install_title">Installi %1$s</string>
|
<string name="su_request_title">Superkasutaja taotlus</string>
|
||||||
<string name="repo_install_msg">Kas soovid kohe installida %1$s?</string>
|
<string name="deny">Keela</string>
|
||||||
<string name="download">Allalaadimine</string>
|
<string name="prompt">Küsi</string>
|
||||||
<string name="reboot">Taaskäivita</string>
|
<string name="grant">Luba</string>
|
||||||
<string name="release_notes">Väljalaske märkmed</string>
|
<string name="su_warning">Annab täieliku ligipääsu sinu seadmele.\nKui sa pole kindel, keela!</string>
|
||||||
<string name="repo_cache_cleared">Hoidla vahemälu tühjendatud</string>
|
<string name="forever">Igavesti</string>
|
||||||
|
<string name="once">Üks kord</string>
|
||||||
|
<string name="tenmin">10 min</string>
|
||||||
|
<string name="twentymin">20 min</string>
|
||||||
|
<string name="thirtymin">30 min</string>
|
||||||
|
<string name="sixtymin">60 min</string>
|
||||||
|
<string name="su_allow_toast">Rakendusele %1$s anti superkasutaja õigused</string>
|
||||||
|
<string name="su_deny_toast">Rakendusel %1$s keelati superkasutaja õigused</string>
|
||||||
|
<string name="su_snack_grant">Superkasutaja õigused antud rakendusele %1$s</string>
|
||||||
|
<string name="su_snack_deny">Superkasutaja õigused keelatud rakendusele %1$s</string>
|
||||||
|
<string name="su_snack_notif_on">Teavitused lubatud rakendusele %1$s</string>
|
||||||
|
<string name="su_snack_notif_off">Teavitused keelatud rakendusele %1$s</string>
|
||||||
|
<string name="su_snack_log_on">Logimine lubatud rakendusele %1$s</string>
|
||||||
|
<string name="su_snack_log_off">Logimine keelatud rakendusele %1$s</string>
|
||||||
|
<string name="su_revoke_title">Eemaldad?</string>
|
||||||
|
<string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
|
||||||
|
<string name="toast">Hüpik</string>
|
||||||
|
<string name="none">Puudub</string>
|
||||||
|
|
||||||
<string name="flashing">Välgutamine</string>
|
<string name="superuser_toggle_notification">Teavitused</string>
|
||||||
<string name="done">Valmis!</string>
|
<string name="superuser_toggle_revoke">Eemalda</string>
|
||||||
<string name="failure">Ebaõnnestus</string>
|
<string name="superuser_policy_none">Ükski rakendus ei ole veel superkasutaja õigusi küsinud.</string>
|
||||||
<string name="hide_manager_title">Peidan Magisk Manager\'i…</string>
|
|
||||||
<string name="hide_manager_fail_toast">Magisk Manager\'i peitmine ebaõnnestus.</string>
|
|
||||||
<string name="open_link_failed_toast">Lingi avamiseks sobivat rakendust ei leitud.</string>
|
|
||||||
<string name="complete_uninstall">Täielik eemaldus</string>
|
|
||||||
<string name="restore_img">Taasta tõmmised</string>
|
|
||||||
<string name="restore_img_msg">Taastamine…</string>
|
|
||||||
<string name="restore_done">Taastamine valmis!</string>
|
|
||||||
<string name="restore_fail">Originaalne varundus puudub!</string>
|
|
||||||
<string name="proprietary_title">Laadi alla suletud koodi</string>
|
|
||||||
<string name="proprietary_notice">Magisk Manager on vaba ja avatud lähtekoodiga ning ei sisalda Google\'i suletud SafetyNet\'i API koodi.\n\nKas lubad Magisk Manager\'il SafetyNet\'i kontrollide jaoks laadida alla laiendus (sisaldab GoogleApiClient\'i)?</string>
|
|
||||||
<string name="setup_fail">Seadistus ebaõnnnestus.</string>
|
|
||||||
<string name="env_fix_title">Vajab lisaseadistust</string>
|
|
||||||
<string name="env_fix_msg">Sinu seade vajab lisaseadistust, et Magisk töötaks korralikult. Laadime alla Magisk\'i seadistus-zip\'i, kas soovid kohe jätkata?</string>
|
|
||||||
<string name="setup_msg">Käivitan keskkonnaseadistust…</string>
|
|
||||||
|
|
||||||
<!--Settings Activity -->
|
<!--Logs-->
|
||||||
|
<string name="log_data_none">Sa oled logivaba, proovi oma superkasutaja õigustega rakendusi rohkem kasutada.</string>
|
||||||
|
<string name="log_data_magisk_none">Magiski logid on tühjad, see on imelik.</string>
|
||||||
|
<string name="menuSaveLog">Salvesta logi</string>
|
||||||
|
<string name="menuClearLog">Tühjenda logi nüüd</string>
|
||||||
|
<string name="logs_cleared">Logi edukalt tühjendatud.</string>
|
||||||
|
<string name="pid">PID: %1$d</string>
|
||||||
|
<string name="target_uid">Siht-UID: %1$d</string>
|
||||||
|
|
||||||
|
<!--SafetyNet-->
|
||||||
|
<string name="safetynet_api_error">SafetyNeti API viga</string>
|
||||||
|
<string name="safetynet_res_invalid">Vastus on sobimatu</string>
|
||||||
|
<string name="safetynet_attest_success">Edukas!</string>
|
||||||
|
<string name="safetynet_attest_failure">Atesteerimine ebaõnnestus!</string>
|
||||||
|
<string name="safetynet_attest_loading">Oota üks hetk…</string>
|
||||||
|
<string name="safetynet_attest_restart">Proovi uuesti</string>
|
||||||
|
|
||||||
|
<!-- MagiskHide -->
|
||||||
|
<string name="show_system_app">Kuva süsteemirakendused</string>
|
||||||
|
<string name="hide_filter_hint">Filtreeri nime järgi</string>
|
||||||
|
<string name="hide_scroll_up">Keri üles</string>
|
||||||
|
<string name="hide_filters">Filtrid</string>
|
||||||
|
<string name="hide_search">Otsing</string>
|
||||||
|
|
||||||
|
<!--Module -->
|
||||||
|
<string name="no_info_provided">(Info puudub)</string>
|
||||||
|
<string name="reboot_recovery">Taaskäivita taastusesse</string>
|
||||||
|
<string name="reboot_bootloader">Taaskäivita käivitushaldurisse</string>
|
||||||
|
<string name="reboot_download">Taaskäivita allalaadimisrežiimi</string>
|
||||||
|
<string name="reboot_edl">Taaskäivita EDLi</string>
|
||||||
|
<string name="module_version_author">%1$s autorilt %2$s</string>
|
||||||
|
<string name="module_section_pending">Uuendused</string>
|
||||||
|
<string name="module_section_pending_action">Uuenda kõik</string>
|
||||||
|
<string name="module_state_remove">Eemalda</string>
|
||||||
|
<string name="module_state_restore">Taasta</string>
|
||||||
|
<string name="module_action_install_external">Installi sisemälust</string>
|
||||||
|
<string name="update_available">Uuendus saadaval</string>
|
||||||
|
<string name="module_installed">@string/home_installed_version</string>
|
||||||
|
<string name="module_section_online">Võrgus</string>
|
||||||
|
<string name="sorting_order">Sorteerimisjärjekord</string>
|
||||||
|
|
||||||
|
<!--Settings -->
|
||||||
|
<string name="settings_dark_mode_title">Teema režiim</string>
|
||||||
|
<string name="settings_dark_mode_message">Vali režiim, mis ühtib sinu stiiliga!</string>
|
||||||
|
<string name="settings_dark_mode_light">Alati hele</string>
|
||||||
|
<string name="settings_dark_mode_system">Järgi süsteemi</string>
|
||||||
|
<string name="settings_dark_mode_dark">Alati tume</string>
|
||||||
<string name="settings_download_path_title">Allalaadimise failitee</string>
|
<string name="settings_download_path_title">Allalaadimise failitee</string>
|
||||||
<string name="settings_download_path_message">Failid salvestatakse kausta %1$s</string>
|
<string name="settings_download_path_message">Failid salvestatakse kausta %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Tühjenda hoidla vahemälu</string>
|
<string name="settings_clear_cache_title">Tühjenda hoidla vahemälu</string>
|
||||||
<string name="settings_clear_cache_summary">Tühjenda vahemälus olev teave võrgus olevate hoidlate kohta. See sunnib rakendust võrgust värskendama.</string>
|
<string name="settings_clear_cache_summary">Tühjenda vahemälus olev teave võrgus olevate hoidlate kohta. See sunnib rakendust võrgust värskendama</string>
|
||||||
<string name="settings_hide_manager_title">Peida Magisk Manager</string>
|
<string name="settings_hide_manager_title">Peida Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Taaspaki Magisk Manager juhusliku nimega.</string>
|
<string name="settings_hide_manager_summary">Paki Magisk Manager juhusliku paketi- ja rakenduse nimega ümber</string>
|
||||||
<string name="settings_restore_manager_title">Taasta Magisk Manager</string>
|
<string name="settings_restore_manager_title">Taasta Magisk Manager</string>
|
||||||
<string name="settings_restore_manager_summary">Taasta Magisk Manager\'i originaalpakett</string>
|
<string name="settings_restore_manager_summary">Taasta Magisk Manageri originaalpakett</string>
|
||||||
<string name="language">Keel</string>
|
<string name="language">Keel</string>
|
||||||
<string name="system_default">(Süsteemi vaikesäte)</string>
|
<string name="system_default">(Süsteemi vaikesäte)</string>
|
||||||
<string name="settings_check_update_title">Kontrolli uuendusi</string>
|
<string name="settings_check_update_title">Kontrolli uuendusi</string>
|
||||||
@@ -107,8 +150,10 @@
|
|||||||
<string name="settings_magiskhide_summary">Peida Magisk erinevate tuvastuste eest</string>
|
<string name="settings_magiskhide_summary">Peida Magisk erinevate tuvastuste eest</string>
|
||||||
<string name="settings_hosts_title">Süsteemivaba hosts</string>
|
<string name="settings_hosts_title">Süsteemivaba hosts</string>
|
||||||
<string name="settings_hosts_summary">Süsteemivaba hosts-tugi reklaamiblokeerijatest rakendustele</string>
|
<string name="settings_hosts_summary">Süsteemivaba hosts-tugi reklaamiblokeerijatest rakendustele</string>
|
||||||
<string name="settings_hosts_toast">Süsteemivaba hosts\'i moodul lisatud</string>
|
<string name="settings_hosts_toast">Süsteemivaba hostsi moodul lisatud</string>
|
||||||
|
<string name="settings_app_name_hint">Uus nimi</string>
|
||||||
|
<string name="settings_app_name_helper">Rakendus pakitakse selle nimega</string>
|
||||||
|
<string name="settings_app_name_error">Sobimatu vorming</string>
|
||||||
<string name="settings_su_app_adb">Rakendused ja ADB</string>
|
<string name="settings_su_app_adb">Rakendused ja ADB</string>
|
||||||
<string name="settings_su_app">Ainult rakendused</string>
|
<string name="settings_su_app">Ainult rakendused</string>
|
||||||
<string name="settings_su_adb">Ainult ADB</string>
|
<string name="settings_su_adb">Ainult ADB</string>
|
||||||
@@ -122,56 +167,75 @@
|
|||||||
<string name="superuser_access">Superkasutaja ligipääs</string>
|
<string name="superuser_access">Superkasutaja ligipääs</string>
|
||||||
<string name="auto_response">Automaatne vastus</string>
|
<string name="auto_response">Automaatne vastus</string>
|
||||||
<string name="request_timeout">Taotluse ajalõpp</string>
|
<string name="request_timeout">Taotluse ajalõpp</string>
|
||||||
<string name="superuser_notification">Superkasutaja teade</string>
|
<string name="superuser_notification">Superkasutaja teavitus</string>
|
||||||
<string name="settings_su_reauth_title">Taas-autendi peale täiendust</string>
|
<string name="settings_su_reauth_title">Taas-autendi peale uuendust</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 uuendamist</string>
|
||||||
|
<string name="settings_su_biometric_title">Luba biomeetriaga autentimine</string>
|
||||||
|
<string name="settings_su_biometric_summary">Kasuta superkasutaja taotluste kinnitamiseks biomeetrilist autentimist</string>
|
||||||
|
<string name="no_biometric">Mittetoetatud seade või ükski biomeetriaseadistus pole lubatud</string>
|
||||||
|
<string name="settings_customization">Kohandamine</string>
|
||||||
|
<string name="setting_add_shortcut_summary">Lisa avakuvale ilus otsetee, juhul kui nime ja ikooni on pärast rakenduse peitmist raske tuvastada</string>
|
||||||
|
<string name="settings_doh_title">DNS üle HTTPSi</string>
|
||||||
|
<string name="settings_doh_description">Väldi mõnes riigis DNSi mürgitamist</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>
|
||||||
<string name="settings_owner_manage">Seadme omaniku hallatud</string>
|
<string name="settings_owner_manage">Seadme omaniku hallatud</string>
|
||||||
<string name="settings_user_independent">Kasutajast sõltumatu</string>
|
<string name="settings_user_independent">Kasutajast sõltumatu</string>
|
||||||
<string name="owner_only_summary">Ainult omanikul on juurkasutaja õigused.</string>
|
<string name="owner_only_summary">Ainult omanikul on juurkasutaja õigused</string>
|
||||||
<string name="owner_manage_summary">Ainult omanik saab hallata juurkasutaja ligipääsu ja saada taotlusküsimusi.</string>
|
<string name="owner_manage_summary">Ainult omanik saab hallata juurkasutaja ligipääsu ja saada taotlusküsimusi</string>
|
||||||
<string name="user_indepenent_summary">Igal kasutajal on oma isiklikud juurkasutaja reeglid.</string>
|
<string name="user_indepenent_summary">Igal kasutajal on oma isiklikud juurkasutaja reeglid.</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Nimeruumi monteerimisrežiim</string>
|
<string name="mount_namespace_mode">Nimeruumi monteerimisrežiim</string>
|
||||||
<string name="settings_ns_global">Globaalne nimeruum</string>
|
<string name="settings_ns_global">Globaalne nimeruum</string>
|
||||||
<string name="settings_ns_requester">Võta nimeruum üle</string>
|
<string name="settings_ns_requester">Võta nimeruum üle</string>
|
||||||
<string name="settings_ns_isolate">Isoleeritud nimeruum</string>
|
<string name="settings_ns_isolate">Isoleeritud nimeruum</string>
|
||||||
<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>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Notifications-->
|
||||||
<string name="su_request_title">Superkasutaja taotlus</string>
|
<string name="update_channel">Magiski uuendused</string>
|
||||||
<string name="deny">Keela</string>
|
<string name="progress_channel">Edenemise teated</string>
|
||||||
<string name="prompt">Küsi</string>
|
<string name="download_complete">Allalaadimine valmis</string>
|
||||||
<string name="grant">Luba</string>
|
<string name="download_file_error">Faili allalaadimisel esines viga</string>
|
||||||
<string name="su_warning">Annab täieliku ligipääsu sinu seadmele.\nKeela, kui sa pole kindel!</string>
|
<string name="download_open_parent">Kuva ülemkaustas</string>
|
||||||
<string name="forever">Igavesti</string>
|
<string name="download_open_self">Kuva fail</string>
|
||||||
<string name="once">Üks kord</string>
|
<string name="magisk_update_title">Magiski uuendus on saadaval!</string>
|
||||||
<string name="tenmin">10 min</string>
|
<string name="manager_update_title">Magisk Manageri uuendus on saadaval!</string>
|
||||||
<string name="twentymin">20 min</string>
|
|
||||||
<string name="thirtymin">30 min</string>
|
|
||||||
<string name="sixtymin">60 min</string>
|
|
||||||
<string name="su_allow_toast">Rakendusele %1$s anti superkasutaja õigused</string>
|
|
||||||
<string name="su_deny_toast">Rakendusel %1$s keelati superkasutaja õigused</string>
|
|
||||||
<string name="su_snack_grant">Superkasutaja õigused antud rakendusele %1$s</string>
|
|
||||||
<string name="su_snack_deny">Superkasutaja õigused keelatud rakendusele %1$s</string>
|
|
||||||
<string name="su_snack_notif_on">Teated lubatud rakendusele %1$s</string>
|
|
||||||
<string name="su_snack_notif_off">Teated keelatud rakendusele %1$s</string>
|
|
||||||
<string name="su_snack_log_on">Logimine lubatud rakendusele %1$s</string>
|
|
||||||
<string name="su_snack_log_off">Logimine keelatud rakendusele %1$s</string>
|
|
||||||
<string name="su_revoke_title">Eemaldad?</string>
|
|
||||||
<string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
|
|
||||||
<string name="toast">Hüpik</string>
|
|
||||||
<string name="none">Puudub</string>
|
|
||||||
|
|
||||||
<!--Superuser logs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="pid">PID: %1$d</string>
|
<string name="yes">Jah</string>
|
||||||
<string name="target_uid">Siht-UID: %1$d</string>
|
<string name="no">Ei</string>
|
||||||
|
<string name="repo_install_title">Installi %1$s</string>
|
||||||
<!-- MagiskHide -->
|
<string name="repo_install_msg">Kas soovid kohe installida %1$s?</string>
|
||||||
<string name="show_system_app">Kuva süsteemirakendused</string>
|
<string name="download">Allalaadimine</string>
|
||||||
|
<string name="reboot">Taaskäivita</string>
|
||||||
|
<string name="release_notes">Väljalaskemärkmed</string>
|
||||||
|
<string name="repo_cache_cleared">Hoidla vahemälu tühjendatud</string>
|
||||||
|
<string name="flashing">Välgutamine…</string>
|
||||||
|
<string name="done">Valmis!</string>
|
||||||
|
<string name="failure">Ebaõnnestus</string>
|
||||||
|
<string name="hide_manager_title">Magisk Manageri peitmine…</string>
|
||||||
|
<string name="hide_manager_fail_toast">Magisk Manageri peitmine ebaõnnestus.</string>
|
||||||
|
<string name="open_link_failed_toast">Lingi avamiseks sobivat rakendust ei leitud.</string>
|
||||||
|
<string name="complete_uninstall">Täielik eemaldus</string>
|
||||||
|
<string name="restore_img">Taasta tõmmised</string>
|
||||||
|
<string name="restore_img_msg">Taastamine…</string>
|
||||||
|
<string name="restore_done">Taastamine valmis!</string>
|
||||||
|
<string name="restore_fail">Originaalne varundus puudub!</string>
|
||||||
|
<string name="proprietary_title">Laadi alla suletud koodi</string>
|
||||||
|
<string name="proprietary_notice">Magisk Manager on vaba ja avatud lähtekoodiga ning ei sisalda Google\'i suletud SafetyNeti API koodi.\n\nKas lubad Magisk Manageril SafetyNeti kontrollide jaoks laadida alla laiendus (sisaldab GoogleApiClienti)?</string>
|
||||||
|
<string name="setup_fail">Seadistus ebaõnnnestus</string>
|
||||||
|
<string name="env_fix_title">Vajab lisaseadistust</string>
|
||||||
|
<string name="env_fix_msg">Sinu seade vajab Magiski korralikuks toimimiseks lisaseadistust. Laadime alla Magiski seadistus-ZIPi, kas soovid kohe jätkata?</string>
|
||||||
|
<string name="setup_msg">Käivitan keskkonnaseadistust…</string>
|
||||||
|
<string name="authenticate">Autendi</string>
|
||||||
|
<string name="unsupport_magisk_title">Mittetoetatud Magiski versioon</string>
|
||||||
|
<string name="unsupport_magisk_msg">See Magisk Manageri versioon ei toeta Magiski versiooni, mis on vanem kui %1$s.\n\nRakendus käitub nii, nagu Magisk ei oleks paigaldatud, palun uuenda Magisk nii ruttu kui võimalik.</string>
|
||||||
|
<string name="external_rw_permission_denied">Selle funktsionaalsuse lubamiseks anna mäluruumi haldamise luba</string>
|
||||||
|
<string name="add_shortcut_title">Lisa avakuvale otsetee</string>
|
||||||
|
<string name="add_shortcut_msg">Pärast Magisk Manageri peitmist võib selle nimi ja ikoon muutuda raskelt tuvastatavaks. Kas soovid avakuvale ilusa otsetee lisada?</string>
|
||||||
|
<string name="app_not_found">Selle tegevuse teostamiseks ei leitud ühtegi rakendust</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -5,15 +5,15 @@
|
|||||||
<string name="superuser">Superuser</string>
|
<string name="superuser">Superuser</string>
|
||||||
<string name="logs">Log</string>
|
<string name="logs">Log</string>
|
||||||
<string name="settings">Setelan</string>
|
<string name="settings">Setelan</string>
|
||||||
<string name="refresh">Perbarui Data Lokal</string>
|
<string name="refresh">Perbarui data lokal</string>
|
||||||
<string name="install">Instal</string>
|
<string name="install">Instal</string>
|
||||||
<string name="section_home">Beranda</string>
|
<string name="section_home">Beranda</string>
|
||||||
<string name="section_theme">Tema</string>
|
<string name="section_theme">Tema</string>
|
||||||
<string name="safetynet">SafetyNet</string>
|
<string name="safetynet">SafetyNet</string>
|
||||||
|
|
||||||
<!--Home-->
|
<!--Home-->
|
||||||
<string name="no_connection">Koneksi tidak tersedia</string>
|
<string name="no_connection">Tidak ada koneksi</string>
|
||||||
<string name="app_changelog">Daftar perubahan</string>
|
<string name="app_changelog">Catatan perubahan</string>
|
||||||
<string name="manager">Manager</string>
|
<string name="manager">Manager</string>
|
||||||
<string name="loading">Memuat…</string>
|
<string name="loading">Memuat…</string>
|
||||||
<string name="update">Update</string>
|
<string name="update">Update</string>
|
||||||
@@ -22,15 +22,15 @@
|
|||||||
<string name="status">Status</string>
|
<string name="status">Status</string>
|
||||||
<string name="home_package">Paket</string>
|
<string name="home_package">Paket</string>
|
||||||
|
|
||||||
<string name="home_notice_content">Pastikan Anda selalu menggunakan Magisk Manager dari sumber terbuka. Manager dari sumber yang tidak dikenal dapat melakukan tindak kejahatan.</string>
|
<string name="home_notice_content">Pastikan selalu menggunakan Magisk Manager dari sumber terbuka. Manager dari sumber yang tidak dikenal dapat melakukan tindakan jahat.</string>
|
||||||
<string name="home_support_title">Dukung Kami</string>
|
<string name="home_support_title">Dukung kami</string>
|
||||||
<string name="home_item_source">Sumber</string>
|
<string name="home_item_source">Sumber</string>
|
||||||
<string name="home_support_content">Magisk gratis dan bersumber terbuka, dan akan selalu seperti itu. Bagaimanapun juga Anda dapat menunjukan kepedulian Anda kepada kami dengan mengirimkan sedikit donasi.</string>
|
<string name="home_support_content">Magisk gratis dan bersumber terbuka, dan akan selalu seperti itu. Bagaimanapun juga Anda dapat menunjukan kepedulian Anda kepada kami dengan mengirimkan sedikit donasi.</string>
|
||||||
<string name="home_status_normal">Normal</string>
|
<string name="home_status_normal">Normal</string>
|
||||||
<string name="home_status_stub">Stub</string>
|
<string name="home_status_stub">Stub</string>
|
||||||
<string name="home_installed_version">Terinstal</string>
|
<string name="home_installed_version">Terinstal</string>
|
||||||
<string name="home_latest_version">Terbaru</string>
|
<string name="home_latest_version">Terbaru</string>
|
||||||
<string name="invalid_update_channel">Kanal Update Tidak Valid</string>
|
<string name="invalid_update_channel">Kanal update tidak valid</string>
|
||||||
<string name="uninstall_magisk_title">Uninstal Magisk</string>
|
<string name="uninstall_magisk_title">Uninstal Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Semua modul akan dinonaktifkan/dihapus!\nRoot akan dihapus!\nData Anda berpotensi terenkripsi 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="home_check_safetynet">Pemeriksaan SafetyNet</string>
|
<string name="home_check_safetynet">Pemeriksaan SafetyNet</string>
|
||||||
@@ -42,20 +42,20 @@
|
|||||||
<string name="install_options_title">Opsi</string>
|
<string name="install_options_title">Opsi</string>
|
||||||
<string name="install_method_title">Metode</string>
|
<string name="install_method_title">Metode</string>
|
||||||
<string name="install_next">Berikutnya</string>
|
<string name="install_next">Berikutnya</string>
|
||||||
<string name="install_start">Mari mulai</string>
|
<string name="install_start">Mulai</string>
|
||||||
<string name="manager_download_install">Tekan untuk download dan instal</string>
|
<string name="manager_download_install">Sentuh untuk download dan instal</string>
|
||||||
<string name="download_zip_only">Download Zip Saja</string>
|
<string name="download_zip_only">Download zip saja</string>
|
||||||
<string name="direct_install">Langsung Instal (Disarankan)</string>
|
<string name="direct_install">Langsung instal (Disarankan)</string>
|
||||||
<string name="install_inactive_slot">Instal pada Slot Nonaktif (Setelah OTA)</string>
|
<string name="install_inactive_slot">Instal pada slot nonaktif (Setelah OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">Perangkat Anda akan DIPAKSA boot ke slot yang saat ini tidak aktif setelah perangkat dinyalakan ulang!\nGunakan opsi ini hanya setelah proses OTA selesai.\nLanjutkan?</string>
|
<string name="install_inactive_slot_msg">Perangkat Anda akan DIPAKSA boot ke slot yang saat ini tidak aktif setelah perangkat dinyalakan ulang!\nGunakan opsi ini hanya setelah proses OTA selesai.\nLanjutkan?</string>
|
||||||
<string name="setup_title">Penyiapan Tambahan</string>
|
<string name="setup_title">Penyiapan tambahan</string>
|
||||||
<string name="select_patch_file">Pilih dan Tambal File</string>
|
<string name="select_patch_file">Pilih dan tambal file</string>
|
||||||
<string name="patch_file_msg">Pilih mentahan image (*.img) atau file tar ODIN (*.tar)</string>
|
<string name="patch_file_msg">Pilih mentahan image (*.img) atau file tar ODIN (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Memulai kembali dalam 5 detik…</string>
|
<string name="reboot_delay_toast">Memulai kembali dalam 5 detik…</string>
|
||||||
<string name="flash_screen_title">Instalasi</string>
|
<string name="flash_screen_title">Instalasi</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Permintaan Superuser</string>
|
<string name="su_request_title">Permintaan superuser</string>
|
||||||
<string name="deny">Tolak</string>
|
<string name="deny">Tolak</string>
|
||||||
<string name="prompt">Ajukan</string>
|
<string name="prompt">Ajukan</string>
|
||||||
<string name="grant">Izinkan</string>
|
<string name="grant">Izinkan</string>
|
||||||
@@ -66,14 +66,14 @@
|
|||||||
<string name="twentymin">20 mnt</string>
|
<string name="twentymin">20 mnt</string>
|
||||||
<string name="thirtymin">30 mnt</string>
|
<string name="thirtymin">30 mnt</string>
|
||||||
<string name="sixtymin">60 mnt</string>
|
<string name="sixtymin">60 mnt</string>
|
||||||
<string name="su_allow_toast">%1$s mendapatkan hak Superuser</string>
|
<string name="su_allow_toast">%1$s mendapatkan hak superuser</string>
|
||||||
<string name="su_deny_toast">%1$s ditolak atas hak Superuser</string>
|
<string name="su_deny_toast">%1$s ditolak atas hak superuser</string>
|
||||||
<string name="su_snack_grant">Hak Superuser untuk %1$s diberikan</string>
|
<string name="su_snack_grant">Hak superuser %1$s diberikan</string>
|
||||||
<string name="su_snack_deny">Hak Superuser untuk %1$s ditolak</string>
|
<string name="su_snack_deny">Hak superuser %1$s ditolak</string>
|
||||||
<string name="su_snack_notif_on">Notifikasi untuk %1$s diaktifkan</string>
|
<string name="su_snack_notif_on">Notifikasi %1$s diaktifkan</string>
|
||||||
<string name="su_snack_notif_off">Notifikasi untuk %1$s dinonaktifkan</string>
|
<string name="su_snack_notif_off">Notifikasi %1$s dinonaktifkan</string>
|
||||||
<string name="su_snack_log_on">Log untuk %1$s diaktifkan</string>
|
<string name="su_snack_log_on">Pencatatan log %1$s diaktifkan</string>
|
||||||
<string name="su_snack_log_off">Log untuk %1$s dinonaktifkan</string>
|
<string name="su_snack_log_off">Pencatatan log %1$s dinonaktifkan</string>
|
||||||
<string name="su_revoke_title">Cabut?</string>
|
<string name="su_revoke_title">Cabut?</string>
|
||||||
<string name="su_revoke_msg">Konfirmasi untuk mencabut hak %1$s?</string>
|
<string name="su_revoke_msg">Konfirmasi untuk mencabut hak %1$s?</string>
|
||||||
<string name="toast">Toast</string>
|
<string name="toast">Toast</string>
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
<string name="hide_filter_hint">Filter menurut nama</string>
|
<string name="hide_filter_hint">Filter menurut nama</string>
|
||||||
<string name="hide_scroll_up">Gulir ke atas</string>
|
<string name="hide_scroll_up">Gulir ke atas</string>
|
||||||
<string name="hide_filters">Filter</string>
|
<string name="hide_filters">Filter</string>
|
||||||
<string name="hide_search">Penelusuran</string>
|
<string name="hide_search">Telusuri</string>
|
||||||
|
|
||||||
<!--Module -->
|
<!--Module -->
|
||||||
<string name="no_info_provided">(Info tidak tersedia)</string>
|
<string name="no_info_provided">(Info tidak tersedia)</string>
|
||||||
@@ -119,36 +119,36 @@
|
|||||||
<string name="module_state_remove">Hapus</string>
|
<string name="module_state_remove">Hapus</string>
|
||||||
<string name="module_state_restore">Pulihkan</string>
|
<string name="module_state_restore">Pulihkan</string>
|
||||||
<string name="module_action_install_external">Instal dari penyimpanan</string>
|
<string name="module_action_install_external">Instal dari penyimpanan</string>
|
||||||
<string name="update_available">Update Tersedia</string>
|
<string name="update_available">Update tersedia</string>
|
||||||
<string name="module_installed">@string/home_installed_version</string>
|
<string name="module_installed">@string/home_installed_version</string>
|
||||||
<string name="module_section_online">Online</string>
|
<string name="module_section_online">Online</string>
|
||||||
<string name="sorting_order">Urutan Sortir</string>
|
<string name="sorting_order">Urutan sortir</string>
|
||||||
|
|
||||||
<!--Settings -->
|
<!--Settings -->
|
||||||
<string name="settings_dark_mode_title">Mode Tema</string>
|
<string name="settings_dark_mode_title">Mode tema</string>
|
||||||
<string name="settings_dark_mode_message">Pilih mode yang paling cocok dengan gaya Anda!</string>
|
<string name="settings_dark_mode_message">Pilih mode yang paling cocok dengan gaya Anda!</string>
|
||||||
<string name="settings_dark_mode_light">Selalu Terang</string>
|
<string name="settings_dark_mode_light">Selalu terang</string>
|
||||||
<string name="settings_dark_mode_system">Ikuti Sistem</string>
|
<string name="settings_dark_mode_system">Ikuti sistem</string>
|
||||||
<string name="settings_dark_mode_dark">Selalu Gelap</string>
|
<string name="settings_dark_mode_dark">Selalu gelap</string>
|
||||||
<string name="settings_download_path_title">Lokasi download</string>
|
<string name="settings_download_path_title">Lokasi download</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">Hapus Cache Repositori</string>
|
<string name="settings_clear_cache_title">Hapus cache repo</string>
|
||||||
<string name="settings_clear_cache_summary">Hapus cache informasi repositori online. Tindakan ini memaksa aplikasi untuk memperbarui repositori online</string>
|
<string name="settings_clear_cache_summary">Hapus cache informasi repo online. Tindakan ini memaksa aplikasi untuk memperbarui repo 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">Kemas ulang Magisk Manager dengan nama paket dan nama aplikasi secara acak</string>
|
<string name="settings_hide_manager_summary">Kemas ulang Magisk Manager dengan nama paket dan nama aplikasi secara 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 nama paket dan nama aplikasi aslinya</string>
|
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan nama paket dan nama aplikasi aslinya</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_check_update_title">Periksa Update</string>
|
<string name="settings_check_update_title">Periksa update</string>
|
||||||
<string name="settings_check_update_summary">Periksa update secara berkala di latar belakang</string>
|
<string name="settings_check_update_summary">Periksa update secara berkala di latar belakang</string>
|
||||||
<string name="settings_update_channel_title">Kanal Update</string>
|
<string name="settings_update_channel_title">Kanal update</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">Kanal Khusus</string>
|
<string name="settings_update_custom">Kanal khusus</string>
|
||||||
<string name="settings_update_custom_msg">Masukkan URL khusus</string>
|
<string name="settings_update_custom_msg">Masukkan URL khusus</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 Systemless</string>
|
<string name="settings_hosts_title">Host systemless</string>
|
||||||
<string name="settings_hosts_summary">Dukungan host secara systemless untuk aplikasi pemblokir iklan</string>
|
<string name="settings_hosts_summary">Dukungan host secara systemless untuk aplikasi pemblokir iklan</string>
|
||||||
<string name="settings_hosts_toast">Menambahkan modul host systemless</string>
|
<string name="settings_hosts_toast">Menambahkan modul host systemless</string>
|
||||||
<string name="settings_app_name_hint">Nama baru</string>
|
<string name="settings_app_name_hint">Nama baru</string>
|
||||||
@@ -164,45 +164,45 @@
|
|||||||
<string name="settings_su_request_30">30 detik</string>
|
<string name="settings_su_request_30">30 detik</string>
|
||||||
<string name="settings_su_request_45">45 detik</string>
|
<string name="settings_su_request_45">45 detik</string>
|
||||||
<string name="settings_su_request_60">60 detik</string>
|
<string name="settings_su_request_60">60 detik</string>
|
||||||
<string name="superuser_access">Akses Superuser</string>
|
<string name="superuser_access">Akses superuser</string>
|
||||||
<string name="auto_response">Respons Otomatis</string>
|
<string name="auto_response">Respons otomatis</string>
|
||||||
<string name="request_timeout">Batas Waktu Permintaan</string>
|
<string name="request_timeout">Batas waktu permintaan</string>
|
||||||
<string name="superuser_notification">Notifikasi Superuser</string>
|
<string name="superuser_notification">Notifikasi superuser</string>
|
||||||
<string name="settings_su_reauth_title">Autentikasi ulang setelah upgrade</string>
|
<string name="settings_su_reauth_title">Autentikasi ulang setelah upgrade</string>
|
||||||
<string name="settings_su_reauth_summary">Autentikasi ulang izin superuser setelah aplikasi diupgrade</string>
|
<string name="settings_su_reauth_summary">Autentikasi ulang izin akses superuser setelah aplikasi diupgrade</string>
|
||||||
<string name="settings_su_biometric_title">Aktifkan Autentikasi Biometrik</string>
|
<string name="settings_su_biometric_title">Aktifkan autentikasi biometrik</string>
|
||||||
<string name="settings_su_biometric_summary">Gunakan autentikasi biometrik untuk mengizinkan permintaan superuser</string>
|
<string name="settings_su_biometric_summary">Gunakan autentikasi biometrik untuk mengizinkan permintaan superuser</string>
|
||||||
<string name="no_biometric">Perangkat tidak didukung atau setelan biometrik tidak diaktifkan</string>
|
<string name="no_biometric">Perangkat tidak mendukung atau setelan biometrik tidak diaktifkan</string>
|
||||||
<string name="settings_customization">Penyesuaian</string>
|
<string name="settings_customization">Personalisasi</string>
|
||||||
<string name="setting_add_shortcut_summary">Tambahkan pintasan yang menarik pada layar utama seandainya nama dan ikon sulit untuk dikenali setelah menyembunyikan aplikasi</string>
|
<string name="setting_add_shortcut_summary">Tambahkan pintasan yang menarik pada layar utama seandainya nama dan ikon sulit untuk dikenali setelah menyembunyikan aplikasi</string>
|
||||||
<string name="settings_doh_title">DNS melalui HTTPS</string>
|
<string name="settings_doh_title">DNS melalui HTTPS</string>
|
||||||
<string name="settings_doh_description">Solusi untuk permasalahan DNS di beberapa negara</string>
|
<string name="settings_doh_description">Solusi untuk DNS poisoning di beberapa negara</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Mode Multi Pengguna</string>
|
<string name="multiuser_mode">Mode multi pengguna</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 pesan permintaan</string>
|
<string name="owner_manage_summary">Hanya pemilik yang dapat mengelola akses root dan menerima pesan permintaan</string>
|
||||||
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root mereka sendiri</string>
|
<string name="user_indepenent_summary">Setiap pengguna memiliki aturan root mereka sendiri</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Mode Ruang-nama Mount</string>
|
<string name="mount_namespace_mode">Mode ruang-nama mount</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 Terpisah</string>
|
<string name="settings_ns_isolate">Ruang-nama terpisah</string>
|
||||||
<string name="global_summary">Seluruh sesi root menggunakan ruang-nama mount global</string>
|
<string name="global_summary">Semua sesi root menggunakan ruang-nama mount 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>
|
||||||
|
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="update_channel">Update Magisk</string>
|
<string name="update_channel">Update Magisk</string>
|
||||||
<string name="progress_channel">Notifikasi Berjalan</string>
|
<string name="progress_channel">Notifikasi Kemajuan</string>
|
||||||
<string name="download_complete">Download selesai</string>
|
<string name="download_complete">Download selesai</string>
|
||||||
<string name="download_file_error">Kesalahan saat mendownload file</string>
|
<string name="download_file_error">Kesalahan saat mendownload file</string>
|
||||||
<string name="download_open_parent">Tampilkan dalam folder</string>
|
<string name="download_open_parent">Tampilkan dalam folder</string>
|
||||||
<string name="download_open_self">Tampilkan file</string>
|
<string name="download_open_self">Tampilkan file</string>
|
||||||
<string name="magisk_update_title">Update Magisk Tersedia!</string>
|
<string name="magisk_update_title">Update Magisk tersedia!</string>
|
||||||
<string name="manager_update_title">Update Magisk Manager Tersedia!</string>
|
<string name="manager_update_title">Update Magisk Manager tersedia!</string>
|
||||||
|
|
||||||
<!--Toasts, Dialogs-->
|
<!--Toasts, Dialogs-->
|
||||||
<string name="yes">Ya</string>
|
<string name="yes">Ya</string>
|
||||||
@@ -212,29 +212,30 @@
|
|||||||
<string name="download">Download</string>
|
<string name="download">Download</string>
|
||||||
<string name="reboot">Nyalakan ulang</string>
|
<string name="reboot">Nyalakan ulang</string>
|
||||||
<string name="release_notes">Catatan rilis</string>
|
<string name="release_notes">Catatan rilis</string>
|
||||||
<string name="repo_cache_cleared">Cache repositori dihapus</string>
|
<string name="repo_cache_cleared">Cache repo dihapus</string>
|
||||||
<string name="flashing">Memasang…</string>
|
<string name="flashing">Memasang…</string>
|
||||||
<string name="done">Selesai!</string>
|
<string name="done">Selesai!</string>
|
||||||
<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">Gagal menyembunyikan Magisk Manager.</string>
|
<string name="hide_manager_fail_toast">Gagal menyembunyikan Magisk Manager.</string>
|
||||||
<string name="open_link_failed_toast">Tidak ditemukan aplikasi untuk membuka link ini</string>
|
<string name="open_link_failed_toast">Tidak ditemukan aplikasi untuk membuka link ini</string>
|
||||||
<string name="complete_uninstall">Uninstal Penuh</string>
|
<string name="complete_uninstall">Uninstal penuh</string>
|
||||||
<string name="restore_img">Pulihkan Image</string>
|
<string name="restore_img">Pulihkan image</string>
|
||||||
<string name="restore_img_msg">Memulihkan…</string>
|
<string name="restore_img_msg">Memulihkan…</string>
|
||||||
<string name="restore_done">Pemulihan selesai!</string>
|
<string name="restore_done">Pemulihan selesai!</string>
|
||||||
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
<string name="restore_fail">Cadangan stock tidak ada!</string>
|
||||||
<string name="proprietary_title">Download Kode Proprietari</string>
|
<string name="proprietary_title">Download kode proprieter</string>
|
||||||
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak membawa kode proprietari API SafetyNet Google.\n\nMaukah mengizinkan Magisk Manager untuk mendownload ekstensi (berisi GoogleApiClient) untuk memriksa SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager adalah aplikasi FOSS dan tidak memiliki kode proprieter API SafetyNet Google.\n\nMaukah mengizinkan Magisk Manager untuk mendownload ekstensi (berisi GoogleApiClient) untuk memeriksa SafetyNet?</string>
|
||||||
<string name="setup_fail">Penyiapan gagal</string>
|
<string name="setup_fail">Penyiapan gagal</string>
|
||||||
<string name="env_fix_title">Perlu Penyiapan Tambahan</string>
|
<string name="env_fix_title">Perlu penyiapan tambahan</string>
|
||||||
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan agar Magisk bekerja dengan baik. Perangkat akan mendownload zip untuk penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
<string name="env_fix_msg">Perangkat Anda memerlukan penyiapan tambahan agar Magisk bekerja dengan baik. Perangkat akan mendownload zip untuk penyiapan Magisk, apakah Anda ingin melanjutkan sekarang?</string>
|
||||||
<string name="setup_msg">Memproses penyiapan lingkungan…</string>
|
<string name="setup_msg">Memproses penyiapan lingkungan…</string>
|
||||||
<string name="authenticate">Autentikasi</string>
|
<string name="authenticate">Autentikasi</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_msg">Versi Magisk Manager ini tidak mendukung Magisk di bawah versi %1$s.\n\nAplikasi akan berperilaku seolah-olah Magisk tidak terinstal, harap meningkatkan Magisk sesegera mungkin.</string>
|
<string name="unsupport_magisk_msg">Versi Magisk Manager ini tidak mendukung Magisk di bawah versi %1$s.\n\nAplikasi akan berperilaku seolah-olah Magisk tidak terinstal, harap meningkatkan Magisk sesegera mungkin.</string>
|
||||||
<string name="external_rw_permission_denied">Berikan izin akses ke penyimpanan untuk mengaktifkan fungsi ini</string>
|
<string name="external_rw_permission_denied">Berikan izin akses ke penyimpanan untuk mengaktifkan fungsi ini</string>
|
||||||
<string name="add_shortcut_title">Tambahkan pintasan ke layar utama</string>
|
<string name="add_shortcut_title">Tambahkan pintasan ke layar utama</string>
|
||||||
<string name="add_shortcut_msg">Setelah menyembunyikan Magisk Manager, nama dan ikonnya mungkin menjadi sulit untuk dikenali. Apakah Anda ingin menambahkan pintasan yang menarik pada layar utama?</string>
|
<string name="add_shortcut_msg">Setelah menyembunyikan Magisk Manager, nama dan ikonnya mungkin menjadi sulit untuk dikenali. Apakah Anda ingin menambahkan pintasan yang menarik pada layar utama?</string>
|
||||||
|
<string name="app_not_found">Tidak ditemukan aplikasi untuk menangani tindakan ini</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<!--Welcome Activity-->
|
<!--Welcome Activity-->
|
||||||
<string name="modules">Moduli</string>
|
<string name="modules">Moduli</string>
|
||||||
<string name="superuser">Superuser</string>
|
<string name="superuser">Accesso root</string>
|
||||||
<string name="logs">Registro eventi</string>
|
<string name="logs">Registro eventi</string>
|
||||||
<string name="settings">Impostazioni</string>
|
<string name="settings">Impostazioni</string>
|
||||||
<string name="refresh">Aggiorna dati locali</string>
|
<string name="refresh">Aggiorna dati locali</string>
|
||||||
@@ -17,15 +17,18 @@
|
|||||||
<string name="hide">Hide</string>
|
<string name="hide">Hide</string>
|
||||||
<string name="app_changelog">Changelog</string>
|
<string name="app_changelog">Changelog</string>
|
||||||
<string name="manager">Manager</string>
|
<string name="manager">Manager</string>
|
||||||
|
<string name="home_status_stub">Nascosto</string>
|
||||||
|
<string name="home_latest_version">Ultima</string>
|
||||||
|
<string name="home_installed_version">Installata</string>
|
||||||
<string name="home_support_title">Supportaci</string>
|
<string name="home_support_title">Supportaci</string>
|
||||||
<string name="home_item_source">Codice sorgente</string>
|
<string name="home_item_source">Codice sorgente</string>
|
||||||
<string name="home_support_content">Magisk è e sempre sarà gratuito ed open source. Puoi comunque mostrarci il tuo apprezzamento inviando una piccola donazione.</string>
|
<string name="home_support_content">Magisk è e sempre sarà gratuito ed open source. Puoi comunque mostrarci il tuo apprezzamento inviando una piccola donazione.</string>
|
||||||
|
|
||||||
<string name="home_package">Pacchetto</string>
|
<string name="home_package">Pacchetto</string>
|
||||||
|
|
||||||
<string name="home_status_normal">Normale</string>
|
<string name="home_status_normal">Normale</string>
|
||||||
|
<string name="home_check_safetynet">Controlla SafetyNet</string>
|
||||||
|
<string name="loading">Caricamento…</string>
|
||||||
|
<string name="not_available">N/D</string>
|
||||||
|
<string name="status">Stato</string>
|
||||||
<string name="invalid_update_channel">Canale di aggiornamento non valido</string>
|
<string name="invalid_update_channel">Canale di aggiornamento non valido</string>
|
||||||
<string name="uninstall_magisk_title">Disinstalla Magisk</string>
|
<string name="uninstall_magisk_title">Disinstalla Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Tutti i moduli verranno disabilitati/rimossi!\nIl root verrà rimosso e i tuoi dati potrebbero essere criptati, nel caso non lo siano già.</string>
|
<string name="uninstall_magisk_msg">Tutti i moduli verranno disabilitati/rimossi!\nIl root verrà rimosso e i tuoi dati potrebbero essere criptati, nel caso non lo siano già.</string>
|
||||||
@@ -34,7 +37,7 @@
|
|||||||
<!--Install-->
|
<!--Install-->
|
||||||
<string name="keep_force_encryption">Mantieni crittografia forzata</string>
|
<string name="keep_force_encryption">Mantieni crittografia forzata</string>
|
||||||
<string name="keep_dm_verity">Mantieni AVB 2.0/dm-verity</string>
|
<string name="keep_dm_verity">Mantieni AVB 2.0/dm-verity</string>
|
||||||
<string name="recovery_mode">Recovery Mode</string>
|
<string name="recovery_mode">Modalità recovery</string>
|
||||||
<string name="install_options_title">Opzioni</string>
|
<string name="install_options_title">Opzioni</string>
|
||||||
<string name="install_method_title">Metodo</string>
|
<string name="install_method_title">Metodo</string>
|
||||||
<string name="install_next">Avanti</string>
|
<string name="install_next">Avanti</string>
|
||||||
@@ -42,18 +45,19 @@
|
|||||||
<string name="manager_download_install">Apri questa notifica per scaricare e installare</string>
|
<string name="manager_download_install">Apri questa notifica per scaricare e installare</string>
|
||||||
<string name="download_zip_only">Scarica solo il file zip</string>
|
<string name="download_zip_only">Scarica solo il file zip</string>
|
||||||
<string name="direct_install">Installazione diretta (raccomandata)</string>
|
<string name="direct_install">Installazione diretta (raccomandata)</string>
|
||||||
<string name="install_inactive_slot">Installa nello slot inattivo (dopo un OTA)</string>
|
<string name="install_inactive_slot">Installa nello slot inattivo (dopo un aggiornamento OTA)</string>
|
||||||
<string name="install_inactive_slot_msg">Questo dispositivo verrà FORZATO ad avviarsi usando lo slot inattivo!\nUsa questo metodo solo dopo che un OTA è stato installato.\nVuoi continuare?</string>
|
<string name="install_inactive_slot_msg">Questo dispositivo verrà FORZATO ad avviarsi usando lo slot inattivo!\nUsa questo metodo solo dopo che un aggiornamento OTA è stato installato.\nVuoi continuare?</string>
|
||||||
<string name="setup_title">Configurazione aggiuntiva</string>
|
<string name="setup_title">Configurazione aggiuntiva</string>
|
||||||
<string name="select_patch_file">Seleziona e aggiorna un file</string>
|
<string name="select_patch_file">Seleziona e aggiorna un file</string>
|
||||||
<string name="patch_file_msg">Seleziona un\'immagine in formato .img o un file ODIN .tar</string>
|
<string name="patch_file_msg">Seleziona un\'immagine in formato .img o un file ODIN .tar</string>
|
||||||
<string name="reboot_delay_toast">Riavvio fra 5 secondi…</string>
|
<string name="reboot_delay_toast">Riavvio fra 5 secondi…</string>
|
||||||
|
<string name="flash_screen_title">Installazione</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Richiesta Superuser</string>
|
<string name="su_request_title">Richiesta di accesso root</string>
|
||||||
<string name="deny">Nega</string>
|
<string name="deny">Nega</string>
|
||||||
<string name="prompt">Chiedi</string>
|
<string name="prompt">Chiedi</string>
|
||||||
<string name="grant">Accetta</string>
|
<string name="grant">Consenti</string>
|
||||||
<string name="su_warning">Concede il pieno accesso al dispositivo.\nNega se non sei sicuro!</string>
|
<string name="su_warning">Concede il pieno accesso al dispositivo.\nNega se non sei sicuro!</string>
|
||||||
<string name="forever">Sempre</string>
|
<string name="forever">Sempre</string>
|
||||||
<string name="once">Una volta</string>
|
<string name="once">Una volta</string>
|
||||||
@@ -61,22 +65,22 @@
|
|||||||
<string name="twentymin">20 minuti</string>
|
<string name="twentymin">20 minuti</string>
|
||||||
<string name="thirtymin">30 minuti</string>
|
<string name="thirtymin">30 minuti</string>
|
||||||
<string name="sixtymin">60 minuti</string>
|
<string name="sixtymin">60 minuti</string>
|
||||||
<string name="su_allow_toast">%1$s ha ottenuto i permessi Superuser</string>
|
<string name="su_allow_toast">%1$s ha ottenuto i permessi di root</string>
|
||||||
<string name="su_deny_toast">%1$s non ha ottenuto i permessi Superuser</string>
|
<string name="su_deny_toast">%1$s non ha ottenuto i permessi di root</string>
|
||||||
<string name="su_snack_grant"> %1$s ha ottenuto i permessi Superuser</string>
|
<string name="su_snack_grant">%1$s potrà ottenere i permessi di root</string>
|
||||||
<string name="su_snack_deny"> %1$s non ha ottenuto i permessi Superuser</string>
|
<string name="su_snack_deny">%1$s non potrà più ottenere i permessi di root</string>
|
||||||
<string name="su_snack_notif_on">Notifiche per %1$s abilitate</string>
|
<string name="su_snack_notif_on">Notifiche per %1$s abilitate</string>
|
||||||
<string name="su_snack_notif_off">Notifiche per %1$s disabilitate</string>
|
<string name="su_snack_notif_off">Notifiche per %1$s disabilitate</string>
|
||||||
<string name="su_snack_log_on">Registro eventi abilitato per %1$s</string>
|
<string name="su_snack_log_on">Registrazione eventi abilitata per %1$s</string>
|
||||||
<string name="su_snack_log_off">Registro eventi non abilitato per %1$s</string>
|
<string name="su_snack_log_off">Registrazione eventi disabilitata per %1$s</string>
|
||||||
<string name="su_revoke_title">Conferma revoca</string>
|
<string name="su_revoke_title">Conferma revoca</string>
|
||||||
<string name="su_revoke_msg">Confermi la revoca dei diritti a %1$s?</string>
|
<string name="su_revoke_msg">Confermi la revoca dei permessi a %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="superuser_toggle_notification">Notifiche</string>
|
<string name="superuser_toggle_notification">Notifiche</string>
|
||||||
<string name="superuser_toggle_revoke">Revoca</string>
|
<string name="superuser_toggle_revoke">Revoca</string>
|
||||||
<string name="superuser_policy_none">Nessuna app ha ancora chiesto i permessi di superuser.</string>
|
<string name="superuser_policy_none">Nessuna app ha ancora chiesto i permessi di root.</string>
|
||||||
|
|
||||||
<!--Logs-->
|
<!--Logs-->
|
||||||
<string name="log_data_none">Non ci sono eventi, prova ad utilizzare un\'app che richiede i diritti di root.</string>
|
<string name="log_data_none">Non ci sono eventi, prova ad utilizzare un\'app che richiede i diritti di root.</string>
|
||||||
@@ -90,7 +94,7 @@
|
|||||||
<!--SafetyNet-->
|
<!--SafetyNet-->
|
||||||
<string name="safetynet_api_error">Errore nelle API SafetyNet</string>
|
<string name="safetynet_api_error">Errore nelle API SafetyNet</string>
|
||||||
<string name="safetynet_res_invalid">La risposta non è valida</string>
|
<string name="safetynet_res_invalid">La risposta non è valida</string>
|
||||||
<string name="safetynet_attest_success">Successo!</string>
|
<string name="safetynet_attest_success">Attestazione riuscita!</string>
|
||||||
<string name="safetynet_attest_failure">Attestazione fallita!</string>
|
<string name="safetynet_attest_failure">Attestazione fallita!</string>
|
||||||
<string name="safetynet_attest_loading">Solo un secondo…</string>
|
<string name="safetynet_attest_loading">Solo un secondo…</string>
|
||||||
<string name="safetynet_attest_restart">Prova di nuovo</string>
|
<string name="safetynet_attest_restart">Prova di nuovo</string>
|
||||||
@@ -104,18 +108,19 @@
|
|||||||
|
|
||||||
<!--Module Fragment-->
|
<!--Module Fragment-->
|
||||||
<string name="no_info_provided">(Nessuna informazione)</string>
|
<string name="no_info_provided">(Nessuna informazione)</string>
|
||||||
<string name="reboot_recovery">Riavvia in Recovery</string>
|
<string name="reboot_recovery">Riavvia in recovery</string>
|
||||||
<string name="reboot_bootloader">Riavvia in Bootloader</string>
|
<string name="reboot_bootloader">Riavvia in bootloader</string>
|
||||||
<string name="reboot_download">Riavvia in Download Mode</string>
|
<string name="reboot_download">Riavvia in modalità download</string>
|
||||||
<string name="reboot_edl">Riavvia in EDL</string>
|
<string name="reboot_edl">Riavvia in modalità EDL</string>
|
||||||
<string name="module_version_author">%1$s di %2$s</string>
|
<string name="module_version_author">%1$s di %2$s</string>
|
||||||
<string name="module_section_pending">Aggiornamenti</string>
|
<string name="module_section_pending">Aggiornamenti</string>
|
||||||
<string name="module_section_pending_action">Aggiorna tutto</string>
|
<string name="module_section_pending_action">Aggiorna tutto</string>
|
||||||
<string name="module_state_remove">Rimuovi</string>
|
<string name="module_state_remove">Rimuovi</string>
|
||||||
<string name="module_state_restore">Ripristina</string>
|
<string name="module_state_restore">Ripristina</string>
|
||||||
<string name="module_action_install_external">Installa dalla memoria</string>
|
<string name="module_action_install_external">Installa dal dispositivo</string>
|
||||||
|
<string name="module_installed">Installato</string>
|
||||||
|
<string name="module_section_online">Online</string>
|
||||||
<string name="update_available">Aggiornamento disponibile</string>
|
<string name="update_available">Aggiornamento disponibile</string>
|
||||||
<string name="home_installed_version">Installato</string>
|
|
||||||
<string name="sorting_order">Ordina per</string>
|
<string name="sorting_order">Ordina per</string>
|
||||||
|
|
||||||
<!--Settings -->
|
<!--Settings -->
|
||||||
@@ -127,7 +132,7 @@
|
|||||||
<string name="settings_download_path_title">Percorso di download</string>
|
<string name="settings_download_path_title">Percorso di download</string>
|
||||||
<string name="settings_download_path_message">I file verranno salvati in %1$s</string>
|
<string name="settings_download_path_message">I file verranno salvati in %1$s</string>
|
||||||
<string name="settings_clear_cache_title">Svuota cache repository</string>
|
<string name="settings_clear_cache_title">Svuota cache repository</string>
|
||||||
<string name="settings_clear_cache_summary">Svuota la cache delle repository. Questa opzione forza l\'aggiornamento online dell\'app</string>
|
<string name="settings_clear_cache_summary">Svuota la cache dei repository. In questo modo l\'app sarà costretta a recuperare le informazioni online</string>
|
||||||
<string name="settings_hide_manager_title">Nascondi Magisk Manager</string>
|
<string name="settings_hide_manager_title">Nascondi Magisk Manager</string>
|
||||||
<string name="settings_hide_manager_summary">Reinstalla Magisk Manager con un nome pacchetto e app casuali</string>
|
<string name="settings_hide_manager_summary">Reinstalla Magisk Manager con un nome pacchetto e app casuali</string>
|
||||||
<string name="settings_restore_manager_title">Ripristina Magisk Manager</string>
|
<string name="settings_restore_manager_title">Ripristina Magisk Manager</string>
|
||||||
@@ -139,12 +144,12 @@
|
|||||||
<string name="settings_update_channel_title">Canale di aggiornamento</string>
|
<string name="settings_update_channel_title">Canale di aggiornamento</string>
|
||||||
<string name="settings_update_stable">Stabile</string>
|
<string name="settings_update_stable">Stabile</string>
|
||||||
<string name="settings_update_beta">Beta</string>
|
<string name="settings_update_beta">Beta</string>
|
||||||
<string name="settings_update_custom">Personalizzato</string>
|
<string name="settings_update_custom">Canale personalizzato</string>
|
||||||
<string name="settings_update_custom_msg">Inserisci un URL personalizzato</string>
|
<string name="settings_update_custom_msg">Inserisci un URL personalizzato</string>
|
||||||
<string name="settings_magiskhide_summary">Nasconde Magisk da numerose rilevazioni</string>
|
<string name="settings_magiskhide_summary">Nasconde Magisk da numerosi sistemi di rilevazione</string>
|
||||||
<string name="settings_hosts_title">Host systemless</string>
|
<string name="settings_hosts_title">File hosts systemless</string>
|
||||||
<string name="settings_hosts_summary">Supporto a host systemless per le app che bloccano le pubblicità</string>
|
<string name="settings_hosts_summary">Supporto al file hosts systemless per le app che bloccano le pubblicità</string>
|
||||||
<string name="settings_hosts_toast">Aggiunto modulo per host systemless</string>
|
<string name="settings_hosts_toast">Aggiunto modulo per il supporto al file hosts systemless</string>
|
||||||
<string name="settings_app_name_hint">Nuovo nome</string>
|
<string name="settings_app_name_hint">Nuovo nome</string>
|
||||||
<string name="settings_app_name_helper">L\'app sarà ricreata con questo nome</string>
|
<string name="settings_app_name_helper">L\'app sarà ricreata con questo nome</string>
|
||||||
<string name="settings_app_name_error">Formato non valido</string>
|
<string name="settings_app_name_error">Formato non valido</string>
|
||||||
@@ -158,27 +163,27 @@
|
|||||||
<string name="settings_su_request_30">30 secondi</string>
|
<string name="settings_su_request_30">30 secondi</string>
|
||||||
<string name="settings_su_request_45">45 secondi</string>
|
<string name="settings_su_request_45">45 secondi</string>
|
||||||
<string name="settings_su_request_60">60 secondi</string>
|
<string name="settings_su_request_60">60 secondi</string>
|
||||||
<string name="superuser_access">Accesso Superuser</string>
|
<string name="superuser_access">Accesso root</string>
|
||||||
<string name="auto_response">Accesso predefinito</string>
|
<string name="auto_response">Azione predefinita</string>
|
||||||
<string name="request_timeout">Timeout richiesta</string>
|
<string name="request_timeout">Timeout richiesta</string>
|
||||||
<string name="superuser_notification">Notifica Superuser</string>
|
<string name="superuser_notification">Notifica di accesso root</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">Richiedi nuovamente i permessi di root dopo l\'aggiornamento di un\'app</string>
|
||||||
<string name="settings_su_biometric_title">Abilita autenticazione biometrica</string>
|
<string name="settings_su_biometric_title">Abilita autenticazione biometrica</string>
|
||||||
<string name="settings_su_biometric_summary">Utilizza l\'autenticazione biometrica per accettare le richieste superuser</string>
|
<string name="settings_su_biometric_summary">Utilizza l\'autenticazione biometrica per accettare le richieste di accesso root</string>
|
||||||
<string name="no_biometric">Il dispositivo non è supportato o le impostazioni biometriche sono disattivate</string>
|
<string name="no_biometric">Il dispositivo non è supportato o le impostazioni biometriche sono disattivate</string>
|
||||||
<string name="settings_customization">Personalizzazione</string>
|
<string name="settings_customization">Personalizzazione</string>
|
||||||
<string name="setting_add_shortcut_summary">Aggiungi un collegamento alla schermata iniziale se il nome e l\'icona sono difficili da riconoscere dopo aver nascosto l\'App</string>
|
<string name="setting_add_shortcut_summary">Aggiungi un collegamento alla schermata iniziale se il nome e l\'icona sono difficili da riconoscere dopo aver nascosto l\'app</string>
|
||||||
<string name="settings_doh_title">DNS over HTTPS</string>
|
<string name="settings_doh_title">DNS over HTTPS</string>
|
||||||
<string name="settings_doh_description">Soluzione alternativa al DNS poisoning in alcune nazioni</string>
|
<string name="settings_doh_description">Soluzione alternativa al DNS poisoning in alcune nazioni</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 per il proprietario del dispositivo</string>
|
||||||
<string name="settings_owner_manage">Gestito dal proprietario utente</string>
|
<string name="settings_owner_manage">Gestito dal proprietario del dispositivo</string>
|
||||||
<string name="settings_user_independent">Idipendente dall\'utente</string>
|
<string name="settings_user_independent">Indipendente dall\'utente</string>
|
||||||
<string name="owner_only_summary">Solo il proprietario ha i permessi di root</string>
|
<string name="owner_only_summary">Solo il proprietario possiede i permessi di root</string>
|
||||||
<string name="owner_manage_summary">Solo il proprietario può gestire accesso root e ricevere richieste</string>
|
<string name="owner_manage_summary">Solo il proprietario può gestire l\'accesso root e ricevere le richieste dalle app</string>
|
||||||
<string name="user_indepenent_summary">Ogni utente ha le proprie regole di root indpendenti</string>
|
<string name="user_indepenent_summary">Ogni utente ha le proprie regole di root indipendenti</string>
|
||||||
|
|
||||||
<string name="mount_namespace_mode">Modalità mount namespace</string>
|
<string name="mount_namespace_mode">Modalità mount namespace</string>
|
||||||
<string name="settings_ns_global">Namespace globale</string>
|
<string name="settings_ns_global">Namespace globale</string>
|
||||||
@@ -206,20 +211,20 @@
|
|||||||
<string name="download">Download</string>
|
<string name="download">Download</string>
|
||||||
<string name="reboot">Riavvia</string>
|
<string name="reboot">Riavvia</string>
|
||||||
<string name="release_notes">Note di rilascio</string>
|
<string name="release_notes">Note di rilascio</string>
|
||||||
<string name="repo_cache_cleared">La cache delle repository è stata svuotata</string>
|
<string name="repo_cache_cleared">La cache dei repository è stata svuotata</string>
|
||||||
<string name="flashing">Flash in corso…</string>
|
<string name="flashing">Flash in corso…</string>
|
||||||
<string name="done">Completato!</string>
|
<string name="done">Completato!</string>
|
||||||
<string name="failure">Fallito</string>
|
<string name="failure">Fallito</string>
|
||||||
<string name="hide_manager_title">Nascondendo Magisk Manager…</string>
|
<string name="hide_manager_title">Nascondendo Magisk Manager…</string>
|
||||||
<string name="hide_manager_fail_toast">Non è stato possibile nascondere Magisk Manager.</string>
|
<string name="hide_manager_fail_toast">Non è stato possibile nascondere Magisk Manager.</string>
|
||||||
<string name="open_link_failed_toast">Nessuna app disponibile per aprire il link</string>
|
<string name="open_link_failed_toast">Nessuna app disponibile per aprire il link</string>
|
||||||
<string name="complete_uninstall">Disinstallazione completa</string>
|
<string name="complete_uninstall">Disinstalla completamente</string>
|
||||||
<string name="restore_img">Ripristina Immagini</string>
|
<string name="restore_img">Ripristina immagini</string>
|
||||||
<string name="restore_img_msg">Ripristino…</string>
|
<string name="restore_img_msg">Ripristino…</string>
|
||||||
<string name="restore_done">Ripristino completato!</string>
|
<string name="restore_done">Ripristino completato!</string>
|
||||||
<string name="restore_fail">Non esiste un\'immagine originale di boot!</string>
|
<string name="restore_fail">Non esiste un backup dell\'immagine di boot originale!</string>
|
||||||
<string name="proprietary_title">Scarica codice proprietario</string>
|
<string name="proprietary_title">Scarica codice proprietario</string>
|
||||||
<string name="proprietary_notice">Magisk Manager è FOSS e non contiene codice proprietario delle API Google SafetyNet.\n\nVuoi scaricare un\'estensione (contenente GoogleApiClient) per controllare lo stato di SafetyNet?</string>
|
<string name="proprietary_notice">Magisk Manager è un software libero e open source e non contiene codice proprietario delle API SafetyNet di Google.\n\nVuoi scaricare un\'estensione (contenente GoogleApiClient) per controllare lo stato di SafetyNet?</string>
|
||||||
<string name="setup_fail">Configurazione fallita</string>
|
<string name="setup_fail">Configurazione fallita</string>
|
||||||
<string name="env_fix_title">Configurazione aggiuntiva richiesta</string>
|
<string name="env_fix_title">Configurazione aggiuntiva richiesta</string>
|
||||||
<string name="env_fix_msg">Il tuo dispositivo necessita di una configurazione aggiuntiva per far funzionare Magisk correttamente. Verrà scaricato il file zip di Magisk, vuoi procedere ora?</string>
|
<string name="env_fix_msg">Il tuo dispositivo necessita di una configurazione aggiuntiva per far funzionare Magisk correttamente. Verrà scaricato il file zip di Magisk, vuoi procedere ora?</string>
|
||||||
@@ -227,8 +232,9 @@
|
|||||||
<string name="authenticate">Autentica</string>
|
<string name="authenticate">Autentica</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_msg">Questa versione di Magisk Manager non supporta versioni di Magisk inferiori a %1$s.\n\nQuesta app si comporterà come se non fosse installato Magisk, che deve essere aggiornato per procedere all\'utilizzo.</string>
|
<string name="unsupport_magisk_msg">Questa versione di Magisk Manager non supporta versioni di Magisk inferiori a %1$s.\n\nQuesta app si comporterà come se non fosse installato Magisk, che deve essere aggiornato per procedere all\'utilizzo.</string>
|
||||||
<string name="external_rw_permission_denied">Concedi i permessi alla memoria per abilitare questa opzione</string>
|
<string name="external_rw_permission_denied">Consenti l\'accesso alla memoria del dispositivo per abilitare questa opzione</string>
|
||||||
<string name="add_shortcut_title">Aggiungi collegamento alla schermata iniziale</string>
|
<string name="add_shortcut_title">Aggiungi collegamento alla schermata iniziale</string>
|
||||||
<string name="add_shortcut_msg">Dopo aver nascosto Magisk Manager, il suo nome e la sua icona potrebbero diventare difficili da riconoscere. Vuoi aggiungere una scorciatoia alla schermata principale?</string>
|
<string name="add_shortcut_msg">Dopo aver nascosto Magisk Manager, il suo nome e la sua icona potrebbero diventare difficili da riconoscere. Vuoi aggiungere una scorciatoia alla schermata principale?</string>
|
||||||
|
<string name="app_not_found">Nessuna app disponibile per gestire quest\'azione</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
<string name="invalid_update_channel">Nieprawidłowy kanał aktualizacji</string>
|
<string name="invalid_update_channel">Nieprawidłowy kanał aktualizacji</string>
|
||||||
<string name="uninstall_magisk_title">Odinstaluj Magiska</string>
|
<string name="uninstall_magisk_title">Odinstaluj Magiska</string>
|
||||||
<string name="uninstall_magisk_msg">Wszystkie moduły zostaną wyłączone/usunięte!\nRoot zostanie usunięty!\nTwoje dane zostaną potencjalnie zaszyfrowane, jeżeli obecnie nie są!</string>
|
<string name="uninstall_magisk_msg">Wszystkie moduły zostaną wyłączone/usunięte!\nRoot zostanie usunięty!\nTwoje dane zostaną potencjalnie zaszyfrowane, jeżeli obecnie nie są!</string>
|
||||||
|
<string name="home_check_safetynet">Sprawdź SafetyNet</string>
|
||||||
|
|
||||||
<!--Install-->
|
<!--Install-->
|
||||||
<string name="keep_force_encryption">Zachowaj force encryption (wymuszenie szyfrowania)</string>
|
<string name="keep_force_encryption">Zachowaj force encryption (wymuszenie szyfrowania)</string>
|
||||||
@@ -51,6 +52,7 @@
|
|||||||
<string name="select_patch_file">Wybierz i zmodyfikuj plik</string>
|
<string name="select_patch_file">Wybierz i zmodyfikuj plik</string>
|
||||||
<string name="patch_file_msg">Wybierz obraz raw (*.img) lub plik tar ODIN (*.tar)</string>
|
<string name="patch_file_msg">Wybierz obraz raw (*.img) lub plik tar ODIN (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Ponowne uruchomienie za 5 sekund…</string>
|
<string name="reboot_delay_toast">Ponowne uruchomienie za 5 sekund…</string>
|
||||||
|
<string name="flash_screen_title">Instalacja</string>
|
||||||
|
|
||||||
<!--Superuser-->
|
<!--Superuser-->
|
||||||
<string name="su_request_title">Żądanie dostępu do Superusera</string>
|
<string name="su_request_title">Żądanie dostępu do Superusera</string>
|
||||||
@@ -119,8 +121,8 @@
|
|||||||
<string name="module_action_install_external">Zainstaluj z pamięci</string>
|
<string name="module_action_install_external">Zainstaluj z pamięci</string>
|
||||||
<string name="update_available">Dostępna aktualizacja</string>
|
<string name="update_available">Dostępna aktualizacja</string>
|
||||||
<string name="module_installed">Zainstalowane</string>
|
<string name="module_installed">Zainstalowane</string>
|
||||||
|
<string name="module_section_online">Online</string>
|
||||||
<string name="sorting_order">Kolejność sortowania</string>
|
<string name="sorting_order">Kolejność sortowania</string>
|
||||||
<string name="external_rw_permission_denied">Zezwól na dostęp do pamięci wewnętrznej, aby włączyć tę funkcjonalność.</string>
|
|
||||||
|
|
||||||
<!--Settings -->
|
<!--Settings -->
|
||||||
<string name="settings_dark_mode_title">Tryb motywu</string>
|
<string name="settings_dark_mode_title">Tryb motywu</string>
|
||||||
@@ -172,6 +174,9 @@
|
|||||||
<string name="settings_su_biometric_summary">Używaj uwierzytelniania biometrycznego (np. odcisku palca) aby przyznać uprawnienia Superusera</string>
|
<string name="settings_su_biometric_summary">Używaj uwierzytelniania biometrycznego (np. odcisku palca) aby przyznać uprawnienia Superusera</string>
|
||||||
<string name="no_biometric">Urządzenie jest nieobsługiwane lub ustawienia biometryczne nie są włączone</string>
|
<string name="no_biometric">Urządzenie jest nieobsługiwane lub ustawienia biometryczne nie są włączone</string>
|
||||||
<string name="settings_customization">Personalizacja</string>
|
<string name="settings_customization">Personalizacja</string>
|
||||||
|
<string name="setting_add_shortcut_summary">Dodaj ładny skrót na ekranie głównym na wypadek, gdyby nazwa i ikona były trudne do rozpoznania po ukryciu aplikacji</string>
|
||||||
|
<string name="settings_doh_title">DNS over HTTPS</string>
|
||||||
|
<string name="settings_doh_description">Zapobiegaj zatruciu DNS (DNS poisoning) w części krajów</string>
|
||||||
|
|
||||||
<string name="multiuser_mode">Tryb wielu użytkowników (Multiuser)</string>
|
<string name="multiuser_mode">Tryb wielu użytkowników (Multiuser)</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>
|
||||||
@@ -228,5 +233,9 @@
|
|||||||
<string name="authenticate">Uwierzytelnianie</string>
|
<string name="authenticate">Uwierzytelnianie</string>
|
||||||
<string name="unsupport_magisk_title">Nieobsługiwana wersja Magiska</string>
|
<string name="unsupport_magisk_title">Nieobsługiwana wersja Magiska</string>
|
||||||
<string name="unsupport_magisk_msg">Ta wersja Magisk Managera nie obsługuje wersji Magiska poniżej %1$s.\n\nAplikacja będzie działać tak, jakby Magisk nie był zainstalowany. Zaktualizuj Magiska jak najszybciej.</string>
|
<string name="unsupport_magisk_msg">Ta wersja Magisk Managera nie obsługuje wersji Magiska poniżej %1$s.\n\nAplikacja będzie działać tak, jakby Magisk nie był zainstalowany. Zaktualizuj Magiska jak najszybciej.</string>
|
||||||
|
<string name="external_rw_permission_denied">Zezwól na dostęp do pamięci wewnętrznej, aby włączyć tę funkcjonalność.</string>
|
||||||
|
<string name="add_shortcut_title">Utwórz skrót na ekranie głównym</string>
|
||||||
|
<string name="add_shortcut_msg">Po ukryciu Magisk Managera, jego nazwa i ikona mogą stać się trudne do rozpoznania. Czy chcesz dodać ładny skrót na ekranie głównym?</string>
|
||||||
|
<string name="app_not_found">Nie znaleziono aplikacji do wykonania tej czynności</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
<string name="superuser">Superusuário</string>
|
<string name="superuser">Superusuário</string>
|
||||||
<string name="logs">Registros</string>
|
<string name="logs">Registros</string>
|
||||||
<string name="settings">Configurações</string>
|
<string name="settings">Configurações</string>
|
||||||
|
<string name="refresh">Atualizar Dados Locais</string>
|
||||||
<string name="install">Instalar</string>
|
<string name="install">Instalar</string>
|
||||||
<string name="section_home">Início</string>
|
<string name="section_home">Início</string>
|
||||||
<string name="section_theme">Temas</string>
|
<string name="section_theme">Temas</string>
|
||||||
@@ -23,8 +24,6 @@
|
|||||||
<string name="home_package">Pacote</string>
|
<string name="home_package">Pacote</string>
|
||||||
<string name="home_status_normal">Normal</string>
|
<string name="home_status_normal">Normal</string>
|
||||||
<string name="invalid_update_channel">Canal de atualização inválido</string>
|
<string name="invalid_update_channel">Canal de atualização inválido</string>
|
||||||
<string name="safetynet_api_error">Erro do API SafetyNet</string>
|
|
||||||
<string name="safetynet_res_invalid">A resposta é inválida</string>
|
|
||||||
<string name="uninstall_magisk_title">Desinstalar Magisk</string>
|
<string name="uninstall_magisk_title">Desinstalar Magisk</string>
|
||||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos!\nA raiz será removida!\nSeus dados potencialmente criptografados, se ainda não estiverem!</string>
|
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos!\nA raiz será removida!\nSeus dados potencialmente criptografados, se ainda não estiverem!</string>
|
||||||
<string name="update">Atualização</string>
|
<string name="update">Atualização</string>
|
||||||
@@ -46,6 +45,7 @@
|
|||||||
<string name="select_patch_file">Selecione e corrija um arquivo</string>
|
<string name="select_patch_file">Selecione e corrija um arquivo</string>
|
||||||
<string name="patch_file_msg">Selecione uma imagem bruta (*.img) ou um arquivo tarin ODIN (*.tar)</string>
|
<string name="patch_file_msg">Selecione uma imagem bruta (*.img) ou um arquivo tarin ODIN (*.tar)</string>
|
||||||
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
||||||
|
<string name="flash_screen_title">Instalação</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>
|
||||||
@@ -86,6 +86,8 @@
|
|||||||
<string name="target_uid">Alvo UID: %1$d</string>
|
<string name="target_uid">Alvo UID: %1$d</string>
|
||||||
|
|
||||||
<!--SafetyNet-->
|
<!--SafetyNet-->
|
||||||
|
<string name="safetynet_api_error">Erro API SafetyNet</string>
|
||||||
|
<string name="safetynet_res_invalid">A resposta é inválida</string>
|
||||||
<string name="safetynet_attest_success">Sucesso!</string>
|
<string name="safetynet_attest_success">Sucesso!</string>
|
||||||
<string name="safetynet_attest_failure">O certificado falhou!</string>
|
<string name="safetynet_attest_failure">O certificado falhou!</string>
|
||||||
<string name="safetynet_attest_loading">Aguarde…</string>
|
<string name="safetynet_attest_loading">Aguarde…</string>
|
||||||
@@ -113,6 +115,7 @@
|
|||||||
<string name="update_available">Atualização disponível</string>
|
<string name="update_available">Atualização disponível</string>
|
||||||
<string name="home_installed_version">Instalado</string>
|
<string name="home_installed_version">Instalado</string>
|
||||||
<string name="sorting_order">Ordem de classificação</string>
|
<string name="sorting_order">Ordem de classificação</string>
|
||||||
|
|
||||||
|
|
||||||
<!--Settings -->
|
<!--Settings -->
|
||||||
<string name="settings_dark_mode_title">Modo de tema</string>
|
<string name="settings_dark_mode_title">Modo de tema</string>
|
||||||
@@ -121,6 +124,7 @@
|
|||||||
<string name="settings_dark_mode_system">Baseado no Sistema</string>
|
<string name="settings_dark_mode_system">Baseado no Sistema</string>
|
||||||
<string name="settings_dark_mode_dark">Sempre Escuro</string><
|
- [Installation Instructions](install.md)
|
||||||
- [Frequently Asked Questions](faq.md)
|
- [Frequently Asked Questions](faq.md)
|
||||||
|
@@ -1,5 +1,17 @@
|
|||||||
# Magisk Manager Changelog
|
# Magisk Manager Changelog
|
||||||
|
|
||||||
|
## v8.0.2
|
||||||
|
|
||||||
|
- Fix an issue with requesting permission on devices older than Android 10
|
||||||
|
- Make more files download through CDN
|
||||||
|
|
||||||
|
### v8.0.1
|
||||||
|
|
||||||
|
- Fix `vbmeta.img` patching for Samsung `AP.tar` files. This fixes bootloops on devices like Galaxy S10 after flashing updated AP files.
|
||||||
|
- Properly truncate existing files before writing to prevent corrupted files
|
||||||
|
- Prevent a possible UI loop when device ran into very low memory
|
||||||
|
- Switch to use JSDelivr CDN for several files
|
||||||
|
|
||||||
### v8.0.0
|
### v8.0.0
|
||||||
|
|
||||||
- 100% full app rewrite! Will highlight functional changes below.
|
- 100% full app rewrite! Will highlight functional changes below.
|
||||||
|
@@ -9,3 +9,9 @@ Manually enable MagiskHide in settings (MagiskHide is no longer enabled by defau
|
|||||||
If you have USB debugging enabled in developer options, connect your phone to the PC. If your device is detected (check by `adb devices`), enter ADB shell and run the command `magisk --remove-modules`. This will remove all your modules and automatically reboot the device.
|
If you have USB debugging enabled in developer options, connect your phone to the PC. If your device is detected (check by `adb devices`), enter ADB shell and run the command `magisk --remove-modules`. This will remove all your modules and automatically reboot the device.
|
||||||
|
|
||||||
If unfortunately you do not have USB debugging enabled, reboot into Safe Mode. Most modern Android devices support pressing a special key combo at boot to enter Safe Mode as an emergency option. Magisk will detect Safe Mode being activated, and all modules will be disabled. Then reboot back to normal mode (the module disable state persists) and manage your modules through Magisk Manager.
|
If unfortunately you do not have USB debugging enabled, reboot into Safe Mode. Most modern Android devices support pressing a special key combo at boot to enter Safe Mode as an emergency option. Magisk will detect Safe Mode being activated, and all modules will be disabled. Then reboot back to normal mode (the module disable state persists) and manage your modules through Magisk Manager.
|
||||||
|
|
||||||
|
### Q: After I hidden Magisk Manager, the app icon is broken.
|
||||||
|
|
||||||
|
On devices running Android 9.0+, Magisk Manager will use a more advanced hiding method. It will install a "stub" APK that has nothing in it. The only functionality the stub app has is downloading the full Magisk Manager APK into its internal storage and dynamically load it. Due to the fact that the APK is literally *empty*, it does not contain the image resource for the app icon.
|
||||||
|
|
||||||
|
When you open the hidden Magisk Manager, it will offer you the option to create a shortcut in the homescreen (which has both the correct app name and icon) for your convenience. You can also manually ask the app to create the icon in Magisk Manager settings.
|
||||||
|
@@ -28,7 +28,7 @@ If you are using a Huawei device and the **SAR** result is **Yes**, please check
|
|||||||
Otherwise, continue to [Patching Images](#patching-images).
|
Otherwise, continue to [Patching Images](#patching-images).
|
||||||
|
|
||||||
(P.S.1 If your device have boot ramdisk, you can also install with [Custom Recovery](#custom-recovery))<br>
|
(P.S.1 If your device have boot ramdisk, you can also install with [Custom Recovery](#custom-recovery))<br>
|
||||||
(P.S.2 If you are interested in how Android boots and how it affects Magisk, check out [this document](#boot.md))
|
(P.S.2 If you are interested in how Android boots and how it affects Magisk, check out [this document](boot.md))
|
||||||
|
|
||||||
## Patching Images
|
## Patching Images
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
## 2020.10.3 Magisk v21.0
|
## 2020.10.3 Magisk v21.0
|
||||||
|
|
||||||
Long time no see! v21.0 is the largest release in Magisk's history. It comes with full Android 11 support (tons of stuff has to be rewritten from scratch!), and a completely redesigned Magisk Manager. These are the reasons why this particular public release took me over half an year to wrap up.
|
Long time no see! v21.0 is the largest release in Magisk's history. It comes with full Android 11 support (tons of stuff had to be rewritten from scratch!), and a completely redesigned Magisk Manager. These are the reasons why this particular public release took me over half a year to wrap up.
|
||||||
|
|
||||||
To the end user, not much has changed other than the fact that Magisk Manager has completely changed its appearance. However developers should pay some attention to some changes due to adjustments for Android 11. Full changelogs are too massive to fit, so here I'll point out the main changes and links to updated documentations.
|
To the end user, not much has changed other than the fact that Magisk Manager has completely changed its appearance. However developers should pay some attention to some changes due to adjustments for Android 11. Full changelogs are too massive to fit, so here I'll point out the main changes and links to updated documentations.
|
||||||
|
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="upgrade_msg">Täienda seadistuse lõpetamiseks Magisk Manager\'i täisversioonile. Kas laadid alla ja installid?</string>
|
<string name="upgrade_msg">Täienda seadistuse lõpetamiseks Magisk Manageri täisversioonile. Kas laadid alla ja installid?</string>
|
||||||
<string name="no_internet_msg">Palun ühendu Internetti! Nõutud on Magisk Manager\'i täisversioonile täiendamine.</string>
|
<string name="no_internet_msg">Palun ühendu Internetti! Nõutud on Magisk Manageri täisversioonile täiendamine.</string>
|
||||||
|
<string name="dling">Allalaadimine</string>
|
||||||
|
<string name="relaunch_app">Palun käivita rakendus uuesti</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="upgrade_msg">Zaktualizuj aplikację do pełnej wersji Magisk Managera aby ukończyć instalację. Pobrać i zainstalować?</string>
|
<string name="upgrade_msg">Zaktualizuj aplikację do pełnej wersji Magisk Managera aby ukończyć instalację. Pobrać i zainstalować?</string>
|
||||||
<string name="no_internet_msg">Połącz się z Internetem! Wymagana jest aktualizacja do pełnej wersji Magisk Managera.</string>
|
<string name="no_internet_msg">Połącz się z Internetem! Wymagana jest aktualizacja do pełnej wersji Magisk Managera.</string>
|
||||||
<string name="dling">Pobieranie</string>
|
<string name="dling">Pobieranie</string>
|
||||||
|
<string name="relaunch_app">Proszę ręcznie uruchomić ponownie aplikację</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Reference in New Issue
Block a user