diff --git a/app/src/main/kotlin/com/looker/droidify/datastore/PreferenceSettingsRepository.kt b/app/src/main/kotlin/com/looker/droidify/datastore/PreferenceSettingsRepository.kt index 99dbef2e..ad22ba25 100644 --- a/app/src/main/kotlin/com/looker/droidify/datastore/PreferenceSettingsRepository.kt +++ b/app/src/main/kotlin/com/looker/droidify/datastore/PreferenceSettingsRepository.kt @@ -14,6 +14,7 @@ import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringSetPreferencesKey import com.looker.droidify.datastore.model.AutoSync import com.looker.droidify.datastore.model.InstallerType +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.datastore.model.ProxyPreference import com.looker.droidify.datastore.model.ProxyType import com.looker.droidify.datastore.model.SortOrder @@ -85,6 +86,31 @@ class PreferenceSettingsRepository( override suspend fun setInstallerType(installerType: InstallerType) = INSTALLER_TYPE.update(installerType.name) + override suspend fun setLegacyInstallerComponent(component: LegacyInstallerComponent?) { + when (component) { + null -> { + LEGACY_INSTALLER_COMPONENT_TYPE.update("") + LEGACY_INSTALLER_COMPONENT_CLASS.update("") + LEGACY_INSTALLER_COMPONENT_ACTIVITY.update("") + } + is LegacyInstallerComponent.Component -> { + LEGACY_INSTALLER_COMPONENT_TYPE.update("component") + LEGACY_INSTALLER_COMPONENT_CLASS.update(component.clazz) + LEGACY_INSTALLER_COMPONENT_ACTIVITY.update(component.activity) + } + LegacyInstallerComponent.Unspecified -> { + LEGACY_INSTALLER_COMPONENT_TYPE.update("unspecified") + LEGACY_INSTALLER_COMPONENT_CLASS.update("") + LEGACY_INSTALLER_COMPONENT_ACTIVITY.update("") + } + LegacyInstallerComponent.AlwaysChoose -> { + LEGACY_INSTALLER_COMPONENT_TYPE.update("always_choose") + LEGACY_INSTALLER_COMPONENT_CLASS.update("") + LEGACY_INSTALLER_COMPONENT_ACTIVITY.update("") + } + } + } + override suspend fun setAutoUpdate(allow: Boolean) = AUTO_UPDATE.update(allow) @@ -125,6 +151,18 @@ class PreferenceSettingsRepository( private fun mapSettings(preferences: Preferences): Settings { val installerType = InstallerType.valueOf(preferences[INSTALLER_TYPE] ?: InstallerType.Default.name) + val legacyInstallerComponent = when (preferences[LEGACY_INSTALLER_COMPONENT_TYPE]) { + "component" -> { + preferences[LEGACY_INSTALLER_COMPONENT_CLASS]?.takeIf { it.isNotBlank() }?.let { cls -> + preferences[LEGACY_INSTALLER_COMPONENT_ACTIVITY]?.takeIf { it.isNotBlank() }?.let { act -> + LegacyInstallerComponent.Component(cls, act) + } + } + } + "unspecified" -> LegacyInstallerComponent.Unspecified + "always_choose" -> LegacyInstallerComponent.AlwaysChoose + else -> null + } val language = preferences[LANGUAGE] ?: "system" val incompatibleVersions = preferences[INCOMPATIBLE_VERSIONS] ?: false @@ -154,6 +192,7 @@ class PreferenceSettingsRepository( theme = theme, dynamicTheme = dynamicTheme, installerType = installerType, + legacyInstallerComponent = legacyInstallerComponent, autoUpdate = autoUpdate, autoSync = autoSync, sortOrder = sortOrder, @@ -185,6 +224,9 @@ class PreferenceSettingsRepository( val LAST_CLEAN_UP = longPreferencesKey("key_last_clean_up_time") val FAVOURITE_APPS = stringSetPreferencesKey("key_favourite_apps") val HOME_SCREEN_SWIPING = booleanPreferencesKey("key_home_swiping") + val LEGACY_INSTALLER_COMPONENT_CLASS = stringPreferencesKey("key_legacy_installer_component_class") + val LEGACY_INSTALLER_COMPONENT_ACTIVITY = stringPreferencesKey("key_legacy_installer_component_activity") + val LEGACY_INSTALLER_COMPONENT_TYPE = stringPreferencesKey("key_legacy_installer_component_type") // Enums val THEME = stringPreferencesKey("key_theme") @@ -200,6 +242,28 @@ class PreferenceSettingsRepository( set(UNSTABLE_UPDATES, settings.unstableUpdate) set(THEME, settings.theme.name) set(DYNAMIC_THEME, settings.dynamicTheme) + when (settings.legacyInstallerComponent) { + is LegacyInstallerComponent.Component -> { + set(LEGACY_INSTALLER_COMPONENT_TYPE, "component") + set(LEGACY_INSTALLER_COMPONENT_CLASS, settings.legacyInstallerComponent.clazz) + set(LEGACY_INSTALLER_COMPONENT_ACTIVITY, settings.legacyInstallerComponent.activity) + } + LegacyInstallerComponent.Unspecified -> { + set(LEGACY_INSTALLER_COMPONENT_TYPE, "unspecified") + set(LEGACY_INSTALLER_COMPONENT_CLASS, "") + set(LEGACY_INSTALLER_COMPONENT_ACTIVITY, "") + } + LegacyInstallerComponent.AlwaysChoose -> { + set(LEGACY_INSTALLER_COMPONENT_TYPE, "always_choose") + set(LEGACY_INSTALLER_COMPONENT_CLASS, "") + set(LEGACY_INSTALLER_COMPONENT_ACTIVITY, "") + } + null -> { + set(LEGACY_INSTALLER_COMPONENT_TYPE, "") + set(LEGACY_INSTALLER_COMPONENT_CLASS, "") + set(LEGACY_INSTALLER_COMPONENT_ACTIVITY, "") + } + } set(INSTALLER_TYPE, settings.installerType.name) set(AUTO_UPDATE, settings.autoUpdate) set(AUTO_SYNC, settings.autoSync.name) diff --git a/app/src/main/kotlin/com/looker/droidify/datastore/Settings.kt b/app/src/main/kotlin/com/looker/droidify/datastore/Settings.kt index 64f413a9..bf7a3eca 100644 --- a/app/src/main/kotlin/com/looker/droidify/datastore/Settings.kt +++ b/app/src/main/kotlin/com/looker/droidify/datastore/Settings.kt @@ -3,6 +3,7 @@ package com.looker.droidify.datastore import androidx.datastore.core.Serializer import com.looker.droidify.datastore.model.AutoSync import com.looker.droidify.datastore.model.InstallerType +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.datastore.model.ProxyPreference import com.looker.droidify.datastore.model.SortOrder import com.looker.droidify.datastore.model.Theme @@ -29,6 +30,7 @@ data class Settings( val theme: Theme = Theme.SYSTEM, val dynamicTheme: Boolean = false, val installerType: InstallerType = InstallerType.Default, + val legacyInstallerComponent: LegacyInstallerComponent? = null, val autoUpdate: Boolean = false, val autoSync: AutoSync = AutoSync.WIFI_ONLY, val sortOrder: SortOrder = SortOrder.UPDATED, diff --git a/app/src/main/kotlin/com/looker/droidify/datastore/SettingsRepository.kt b/app/src/main/kotlin/com/looker/droidify/datastore/SettingsRepository.kt index b1b54ac7..fad3b23e 100644 --- a/app/src/main/kotlin/com/looker/droidify/datastore/SettingsRepository.kt +++ b/app/src/main/kotlin/com/looker/droidify/datastore/SettingsRepository.kt @@ -3,6 +3,7 @@ package com.looker.droidify.datastore import android.net.Uri import com.looker.droidify.datastore.model.AutoSync import com.looker.droidify.datastore.model.InstallerType +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.datastore.model.ProxyType import com.looker.droidify.datastore.model.SortOrder import com.looker.droidify.datastore.model.Theme @@ -37,6 +38,8 @@ interface SettingsRepository { suspend fun setInstallerType(installerType: InstallerType) + suspend fun setLegacyInstallerComponent(component: LegacyInstallerComponent?) + suspend fun setAutoUpdate(allow: Boolean) suspend fun setAutoSync(autoSync: AutoSync) diff --git a/app/src/main/kotlin/com/looker/droidify/datastore/model/LegacyInstallerComponent.kt b/app/src/main/kotlin/com/looker/droidify/datastore/model/LegacyInstallerComponent.kt new file mode 100644 index 00000000..cdf00d9a --- /dev/null +++ b/app/src/main/kotlin/com/looker/droidify/datastore/model/LegacyInstallerComponent.kt @@ -0,0 +1,26 @@ +package com.looker.droidify.datastore.model + +import kotlinx.serialization.Serializable + +@Serializable +sealed class LegacyInstallerComponent { + @Serializable + object Unspecified : LegacyInstallerComponent() + + @Serializable + object AlwaysChoose : LegacyInstallerComponent() + + @Serializable + data class Component( + val clazz: String, + val activity: String, + ) : LegacyInstallerComponent() { + fun update( + newClazz: String? = null, + newActivity: String? = null, + ): Component = copy( + clazz = newClazz ?: clazz, + activity = newActivity ?: activity + ) + } +} diff --git a/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt b/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt index e6d6a87f..3530757d 100644 --- a/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt +++ b/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.sync.withLock class InstallManager( private val context: Context, - settingsRepository: SettingsRepository + private val settingsRepository: SettingsRepository ) { private val installItems = Channel() @@ -115,7 +115,7 @@ class InstallManager( private suspend fun setInstaller(installerType: InstallerType) { lock.withLock { _installer = when (installerType) { - InstallerType.LEGACY -> LegacyInstaller(context) + InstallerType.LEGACY -> LegacyInstaller(context, settingsRepository) InstallerType.SESSION -> SessionInstaller(context) InstallerType.SHIZUKU -> ShizukuInstaller(context) InstallerType.ROOT -> RootInstaller(context) diff --git a/app/src/main/kotlin/com/looker/droidify/installer/installers/LegacyInstaller.kt b/app/src/main/kotlin/com/looker/droidify/installer/installers/LegacyInstaller.kt index cdbd1c2d..825a4c76 100644 --- a/app/src/main/kotlin/com/looker/droidify/installer/installers/LegacyInstaller.kt +++ b/app/src/main/kotlin/com/looker/droidify/installer/installers/LegacyInstaller.kt @@ -1,20 +1,29 @@ package com.looker.droidify.installer.installers +import android.content.ComponentName import android.content.Context import android.content.Intent import android.util.AndroidRuntimeException import androidx.core.net.toUri +import com.looker.droidify.R +import com.looker.droidify.datastore.SettingsRepository +import com.looker.droidify.datastore.get +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.domain.model.PackageName import com.looker.droidify.installer.model.InstallItem import com.looker.droidify.installer.model.InstallState import com.looker.droidify.utility.common.SdkCheck import com.looker.droidify.utility.common.cache.Cache import com.looker.droidify.utility.common.extension.intent +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume @Suppress("DEPRECATION") -class LegacyInstaller(private val context: Context) : Installer { +class LegacyInstaller( + private val context: Context, + private val settingsRepository: SettingsRepository +) : Installer { companion object { private const val APK_MIME = "application/vnd.android.package-archive" @@ -22,29 +31,50 @@ class LegacyInstaller(private val context: Context) : Installer { override suspend fun install( installItem: InstallItem, - ): InstallState = suspendCancellableCoroutine { cont -> + ): InstallState { val installFlag = if (SdkCheck.isNougat) Intent.FLAG_GRANT_READ_URI_PERMISSION else 0 val fileUri = if (SdkCheck.isNougat) { - Cache.getReleaseUri( - context, - installItem.installFileName - ) + Cache.getReleaseUri(context, installItem.installFileName) } else { Cache.getReleaseFile(context, installItem.installFileName).toUri() } - val installIntent = intent(Intent.ACTION_INSTALL_PACKAGE) { - setDataAndType(fileUri, APK_MIME) - flags = installFlag - } - try { - context.startActivity(installIntent) - cont.resume(InstallState.Installed) - } catch (e: AndroidRuntimeException) { - installIntent.flags = installFlag or Intent.FLAG_ACTIVITY_NEW_TASK - context.startActivity(installIntent) - cont.resume(InstallState.Installed) - } catch (e: Exception) { - cont.resume(InstallState.Failed) + + val comp = settingsRepository.get { legacyInstallerComponent }.firstOrNull() + + return suspendCancellableCoroutine { cont -> + val intent = Intent(Intent.ACTION_INSTALL_PACKAGE).apply { + setDataAndType(fileUri, APK_MIME) + flags = installFlag + when (comp) { + is LegacyInstallerComponent.Component -> { + component = ComponentName(comp.clazz, comp.activity) + } + else -> { + // For Unspecified and AlwaysChoose, don't set component + } + } + } + + val installIntent = when (comp) { + LegacyInstallerComponent.AlwaysChoose -> Intent.createChooser(intent, context.getString( + R.string.select_installer)) + else -> intent + } + + try { + context.startActivity(installIntent) + cont.resume(InstallState.Installed) + } catch (e: AndroidRuntimeException) { + installIntent.flags = installFlag or Intent.FLAG_ACTIVITY_NEW_TASK + try { + context.startActivity(installIntent) + cont.resume(InstallState.Installed) + } catch (e: Exception) { + cont.resume(InstallState.Failed) + } + } catch (e: Exception) { + cont.resume(InstallState.Failed) + } } } diff --git a/app/src/main/kotlin/com/looker/droidify/model/Repository.kt b/app/src/main/kotlin/com/looker/droidify/model/Repository.kt index afdd084a..4ea93461 100644 --- a/app/src/main/kotlin/com/looker/droidify/model/Repository.kt +++ b/app/src/main/kotlin/com/looker/droidify/model/Repository.kt @@ -257,14 +257,14 @@ data class Repository( name = "Threema Libre", description = "The official repository for Threema Libre. R" + "equires Threema Shop license. Threema Libre is an open" + - "-source messanger focused on security and privacy.", + "-source messenger focused on security and privacy.", fingerprint = "5734E753899B25775D90FE85362A49866E05AC4F83C05BEF5A92880D2910639E" ), defaultRepository( address = "https://fdroid.getsession.org/fdroid/repo", name = "Session", description = "The official repository for Session. Session" + - " is an open-source messanger focused on security and privacy.", + " is an open-source messenger focused on security and privacy.", fingerprint = "DB0E5297EB65CC22D6BD93C869943BDCFCB6A07DC69A48A0DD8C7BA698EC04E6" ), defaultRepository( diff --git a/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsFragment.kt index fd1b9e7c..0196da24 100644 --- a/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsFragment.kt @@ -2,6 +2,7 @@ package com.looker.droidify.ui.settings import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -36,6 +37,7 @@ import com.looker.droidify.datastore.extension.themeName import com.looker.droidify.datastore.extension.toTime import com.looker.droidify.datastore.model.AutoSync import com.looker.droidify.datastore.model.InstallerType +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.datastore.model.ProxyType import com.looker.droidify.datastore.model.Theme import com.looker.droidify.utility.common.SdkCheck @@ -53,6 +55,7 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.hours import com.google.android.material.R as MaterialR +import androidx.core.net.toUri @AndroidEntryPoint class SettingsFragment : Fragment() { @@ -230,6 +233,56 @@ class SettingsFragment : Fragment() { onClick = { viewModel.setInstaller(requireContext(), it) } ) } + val pm = requireContext().packageManager + legacyInstallerComponent.connect( + titleText = getString(R.string.legacyInstallerComponent), + setting = viewModel.getSetting { legacyInstallerComponent }, + map = { + when (it) { + is LegacyInstallerComponent.Component -> { + val component = it + val appLabel = runCatching { + val info = pm.getApplicationInfo(component.clazz, 0) + pm.getApplicationLabel(info).toString() + }.getOrElse { component.clazz } + "$appLabel (${component.activity})" + } + LegacyInstallerComponent.Unspecified -> getString(R.string.unspecified) + LegacyInstallerComponent.AlwaysChoose -> getString(R.string.always_choose) + null -> getString(R.string.unspecified) + } + }, + ) { component, valueToString -> + val installerOptions = run { + var contentProtocol = "content://" + val intent = Intent(Intent.ACTION_INSTALL_PACKAGE).apply { + setDataAndType(contentProtocol.toUri(), "application/vnd.android.package-archive") + } + val activities = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) + listOf( + LegacyInstallerComponent.Unspecified, + LegacyInstallerComponent.AlwaysChoose + ) + activities.map { + LegacyInstallerComponent.Component( + clazz = it.activityInfo.packageName, + activity = it.activityInfo.name, + ) + } + } + addSingleCorrectDialog( + initialValue = component ?: LegacyInstallerComponent.Unspecified, + values = installerOptions, + title = R.string.legacyInstallerComponent, + iconRes = R.drawable.ic_apk_install, + valueToString = valueToString, + onClick = { viewModel.setLegacyInstallerComponentComponent(it) }, + ) + } + incompatibleUpdates.connect( + titleText = getString(R.string.incompatible_versions), + contentText = getString(R.string.incompatible_versions_summary), + setting = viewModel.getInitialSetting { incompatibleVersions }, + ) proxyType.connect( titleText = getString(R.string.proxy_type), setting = viewModel.getSetting { proxy.type }, @@ -389,6 +442,9 @@ class SettingsFragment : Fragment() { proxyHost.root.isVisible = allowProxies proxyPort.root.isVisible = allowProxies forceCleanUp.root.isVisible = settings.cleanUpInterval == Duration.INFINITE + + val useLegacyInstaller = settings.installerType == InstallerType.LEGACY + legacyInstallerComponent.root.isVisible = useLegacyInstaller } } diff --git a/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsViewModel.kt b/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsViewModel.kt index 76456e91..6203bc00 100644 --- a/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/looker/droidify/ui/settings/SettingsViewModel.kt @@ -17,6 +17,7 @@ import com.looker.droidify.datastore.model.AutoSync import com.looker.droidify.datastore.model.InstallerType import com.looker.droidify.datastore.model.InstallerType.ROOT import com.looker.droidify.datastore.model.InstallerType.SHIZUKU +import com.looker.droidify.datastore.model.LegacyInstallerComponent import com.looker.droidify.datastore.model.ProxyType import com.looker.droidify.datastore.model.Theme import com.looker.droidify.installer.installers.isMagiskGranted @@ -191,6 +192,12 @@ class SettingsViewModel } } + fun setLegacyInstallerComponentComponent(component: LegacyInstallerComponent?) { + viewModelScope.launch { + settingsRepository.setLegacyInstallerComponent(component) + } + } + fun exportSettings(file: Uri) { viewModelScope.launch { settingsRepository.export(file) diff --git a/app/src/main/res/layout/settings_page.xml b/app/src/main/res/layout/settings_page.xml index 7005048c..8be43ed1 100644 --- a/app/src/main/res/layout/settings_page.xml +++ b/app/src/main/res/layout/settings_page.xml @@ -145,6 +145,9 @@ + هنگام نصب APK ، برای کاربران Lsposed یا کاربران پیشرفته ، تأیید امضا نادیده گرفته شود نصب %s ناموفق بود فضای کافی برای نصب این برنامه روی دستگاه وجود ندارد. سعی کنید مقداری فضا خالی کنید. + هدف: اندروید %s + دسترسی شیزوکو داده نشده + خدمت شیزوکو اجرا نمیشود. لطفا برنامه شیزوکو را بررسی کنید + شیزوکو اجرا نمیشود + مجوز خدمت شیزوکو داده نشده. لطفا برنامه شیزوکو را بررسی کنید + شیزوکو نصب نشده + به نظر میرسد شیزوکو نصب نشده + فضای ناکافی + بازکردن شیزوکو + جابه‌جایی به عادی + ویدیو + ناشناخته (%d) diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 89be5ffc..378af153 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -220,4 +220,8 @@ %s ha essite disinstallate Ignorar le signatura Ignorar le verification de signatura in le installation de apk, pro usatores avantiate o de LSPosed + Cambiar al predefinite + Video + Incognite (%d) + Aperir Shizuku diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 2985aee9..27af49ce 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1,8 +1,8 @@ כתובות - אנטי-תכונות - בטל + תכונות-לא-רצויות + ביטול כבר קיים תמיד שחור @@ -10,7 +10,7 @@ לא ניתן היה למצוא את היישום הזה דואר אלקטרוני של היוצר עיין - עוקב אחר באגים + מעקב באגים לא ניתן לערוך את המאגר מכיוון שהוא מסתנכרן כעת. יומן שינויים שינויים @@ -30,7 +30,7 @@ תיאור פרטים תרום - מוריד %s + %s ירד מוריד ערוך מאגר מכיל פרצות אבטחה @@ -41,7 +41,7 @@ גרסת ה-API המינימלית היא %d. תכונות חסרות. פלטפורמת %1$s שלך אינה נתמכת. פלטפורמות נתמכות: %2$s. - התקן + התקנה מתקין הפעלה הותקן מטא נתונים לא חוקיים. @@ -51,22 +51,21 @@ פתח רשיון %s רשיון - בהיר - הקישור הועתק ללוח + מואר + הקישור הועתק קישורים ממזג %s היי, זמינות גרסאות חדשות של יישומים - %d לאפליקציה יש גרסה חדשה. - %d לאפליקציות יש גרסאות חדשות. - %d לאפליקציה יש גרסה חדשה. - %d לאפליקציות יש גרסאות חדשות. + לאפליקציה %d יש גרסה חדשה. + %d אפליקציות עם גרסאות חדשות. + %d אפליקציות עם גרסאות חדשות. - אין אפליקציות זמינות + עדיין אין אפליקציות זמינות אין יישומים מותקנים - אין תיאור זמין - לא הצלחתי למצוא אפליקציות כאלה - אין פרוקסי + לא נמצא תיאור זמין + לא הצלחנו למצוא אפליקציות כאלה + ללא פרוקסי התראה על עידכונים הצג התראה כאשר גרסאות חדשות זמינות מספר אפליקציות @@ -109,19 +108,19 @@ עיצובים עוקב או מדווח על הפעילות שלך לא ידוע - קוד המקור המלא אינו חינמי + קוד המקור המלא אינו חופשי שם משתמש שם משתמש חסר שפה עדכן הכל - פעולה נכשל + פעולה נכשלה הוסף מאגר כל האפליקציות כל האפליקציות שלך מעודכנות אתר היוצר מכיל קוד שאינו חופשי לא ניתן היה לאמת את %s - אפל + כהה פורמט קובץ לא חוקי. הידור עבור ניפוי באגים מתחבר… @@ -130,7 +129,7 @@ טביעת אצבע תלוי בתוספים לא חופשיים תגובת שרת לא חוקית. - מכיל פרסום + מכיל פרסומות גרסה זו ישנה יותר מזו המותקנת במכשיר שלך. הסר את החדשה קודם. שעה @@ -187,18 +186,18 @@ לא ניתן לבצע פעולות מסוימות. התקנה Material You - השתמש בחומר אתה נושא צבע + השתמש בעיצוב צבע של- material you מחכה להתחיל בהתקנה … מועדפים מנקה קבצים מיותרים אפשר את המאגר - כוח לנקות + כפה ניקוי מאגר בלתי ניתן להשגה - אפליקציות לעדכון אוטומטי - נסה להתקין עדכונים באופן אוטומטי - בעל רכיבים לא חופשיים + עידכון אפליקציות אוטומטי + ננסה להתקין עדכונים באופן אוטומטי + מכיל רכיבים לא חופשיים שיזוקו לא פועל - Shizuku לא הותקן + שיזוקו לא הותקן המאגר לא נמצא ההתקנה של %s הוסרה ההתקנה נכשלה @@ -209,12 +208,12 @@ ייצוא מאגרים השרת לא הצליח לספק חבילה חדשה. לא ניתן להתחבר לשרת - קשור לשירות רשת מסוים + מקושר לשירות רשת מסוים אפשר למשתמש להחליק בין דפים במסך הבית קרדיטים מיוחדים מכיל תוכן שאינו בטוח ייצא את כל המאגרים לקובץ - החלקת מסך הבית + החלקה על מסך הבית יציאת פרוקסי יכולה להיות רק מספר שלם לא ניתן לפתוח קישור ייבוא/ייצוא @@ -235,7 +234,7 @@ לא ניתנה הרשאה לשירות Shizuku. אנא בדוק באפליקציית Shizuku Shizuku לא מותקן נראה כי Shizuku לא מותקן - פתח את Shizuku + פתח את שיזוקו עבור לברירת מחדל לא ידוע (%d) diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 8f5ea714..4ef5e010 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -24,11 +24,11 @@ Jau eksistē Vienmēr Melns - Nevēlamās, privātuma aizskarošās funkcijas + Nevēlamas, privātuma aizskarošas funkcijas Lietotne Šo lietotni nevarēja atrast - Autora e-pasts - Autora vietne + Izstrādāja e-pasts + Izstrādāja vietne Izpētīt Kļūdu izsekotājs Atcelt @@ -111,7 +111,7 @@ Tikai Wi-Fi tīklā Tikai Wi-Fi un uzlādes režīmā Cits - Nevarēja parsēt indeksa failu. + Nevarēja parsēt indeksa datni. Parole Trūkst paroles Atļaujas @@ -177,7 +177,7 @@ Vai dzēst repozitoriju\? Sīkāka informācija Šī versija ir vecāka par jūsu ierīcē uzstādīto. Vispirms noņemiet to. Jeb izmantojiet lietotņu pārvaldnieku ar \"Downgrade\" uzstādīšanas funkciju, lai saglabātu esošos datus. - Nederīgs faila formāts. + Nederīgs datnes formāts. Ir reklāmas HTTP starpniekserveris Ignorēt visas jaunās versijas @@ -186,24 +186,24 @@ Mēģiniet automātiski uzstādīt atjauninājumus Uzstādīšana Gaida uzstādīšanas sākšanu… - Izlase + Iecienītākie Iespējot repozitoriju Piespiedu tīrīšana Materiāls Tu - Notīra liekos failus + Notīra liekās datnes Izmantojiet materiāls tu krāsu motīvu Repozitorijs nav sasniedzams Ir nesaturošas sastāvdaļas Nevar atvērt saiti - Importēt/eksportēt - Importēt iestatījumus - Importēt iestatījumus un izlasi no faila - Eksportēt iestatījumus - Eksportēt iestatījumus un izlasi no faila - Eksportējiet visus repozitorijus failā - Importēt repozitorijus - Importēt visus repozitorijus no faila - Eksportēt repozitorijus + Ievietot/Izgūt + Ievietot iestatījumus + Ievietot iestatījumus un iecienītākos no datnes + Izgūt iestatījumus + Izgūt iestatījumus un iecienītākos datnē + Izgūt visus repozitorijus datnē + Ievietot repozitorijus + Ievietot visus repozitorijus no datnes + Izgūt repozitorijus Shizuku pakalpojums nav palaists Shizuku pakalpojums nedarbojas. Lūdzu, pārbaudiet vai tas ir palaists Shizuku lietotnē Ļauj lietotājam mainīt sadaļas sākuma ekrānā pavelkot ar pirkstu pa kreisi vai labi diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 312b8162..bbfdc1f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -103,12 +103,15 @@ Install Installation Types Installer + Legacy Installer Component + Unspecified Insufficient Space There is not enough free space on the device to install this application. Try clearing some space Legacy Installer Session Installer Root Installer Shizuku Installer + Shizuku Legacy Installer Shizuku is not running Shizuku is not installed Installed @@ -238,4 +241,6 @@ Video Unknown (%d) Targets: Android %1$s | Minimum: Android %2$s + Always Choose + Select installer diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a02ffbad..9c248275 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,34 +1,34 @@ [versions] desugaring = "2.1.5" -agp = "8.8.2" +agp = "8.9.2" material = "1.12.0" activity = "1.10.1" app-compat = "1.7.0" -core = "1.15.0" -datastore = "1.1.3" +core = "1.16.0" +datastore = "1.1.5" fragment = "1.8.6" espresso = "3.6.1" lifecycle = "2.8.7" recycler-view = "1.4.0" -sqlite = "2.4.0" +sqlite = "2.5.0" test-ext = "1.2.1" test-rules = "1.6.1" test-runner = "1.6.2" ui-automator = "2.3.0" -work = "2.10.0" +work = "2.10.1" coil = "3.1.0" leakcanary = "2.14" -hilt = "2.55" +hilt = "2.56.1" hiltExt = "1.2.0" jackson = "2.18.2" -kotlin = "2.1.10" +kotlin = "2.1.20" coroutines = "1.10.1" datetime = "0.6.2" -serialization = "1.8.0" -ksp = "2.1.10-1.0.31" -ktor = "3.1.1" +serialization = "1.8.1" +ksp = "2.1.20-1.0.32" +ktor = "3.1.2" libsu = "6.0.0" -room = "2.6.1" +room = "2.7.1" shizuku = "13.0.0" image-viewer = "v1.0.1" junit-jupiter = "5.12.0"