diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fc2538a1..ba529055 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,7 +66,7 @@ android { } dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.2") implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("androidx.biometric:biometric:1.1.0") @@ -77,8 +77,9 @@ dependencies { implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.work:work-runtime-ktx:2.8.0") implementation("com.google.android.material:material:1.8.0") - implementation("dev.rikka.shizuku:api:13.1.1") - implementation("dev.rikka.shizuku:provider:13.1.1") + implementation("dev.rikka.shizuku:api:13.1.4") + implementation("dev.rikka.shizuku:provider:13.1.4") + implementation("io.github.iamr0s:Dhizuku-API:2.4") implementation("me.zhanghai.android.appiconloader:appiconloader:1.5.0") implementation("org.lsposed.hiddenapibypass:hiddenapibypass:4.3") implementation("com.belerweb:pinyin4j:2.5.1") diff --git a/app/src/main/kotlin/com/aistra/hail/HailApp.kt b/app/src/main/kotlin/com/aistra/hail/HailApp.kt index 4185b3fb..4215d27f 100644 --- a/app/src/main/kotlin/com/aistra/hail/HailApp.kt +++ b/app/src/main/kotlin/com/aistra/hail/HailApp.kt @@ -8,6 +8,7 @@ import androidx.core.content.ContextCompat import com.aistra.hail.app.AppManager import com.aistra.hail.app.HailData import com.aistra.hail.services.AutoFreezeService +import com.aistra.hail.utils.HDhizuku import com.google.android.material.color.DynamicColors class HailApp : Application() { @@ -16,6 +17,7 @@ class HailApp : Application() { app = this DynamicColors.applyToActivitiesIfAvailable(app) // DirtyDataUpdater.update(app) + if (HailData.workingMode.startsWith(HailData.DHIZUKU)) HDhizuku.init() } fun setAutoFreezeService(enabled: Boolean? = null) { diff --git a/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt b/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt index ce945f89..33229f52 100644 --- a/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt +++ b/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt @@ -13,7 +13,7 @@ class AppInfo( val applicationInfo: ApplicationInfo? get() = HPackages.getApplicationInfoOrNull(packageName) val name get() = applicationInfo?.loadLabel(app.packageManager) ?: packageName - var state: Int = getCurrentState() + var state: Int = STATE_UNKNOWN fun getCurrentState(): Int = when { applicationInfo == null -> STATE_UNKNOWN AppManager.isAppFrozen(packageName) -> STATE_FROZEN diff --git a/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt b/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt index b2ceb33a..e44abdc5 100644 --- a/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt +++ b/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt @@ -2,6 +2,7 @@ package com.aistra.hail.app import android.content.Intent import com.aistra.hail.BuildConfig +import com.aistra.hail.utils.HDhizuku import com.aistra.hail.utils.HPackages import com.aistra.hail.utils.HPolicy import com.aistra.hail.utils.HShell @@ -14,6 +15,7 @@ object AppManager { val lockScreen: Boolean get() = when { HailData.workingMode.startsWith(HailData.OWNER) -> HPolicy.lockScreen + HailData.workingMode.startsWith(HailData.DHIZUKU) -> HDhizuku.lockScreen HailData.workingMode.startsWith(HailData.SU) -> HShell.lockScreen HailData.workingMode.startsWith(HailData.SHIZUKU) -> HShizuku.lockScreen else -> false @@ -21,6 +23,7 @@ object AppManager { fun isAppFrozen(packageName: String): Boolean = when { HailData.workingMode == HailData.MODE_OWNER_HIDE -> HPolicy.isAppHidden(packageName) + HailData.workingMode == HailData.MODE_DHIZUKU_HIDE -> HDhizuku.isAppHidden(packageName) HailData.workingMode == HailData.MODE_SHIZUKU_HIDE -> HShizuku.isAppHidden(packageName) HailData.workingMode.endsWith(HailData.SUSPEND) -> HPackages.isAppSuspended(packageName) else -> HPackages.isAppDisabled(packageName) @@ -30,6 +33,8 @@ object AppManager { packageName != BuildConfig.APPLICATION_ID && when (HailData.workingMode) { HailData.MODE_OWNER_HIDE -> HPolicy.setAppHidden(packageName, frozen) HailData.MODE_OWNER_SUSPEND -> HPolicy.setAppSuspended(packageName, frozen) + HailData.MODE_DHIZUKU_HIDE -> HDhizuku.setAppHidden(packageName, frozen) + HailData.MODE_DHIZUKU_SUSPEND -> HDhizuku.setAppSuspended(packageName, frozen) HailData.MODE_SU_DISABLE -> HShell.setAppDisabled(packageName, frozen) HailData.MODE_SU_SUSPEND -> HShell.setAppSuspended(packageName, frozen) HailData.MODE_SHIZUKU_DISABLE -> HShizuku.setAppDisabled(packageName, frozen) @@ -44,10 +49,17 @@ object AppManager { packageName ) ) return true + + HailData.workingMode.startsWith(HailData.DHIZUKU) -> if (HDhizuku.uninstallApp( + packageName + ) + ) return true + HailData.workingMode.startsWith(HailData.SU) -> if (HShell.uninstallApp( packageName ) ) return true + HailData.workingMode.startsWith(HailData.SHIZUKU) -> if (HShizuku.uninstallApp( packageName ) diff --git a/app/src/main/kotlin/com/aistra/hail/app/HailData.kt b/app/src/main/kotlin/com/aistra/hail/app/HailData.kt index ee9c7292..1831e9c5 100644 --- a/app/src/main/kotlin/com/aistra/hail/app/HailData.kt +++ b/app/src/main/kotlin/com/aistra/hail/app/HailData.kt @@ -31,6 +31,7 @@ object HailData { const val WORKING_MODE = "working_mode" const val MODE_DEFAULT = "default" const val OWNER = "owner_" + const val DHIZUKU = "dhizuku_" const val SU = "su_" const val SHIZUKU = "shizuku_" private const val DISABLE = "disable" @@ -38,6 +39,8 @@ object HailData { const val SUSPEND = "suspend" const val MODE_OWNER_HIDE = OWNER + HIDE const val MODE_OWNER_SUSPEND = OWNER + SUSPEND + const val MODE_DHIZUKU_HIDE = DHIZUKU + HIDE + const val MODE_DHIZUKU_SUSPEND = DHIZUKU + SUSPEND const val MODE_SU_DISABLE = SU + DISABLE const val MODE_SU_SUSPEND = SU + SUSPEND const val MODE_SHIZUKU_DISABLE = SHIZUKU + DISABLE diff --git a/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt b/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt index 45a861ab..cc8eab0d 100644 --- a/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt +++ b/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt @@ -51,14 +51,9 @@ class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedList override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) - when (errorCode) { - BiometricPrompt.ERROR_NO_BIOMETRICS, BiometricPrompt.ERROR_HW_NOT_PRESENT -> unlock() - BiometricPrompt.ERROR_NEGATIVE_BUTTON, BiometricPrompt.ERROR_USER_CANCELED -> finishAndRemoveTask() - else -> { - HUI.showToast(errString) - finishAndRemoveTask() - } - } + HUI.showToast(errString) + if (errorCode == BiometricPrompt.ERROR_NO_BIOMETRICS) unlock() + else finishAndRemoveTask() } override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { diff --git a/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt b/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt index ad366b35..4afb11b1 100644 --- a/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt @@ -3,7 +3,6 @@ package com.aistra.hail.ui.settings import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle -import android.os.SystemClock import android.provider.Settings import android.view.* import android.widget.FrameLayout @@ -13,6 +12,7 @@ import androidx.core.view.MenuHost import androidx.core.view.MenuProvider import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.aistra.hail.HailApp.Companion.app @@ -23,11 +23,18 @@ import com.aistra.hail.app.HailData import com.aistra.hail.databinding.DialogInputBinding import com.aistra.hail.utils.* import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.rosan.dhizuku.api.Dhizuku +import com.rosan.dhizuku.api.DhizukuRequestPermissionListener import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.channels.trySendBlocking +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import rikka.shizuku.Shizuku + class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener, MenuProvider { override fun onCreateView( @@ -116,6 +123,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan HailApi.getIntentForTag(HailApi.ACTION_FREEZE_TAG, tag) ) }.setNegativeButton(android.R.string.cancel, null).show() + 1 -> MaterialAlertDialogBuilder(requireActivity()).setTitle(R.string.action_unfreeze_tag) .setItems(HailData.tags.map { it.first }.toTypedArray()) { _, index -> val tag = HailData.tags[index].first @@ -128,6 +136,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan HailApi.getIntentForTag(HailApi.ACTION_UNFREEZE_TAG, tag) ) }.setNegativeButton(android.R.string.cancel, null).show() + 2 -> HShortcuts.addPinShortcut( AppCompatResources.getDrawable( requireContext(), R.drawable.ic_round_frozen_shortcut @@ -136,6 +145,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan getString(R.string.action_freeze_all), Intent(HailApi.ACTION_FREEZE_ALL) ) + 3 -> HShortcuts.addPinShortcut( AppCompatResources.getDrawable( requireContext(), R.drawable.ic_round_unfrozen_shortcut @@ -144,6 +154,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan getString(R.string.action_unfreeze_all), Intent(HailApi.ACTION_UNFREEZE_ALL) ) + 4 -> HShortcuts.addPinShortcut( AppCompatResources.getDrawable( requireContext(), R.drawable.ic_round_frozen_shortcut @@ -152,6 +163,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan getString(R.string.action_freeze_non_whitelisted), Intent(HailApi.ACTION_FREEZE_NON_WHITELISTED) ) + 5 -> HShortcuts.addPinShortcut( AppCompatResources.getDrawable( requireContext(), R.drawable.ic_outline_lock_shortcut @@ -160,6 +172,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan getString(R.string.action_lock), Intent(HailApi.ACTION_LOCK) ) + 6 -> HShortcuts.addPinShortcut( AppCompatResources.getDrawable( requireContext(), R.drawable.ic_outline_lock_shortcut @@ -183,10 +196,41 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan .show() return false } + + mode.startsWith(HailData.DHIZUKU) -> return runCatching { + Dhizuku.init(app) + when { + Dhizuku.isPermissionGranted() -> true + else -> { + lifecycleScope.launch { + val result = callbackFlow { + Dhizuku.requestPermission(object : + DhizukuRequestPermissionListener() { + override fun onRequestPermission(grantResult: Int) { + trySendBlocking(grantResult == PackageManager.PERMISSION_GRANTED) + } + }) + awaitClose() + }.first() + if (result && preference is ListPreference) { + preference.value = mode + if (HTarget.O) HDhizuku.setDelegatedScopes() + } + } + false + } + } + }.getOrElse { + HLog.e(it) + HUI.showToast(R.string.permission_denied) + false + } + mode.startsWith(HailData.SU) -> if (!HShell.checkSU) { HUI.showToast(R.string.permission_denied) return false } + mode.startsWith(HailData.SHIZUKU) -> return runCatching { when { Shizuku.isPreV11() -> throw IllegalStateException("unsupported shizuku version") @@ -195,12 +239,25 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan HUI.showToast(R.string.permission_denied) false } + else -> { - Shizuku.requestPermission(0) - while (Shizuku.checkSelfPermission() != PackageManager.PERMISSION_GRANTED) { - SystemClock.sleep(1000) + lifecycleScope.launch { + val result = callbackFlow { + val shizukuRequestCode = 0 + val listener = + Shizuku.OnRequestPermissionResultListener { requestCode, grantResult -> + if (requestCode != shizukuRequestCode) return@OnRequestPermissionResultListener + trySendBlocking(grantResult == PackageManager.PERMISSION_GRANTED) + } + Shizuku.addRequestPermissionResultListener(listener) + Shizuku.requestPermission(shizukuRequestCode) + awaitClose { + Shizuku.removeRequestPermissionResultListener(listener) + } + }.first() + if (result && preference is ListPreference) preference.value = mode } - true + false } } }.getOrElse { @@ -246,6 +303,7 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChan } }.setNegativeButton(android.R.string.cancel, null).show() } + R.id.action_help -> HUI.openLink(HailData.URL_README) } return false diff --git a/app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt b/app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt new file mode 100644 index 00000000..be591e76 --- /dev/null +++ b/app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt @@ -0,0 +1,92 @@ +package com.aistra.hail.utils + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.app.admin.DevicePolicyManager +import android.content.ComponentName +import android.content.Intent +import android.os.Build +import android.os.IBinder +import androidx.annotation.RequiresApi +import androidx.core.content.getSystemService +import com.aistra.hail.HailApp.Companion.app +import com.rosan.dhizuku.api.Dhizuku +import com.rosan.dhizuku.shared.DhizukuVariables +import org.lsposed.hiddenapibypass.HiddenApiBypass + +object HDhizuku { + private val dpm = app.getSystemService()!! + + fun init() { + if (Dhizuku.init(app) && Dhizuku.isPermissionGranted() && HTarget.O) setDelegatedScopes() + } + + @RequiresApi(Build.VERSION_CODES.O) + fun setDelegatedScopes() { + if (!Dhizuku.getDelegatedScopes().contains(DevicePolicyManager.DELEGATION_PACKAGE_ACCESS)) + Dhizuku.setDelegatedScopes(arrayOf(DevicePolicyManager.DELEGATION_PACKAGE_ACCESS)) + } + + val lockScreen: Boolean + get() = runCatching { + dpm.lockNow() + true + }.getOrDefault(false) + + fun isAppHidden(packageName: String): Boolean = runCatching { + HTarget.O && dpm::class.java.getMethod( + "isApplicationHidden", ComponentName::class.java, String::class.java + ).invoke(dpm, null, packageName) as Boolean + }.getOrDefault(false) + + fun setAppHidden(packageName: String, hidden: Boolean): Boolean = runCatching { + HTarget.O && dpm::class.java.getMethod( + "setApplicationHidden", + ComponentName::class.java, + String::class.java, + Boolean::class.java + ).invoke(dpm, null, packageName, hidden) as Boolean + }.getOrDefault(false) + + fun setAppSuspended(packageName: String, suspended: Boolean): Boolean = runCatching { + HTarget.O && (dpm::class.java.getMethod( + "setPackagesSuspended", + ComponentName::class.java, + Array::class.java, + Boolean::class.java + ).invoke(dpm, null, arrayOf(packageName), suspended) as Array<*>).isEmpty() + }.getOrDefault(false) + + @SuppressLint("PrivateApi") + fun uninstallApp(packageName: String): Boolean = runCatching { + val installer = app.packageManager.packageInstaller + if (HTarget.P) HiddenApiBypass.setHiddenApiExemptions("") + val mPackageName = installer::class.java.getDeclaredField("mInstallerPackageName") + mPackageName.isAccessible = true + if (mPackageName.get(installer) != DhizukuVariables.PACKAGE_NAME) { + mPackageName.set(installer, DhizukuVariables.PACKAGE_NAME) + val mInstaller = installer::class.java.getDeclaredField("mInstaller") + mInstaller.isAccessible = true + val origin = mInstaller.get(installer) + val proxy = Class.forName("android.content.pm.IPackageInstaller\$Stub") + .getMethod("asInterface", IBinder::class.java) + .invoke( + null, + Dhizuku.binderWrapper( + origin::class.java.getMethod("asBinder").invoke(origin) as IBinder + ) + ) + mInstaller.set(installer, proxy) + } + installer.uninstall( + packageName, + PendingIntent.getActivity( + app, + 0, + Intent(), + PendingIntent.FLAG_IMMUTABLE + ).intentSender + ) + true + }.getOrDefault(false) +} \ No newline at end of file diff --git a/app/src/main/res/raw/licenses b/app/src/main/res/raw/licenses index d11ab2a1..af8226e3 100644 --- a/app/src/main/res/raw/licenses +++ b/app/src/main/res/raw/licenses @@ -4,6 +4,10 @@ Kotlin (Apache 2.0): https://kotlinlang.org Material Components for Android (Apache 2.0): https://github.com/material-components/material-components-android +Dhizuku (GPL 3.0): https://github.com/iamr0s/Dhizuku + +Dhizuku-API (MIT): https://github.com/iamr0s/Dhizuku-API + Shizuku (Apache 2.0): https://github.com/RikkaApps/Shizuku Shizuku-API (MIT): https://github.com/RikkaApps/Shizuku-API diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 151986f6..6b6ff8e4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -55,7 +55,8 @@ Geräteeigentümer festlegen Dieses Kommando per adb ausfüren:\n%s Geräteeigentümer entffernen - Der Geräteeigentümer wird entfernt. Es könnte ggf. nicht mehr funktionieren, ihn nach dem Entfernen wieder zu setzen.\nAusgeblendete (hidden) Anwendungen sind nach dem Entfernen weiterhin versteckt. Ausgeblendete Anwendungen unbedingt vorher wieder einblenden. + Der Geräteeigentümer wird entfernt. Es könnte ggf. nicht mehr funktionieren, ihn nach dem Entfernen wieder zu setzen. +\nAusgeblendete (hidden) Anwendungen sind nach dem Entfernen weiterhin versteckt. Ausgeblendete Anwendungen unbedingt vorher wieder einblenden. Antippen für Mehrfachauswahl Filter Benutzer @@ -133,4 +134,7 @@ Etikett auftauen Symbolpaket Alles auswählen + Terminal + Dhizuku – Aussetzen + Dhizuku – Verstecken \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ba59faaf..aabd1ec7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -51,8 +51,8 @@ Establecer el administrador de dispositivo Emitir el comando desde adb:\n%s Elminar el administrador de dispositivo - Se eliminará el propietario del dispositivo, puede ser difícil configurarlo nuevamente después de la eliminación. -\nLas aplicaciones congeladas permanecerán congeladas después de la eliminación, asegúrete de haber descongelado las aplicaciones importantes. + Si se elimina Hail como propietario del dispositivo, puede haber dificultades para reorganizar las aplicaciones después de la eliminación de Hail. +\nLas aplicaciones congeladas permanecerán congeladas después de la eliminación, por favor asegúrese de que ha descongelado las aplicaciones importantes. Pulse para multiseleccionar Filtro Usuario @@ -67,10 +67,10 @@ Alipay WeChat Pay Escanear - bilibili - Sigueme en bilibili. - My space - @android:string/cancel + Bilibili + Sígueme en Bilibili. + Espacio en Bilibili + Cancelar Liberapay PayPal ¡Gracias! @@ -110,7 +110,7 @@ Iconos en escala de grises Iconos compacto Inicio de sesión biométrico - Inicie sesión con su identificación biométrica + Regístrate con tu identificación biométrica Fijar Desfijar Nada por aquí @@ -138,4 +138,6 @@ Paquete de iconos Seleccionar todo Terminal + Dhizuku - Ocultar + Dhizuku - Suspender \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 76e81644..2c76ee65 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -10,66 +10,66 @@ Grup Telegram Grup QQ Terjemahkan - Cool Apk store + CoolApk Donasi ke pengembang Tukarkan kode Github Lisensi Bekukan semua - Bekukan saat ini - Aktifkan semuanya - Bekukan selain pengecualian + Bekukan label ini + Aktifkan semua + Bekukan selain daftar putih Kunci Luncurkan Copot - Shizuku/SUI - Sembunyikan - Tambahkan tugas + Shizuku - Sembunyikan + Tambahkan label Cari Bekukan Aktifkan - Hapus tugas + Hapus label Hapus dari daftar - Aktifkan dan Hapus dari daftar + Aktifkan dan hapus dari daftar Batalkan Info aplikasi - Salin file .apk - Aktifkan yang ini - Matikan layar & bekukan + Ekstrak APK + Aktifkan label ini + Kunci & Bekukan Tangguhkan tugas Bantuan Copot pemasangan aplikasi ini\? Mode kerja - Pemilik perangkat - Sembunyikan + Pemilik Perangkat - Sembunyikan SuperUser - Tangguhkan SuperUser - Matikan - Shizuku/SUI - Matikan - Shizuku/SUI - Tangguhkan - Kode voucher salah - Launch activity tidak ditemukan - Pilih aplikasi untuk disalin + Shizuku - Matikan + Shizuku - Tangguhkan + Kode salah + Pintasan peluncur tidak ditemukan + Tandai pilihan Atur Pemilik Perangkat - Saring + Filter Pengguna Dibekukan - Aktif + Diaktifkan Kode kadaluwarsa - Jalankan cmd dari ADB shell: + Jalankan perintah dari adb: \n%s - Hail akan dihapus sbg pemilik perangkat, mungkin akan ada kesulitan mengatur kembali setelah terhapus. -\nAplikasi yang dibekukan tetap tersembunyi setelah penghapusan, pastikan anda telah mengaktifkan aplikasi penting anda. + Jika Hail dihapus sebagai pemilik perangkat, mungkin akan ada kesulitan mengatur kembali Aplikasi setelah Hail terhapus. +\nAplikasi yang dibekukan tetap dibekukan setelah penghapusan, pastikan anda telah mengaktifkan aplikasi penting anda. Hapus Pemilik Perangkat Sistem Nama - Terimakasih! + Terima kasih! Pindai - Terimakasih! - Tidak dapat terhubung dengan server. Silakan coba beberapa saat lagi. - Diperlukan perizinan + Terima kasih! + Tidak dapat terhubung ke server. Silakan coba beberapa saat lagi. + Akses ditolak Aplikasi tidak terpasang Disalin: %s Bekukan otomatis - Layanan otomatis beku berjalan - Shizuku/SUI tidak ditemukan + Layanan bekukan otomatis sedang berjalan + Shizuku tidak ditemukan :( Terekspor : %s %d menit @@ -80,56 +80,60 @@ Bersihkan semua pintasan dinamis Batal sematkan Operasi gagal : %s - Sebelum membekukan, silakan pilih mode kerja dulu. + Sebelum membekukan aplikasi, silakan pilih mode kerja dulu. Terimpor: %s Setelah layar terkunci - Lewati aplikasi latarbelakang - Tambakan dari papan klip + Lewati aplikasi latar depan + Impor dari papan klip Penyesuaian - Masuk sidikjari - Icon kompleks - Salin aplikasi - Tempelkan semua - Lewati aplikasi \'notifying\' + Masuk dengan biometrik + Ikon kecil + Impor aplikasi + Ekspor semua + Lewati pemberitahuan aplikasi Pintasan Kosong - Icon Hitam-Putih - Masuk dengan sidik jari + Ikon hitam-putih + Masuk dengan indentifikasi biometrik anda Sematkan - Hapus dari pengecualian - Salin aplikasi dibekukan + Hapus dari daftar putih + Impor aplikasi dibekukan Tunda bekukan (menit) Hail Batalkan pilihan - Kosong di sini - Tambahkan ke pengecualian - Adaptif ukuran icon - Ekspor saat ini + Tidak ada apa-apa di sini + Tambahkan ke daftar putih + Ikon adaptif + Ekspor label ini Pintasan aksi dinamis - Label bekukan + Bekukan berdasar label Aktifkan berdasar label - Tambakan ke peluncur + Tambahkan ke layar beranda Atur label - Salin ke papa klip + Ekspor ke papan klip Pemilik Perangkat - Tangguhkan Urutkan Terakhir diperbarui - Awal pemasangan + Pemasangan terlama Paypal Freezedom! - Ikuti di Bilibili room. + Ikuti saya di Bilibili. Pindahkan ke: %s Batal Terpilih : %s Dibekukan: %s Diaktifkan: %s - Aksi mengambang - Lewatkan ketika mengisi batrai - Kemasan icon - My space + Tombol mengambang + Lewati ketika mengisi daya + Paket ikon + Bilibili space Siaga Liberapay Alipay WeChat Pay - bilibili + Bilibili + Terminal + Tandai semua + Dhizuku - Sembunyikan + Dhizuku - Tangguhkan \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 3d2739bd..abd97868 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -134,4 +134,8 @@ Enhetseier vil fremdeles bli fjernet, det kan være vanskelig å sette det igjen etter fjerning. \nSkjulte programmer er skjult etter fjerning. Forsikre deg om at du har opphevet skjuling av viktige programmer. Mitt donasjonsforetak + Velg alt + Dhizuku — skjul + Dhizuku — hvilemodus + Terminal \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml new file mode 100644 index 00000000..461ba6bd --- /dev/null +++ b/app/src/main/res/values-or/strings.xml @@ -0,0 +1,41 @@ + + + ଗୃହ + ସେଟିଂ + ଡିଫଲ୍ଟ + Telegram ଗୋଷ୍ଠୀ + QQ ଗୋଷ୍ଠୀ + ଦାନ କରନ୍ତୁ + ଅନୁଵାଦ କରନ୍ତୁ + ସହାୟତା + ସନ୍ଧାନ + ଆପ୍ ସୂଚନା + ପ୍ରଥମ ଅଧିସ୍ଥାପନ + ଗତ ଅଦ୍ୟତନ + ନାମ + + %d ମିନିଟ୍ + %d ମିନିଟ୍ + + ଵିଷୟରେ + ସଂସ୍କରଣ + ପୂର୍ଵଵତ୍ + ଏଠାରେ କିଛି ନାହିଁ + ଏହା ଅନୁଯାୟୀ ସଜାନ୍ତୁ + ଉପଭୋକ୍ତା + ସିଷ୍ଟମ୍ + ଶୋଧନ + ଅଧିସ୍ଥାପନ ସମୟ + ଗୃହ ପରଦାରେ ଯୋଡ଼ନ୍ତୁ + Superuser - ଅକ୍ଷମ କର + ଡିଵାଇସ୍ ଅଧିପତି - ନିଲମ୍ବନ କର + Superuser - ନିଲମ୍ବନ କର + Shizuku - ନିଲମ୍ବନ କର + Shizuku - ଲୁଚାଅ + Dhizuku - ନିଲମ୍ବନ କର + Shizuku - ଅକ୍ଷମ କର + କାର୍ଯ୍ୟ ଧାରା + ଡିଵାଇସ୍ ଅଧିପତି - ଲୁଚାଅ + ଅକାମ + Dhizuku - ଲୁଚାଅ + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..a6b3daec --- /dev/null +++ b/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2a51adbf..98ef3f97 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -51,7 +51,8 @@ Настройка режима Владелец устройства Выполните команду из adb:\n%s Удаление Владельца устройства - Владелец устройства будет удален, после удаления может быть сложно настроить его снова.\nСкрытые приложения останутся такими же после удаления. Убедитесь, что вы отключили скрытие для важных приложений. + Владелец устройства будет удален, после удаления может быть сложно настроить его снова. +\nЗамороженые приложения останутся такими же после удаления. Убедитесь, что вы разморозили важные приложения . Нажмите, чтобы выбрать несколько Фильтр Пользовательские @@ -137,4 +138,6 @@ Пакет иконок Выбрать все Terminal + Dhizuku - Скрытие + Dhizuku - Приостановка \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4de8101b..7cbaa9a0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,6 +1,6 @@ - Freezedom! + Özgürlük! Ev Ayarlar Hakkında @@ -136,4 +136,6 @@ Cihaz Yöneticisi - Askıya Al \@android:string/cancel Terminal + Dhizuku - Askıya al + Dhizuku - Gizle \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a8d84970..2debfc28 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -18,9 +18,9 @@ Заморозити не з білого списку GitHub Допомога - Імпортувати додаток + Імпортувати додатки Імпортувати з буфера обміну - Імпортувати заморожений додаток + Імпортувати заморожені додатки Запустити Ліцензії Заблокувати @@ -54,10 +54,10 @@ Запущено службу автозаморожування Компактні іконки Alipay - bilibili - @android:string/cancel - Підписатись на bilibili. - My space + Bilibili + Скасувати + Підписатись на Bilibili. + Bilibili space Liberapay PayPal WeChat Pay @@ -82,21 +82,21 @@ Експортовано: %s Розпаковано до: %s Заморожено: %s - Перед заморожуванням додатків, будь ласка, виберіть режим роботи в налаштуваннях. + Перед заморожуванням додатків, будь ласка, виберіть робочий режим в налаштуваннях. Імпортовано: %s Не вдалося встановити зв\'язок з сервером. Будь ласка, повторіть спробу пізніше. Дякуємо! Термін дії коду закінчився Невірний код - Власник пристрою буде видалено, може бути важко встановити його знову після видалення. -\nПриховані додатки залишаються прихованими після видалення. Переконайтеся, що у вас є можливість видалити з прихованих важливі додатки. + Якщо Hail видалено як власника пристрою, після його видалення можуть виникнути труднощі з реорганізацією додатків. +\nЗаморожені додатки залишаться замороженими після видалення, будь ласка, переконайтеся, що ви розморозили важливі додатки. Вибрано: %s Введіть команду з adb: \n%s Скопійовано: %s Розморожено: %s - Ви хочете видалити цей додаток? - Нічого тут немає + Ви хочете видалити цей додаток\? + Тут нічого немає Операція завершилася невдало: %s В дозволі відмовлено Shizuku відсутній :( @@ -104,11 +104,11 @@ Пропустити додаток з сповіщенням Пропустити під час заряджання Сортувати за - Перша установка + Дата встановлення Назва Останнє оновлення Створити адаптивні іконки - Торкніться, щоб вибрати декілька варіантів + Торкніться для множинного вибору Дія плитки Про додаток Додатки @@ -140,4 +140,6 @@ Пакет значків Вибрати все Термінал + Dhizuku - Приховати + Dhizuku - Призупинити \ No newline at end of file diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml new file mode 100644 index 00000000..ae90a465 --- /dev/null +++ b/app/src/main/res/values-ur/strings.xml @@ -0,0 +1,141 @@ + + + یہاں کچھ بھی نہیں ہے + وائٹ لسٹ سے ہٹا دیں + ایپ درآمد کریں + ہیل + فریزڈم! + گھر + ایپس + ترتیبات + تعارف + طے شدہ + ورژن + انسٹال کرنے کا وقت + ٹیلیگرام گروپ + کیو کیو گروپ + CoolApk + عطیہ کریں + رڈیم کوڈ + منجمد + انجماد + موخر کام + ٹیگ شامل کریں + ٹیگ سیٹ کریں + کلپ بورڈ سے درآمد کریں + ہوم سے ہٹا دیں + غیر منجمد کریں اور گھر سے ہٹا دیں + غیر منتخب کریں + کالعدم + مدد + تلاش + ایپ کی معلومات + APK نکالیں + ان انسٹال کریں + کام کا طریقہ کار + بیکار + ڈیوائس کا مالک - چھپائیں + ڈیوائس کا مالک - معطل کریں + سپر یوزر - غیر فعال کریں + شیزوکو - چھپائیں + شیزوکو - معطل کریں + ڈیوائس کا مالک مقرر کریں + adb سے کمانڈ جاری کریں: +\n%s + ڈیوائس کے مالک کو ہٹا دیں + ڈیوائس کے مالک کو ہٹا دیا جائے گا، ہٹانے کے بعد اسے دوبارہ سیٹ کرنا مشکل ہو سکتا ہے۔ +\n منجمد ایپس ہٹانے کے بعد منجمد رہیں گی، براہ کرم یقینی بنائیں کہ آپ نے اہم ایپس کو غیر منجمد کر دیا ہے۔ + ملٹی سلیکٹ کرنے کے لیے ٹیپ کریں + فلٹر + صارف + سسٹم + منجمد + غیر منجمد + WeChat پے + اسکین کریں + bilibili + bilibili پر مجھے فالو کریں۔ + میری جگہ + Liberapay + PayPal + شکریہ! + غلط کوڈ + کوڈ کی میعاد ختم ہو گئی ہے + اجازت نہیں دی گئی + لانچ کی سرگرمی نہیں ملی + + %d منٹ + %d منٹس + + + %2$sکے بعد %1$dمنٹ: %3$s + %2$sکے بعد %1$dمنٹس: %3$s + + ‏تمام متحرک شارٹ کٹس کو صاف کریں + ٹائل ایکشن + آٹو منجمد + آٹو فریز سروس چل رہی ہے + اسکرین لاک ہونے کے بعد + چارج کرتے وقت چھوڑ دیں + حسب ضرورت بنائیں + گرے اسکیل آئیکن + انکولی شبیہیں سنتھیسائز کریں + موجودہ برآمد کریں + تمام برآمد کریں + اطلاع دینے والی ایپ کو چھوڑیں + منجمد تاخیر (منٹ) + شارٹ کٹس + ایپلیکیشنز کو منجمد کرنے سے پہلے، براہ کرم سیٹنگز میں ایک ورکنگ موڈ منتخب کریں۔ + متحرک شارٹ کٹ ایکشن + کوئی نہیں + منجمد ٹیگ + ٹیگ کو غیر منجمد کریں + آئیکن پیک + تمام منتخب کریں + ٹرمینل + دھیزوکو - چھپائیں + دھیزوکو - معطل کرنا + وائٹ لسٹ میں شامل کریں + کرنٹ کو منجمد کریں + لائسنس + تالا + ٹیگ کو ہٹا دیں + گٹ ہب + سب کو منجمد کریں + سب کو انجماد کریں + غیر سفید فام کو منجمد کریں + ترجمہ کریں + کرنٹ کو غیر منجمد کریں + لاک اینڈ فریز + ہوم اسکرین میں شامل کریں + لانچ کریں + کلپ بورڈ پر برآمد کریں + کیا آپ اس ایپ کو اَن انسٹال کرنا چاہتے ہیں؟ + سپر یوزر - معطل + شیزوکو - غیر فعال کریں + ترتیب دیں + پہلے انسٹال کریں + آخری اپ ڈیٹ + علیپے + نام + شکریہ! + \@android:string/کینسل + غیر منجمد: %s + سرور کے ساتھ بات چیت کرنے سے قاصر۔ براہ کرم کچھ دیر بعد کوشش کریں. + ایپ انسٹال نہیں ہے + آپریشن ناکام ہو گیا: %s + منتخب کردہ: %s + برآمد کیا گیا: %s + درآمد شدہ: %s + کاپی کیا گیا: %s + منجمد: %s + شیزوکو غائب ہے :( + اس پر نکالا گیا: %s + پیش منظر ایپ کو چھوڑیں + کومپیکٹ آئیکن + بائیو میٹرک لاگ ان + اپنے بائیو میٹرک اسناد کا استعمال کرتے ہوئے لاگ ان کریں + پن + ان پن + منجمد ایپ درآمد کریں + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 353bec56..17f5d36c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -52,8 +52,8 @@ 设置设备所有者 通过 adb 发出命令:\n%s 移除设备所有者 - 将移除雹的设备所有者,移除后可能难以再次设置。 -\n已冻结的应用在移除后仍会保持冻结状态,请确保您已将重要的应用解冻。 + 将移除雹的设备所有者,移除后便无法冻结与解冻应用。 +\n已冻结的应用在移除设备所有者后仍会保持冻结状态,请确保您已将重要的应用解冻。 点按多选 筛选 用户 @@ -137,4 +137,6 @@ 图标包 全选 终端 + Dhizuku - 隐藏 + Dhizuku - 暂停 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5e00f13e..7611785c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -49,7 +49,7 @@ 設定裝置擁有者 透過 adb 發出命令:\n%s 移除裝置擁有者 - 將移除雹的裝置擁有者,移除後可能難以再次設定。 + 如果「雹」作為装置擁有者被移除,則在「雹」移除後重新組織應用程式可能會遇到困難。 \n已凍結的應用程式在移除後仍會保持凍結,請確保您已將重要的應用程式解凍。 輕觸多選 篩選 @@ -61,7 +61,7 @@ 名稱 首次安裝 最近更新 - 謝謝你。 + 謝謝你! 支付寶 WeChat Pay 掃描 @@ -74,7 +74,7 @@ 下次一定 Liberapay PayPal - 謝謝你。 + 謝謝你! 無效的兌換代碼 兌換代碼已過期 無法連線至伺服器,請稍後再試。 @@ -134,4 +134,7 @@ 標籤解凍 圖示包 全選 + Dhizuku - 隱藏 + Dhizuku - 暫停 + 終端機 \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index fcf71c12..62271f6d 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -36,6 +36,8 @@ @string/mode_shizuku_suspend @string/mode_su_disable @string/mode_su_suspend + @string/mode_dhizuku_hide + @string/mode_dhizuku_suspend @string/mode_owner_hide @string/mode_owner_suspend @@ -46,6 +48,8 @@ shizuku_suspend su_disable su_suspend + dhizuku_hide + dhizuku_suspend owner_hide owner_suspend diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 59579b7d..80bee805 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,7 @@ Set Device Owner Issue the command from adb:\n%s Remove Device Owner - Device Owner will be removed, it might be difficult to set it again after removal. + If Hail is removed as the device owner, there may be difficulties reorganizing Apps after Hail removal. \nFrozen apps will remain frozen after removal, please make sure you have unfrozen the important apps. Tap to multiselect Filter @@ -73,10 +73,10 @@ Alipay WeChat Pay Scan - bilibili - Follow me on bilibili. - My space - @android:string/cancel + Bilibili + Follow me on Bilibili. + Bilibili space + Cancel Liberapay PayPal Thank you! @@ -114,7 +114,7 @@ Grayscale icon Compact icon Biometric login - Log in using your biometric credential + Login using your biometric credential Pin Unpin Add to Whitelist @@ -136,4 +136,6 @@ Icon pack Select all Terminal + Dhizuku - Hide + Dhizuku - Suspend \ No newline at end of file diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index de16a840..48918de6 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -9,10 +9,13 @@ + + + diff --git a/build.gradle.kts b/build.gradle.kts index 90514d37..a081fea6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.0.0" apply false + id("com.android.application") version "8.0.2" apply false kotlin("android") version "1.8.20" apply false }