Merge branch 'main' into show_min_sdk

This commit is contained in:
Cato the Cat 2025-05-31 16:39:53 +03:00 committed by GitHub
commit 2036894fa4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 289 additions and 78 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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
)
}
}

View File

@ -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<InstallItem>()
@ -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)

View File

@ -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)
}
}
}

View File

@ -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(

View File

@ -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
}
}

View File

@ -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)

View File

@ -145,6 +145,9 @@
<include
android:id="@+id/installer"
layout="@layout/enum_type" />
<include
android:id="@+id/legacy_installer_component"
layout="@layout/enum_type" />
<TextView
android:layout_width="match_parent"

View File

@ -221,4 +221,16 @@
<string name="ignore_signature_summary">هنگام نصب APK ، برای کاربران Lsposed یا کاربران پیشرفته ، تأیید امضا نادیده گرفته شود</string>
<string name="installation_failed_DESC">نصب %s ناموفق بود</string>
<string name="insufficient_storage_DESC">فضای کافی برای نصب این برنامه روی دستگاه وجود ندارد. سعی کنید مقداری فضا خالی کنید.</string>
<string name="label_targets_sdk">هدف: اندروید %s</string>
<string name="error_shizuku_not_granted">دسترسی شیزوکو داده نشده</string>
<string name="error_shizuku_not_running_DESC">خدمت شیزوکو اجرا نمیشود. لطفا برنامه شیزوکو را بررسی کنید</string>
<string name="error_shizuku_service_unavailable">شیزوکو اجرا نمیشود</string>
<string name="error_shizuku_not_granted_DESC">مجوز خدمت شیزوکو داده نشده. لطفا برنامه شیزوکو را بررسی کنید</string>
<string name="error_shizuku_not_installed">شیزوکو نصب نشده</string>
<string name="error_shizuku_not_installed_DESC">به نظر میرسد شیزوکو نصب نشده</string>
<string name="insufficient_storage">فضای ناکافی</string>
<string name="open_shizuku">بازکردن شیزوکو</string>
<string name="switch_to_default_installer">جابه‌جایی به عادی</string>
<string name="label_open_video">ویدیو</string>
<string name="label_unknown_sdk">ناشناخته (%d)</string>
</resources>

View File

@ -220,4 +220,8 @@
<string name="uninstalled_application_DESC">%s ha essite disinstallate</string>
<string name="ignore_signature">Ignorar le signatura</string>
<string name="ignore_signature_summary">Ignorar le verification de signatura in le installation de apk, pro usatores avantiate o de LSPosed</string>
<string name="switch_to_default_installer">Cambiar al predefinite</string>
<string name="label_open_video">Video</string>
<string name="label_unknown_sdk">Incognite (%d)</string>
<string name="open_shizuku">Aperir Shizuku</string>
</resources>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="address">כתובות</string>
<string name="anti_features">אנטי-תכונות</string>
<string name="cancel">בטל</string>
<string name="anti_features">תכונות-לא-רצויות</string>
<string name="cancel">ביטול</string>
<string name="already_exists">כבר קיים</string>
<string name="always">תמיד</string>
<string name="amoled">שחור</string>
@ -10,7 +10,7 @@
<string name="application_not_found">לא ניתן היה למצוא את היישום הזה</string>
<string name="author_email">דואר אלקטרוני של היוצר</string>
<string name="available">עיין</string>
<string name="bug_tracker">עוקב אחר באגים</string>
<string name="bug_tracker">מעקב באגים</string>
<string name="cant_edit_sync_DESC">לא ניתן לערוך את המאגר מכיוון שהוא מסתנכרן כעת.</string>
<string name="changelog">יומן שינויים</string>
<string name="changes">שינויים</string>
@ -30,7 +30,7 @@
<string name="description">תיאור</string>
<string name="details">פרטים</string>
<string name="donate">תרום</string>
<string name="downloaded_FORMAT">מוריד %s</string>
<string name="downloaded_FORMAT">%s ירד</string>
<string name="downloading">מוריד</string>
<string name="edit_repository">ערוך מאגר</string>
<string name="has_security_vulnerabilities">מכיל פרצות אבטחה</string>
@ -41,7 +41,7 @@
<string name="incompatible_api_min_DESC_FORMAT">גרסת ה-API המינימלית היא %d.</string>
<string name="incompatible_features_DESC">תכונות חסרות.</string>
<string name="incompatible_platforms_DESC_FORMAT">פלטפורמת %1$s שלך אינה נתמכת. פלטפורמות נתמכות: %2$s.</string>
<string name="install">התקן</string>
<string name="install">התקנה</string>
<string name="session_installer">מתקין הפעלה</string>
<string name="installed">הותקן</string>
<string name="invalid_metadata_error_DESC">מטא נתונים לא חוקיים.</string>
@ -51,22 +51,21 @@
<string name="launch">פתח</string>
<string name="license">רשיון</string>
<string name="license_FORMAT">%s רשיון</string>
<string name="light">בהיר</string>
<string name="link_copied_to_clipboard">הקישור הועתק ללוח</string>
<string name="light">מואר</string>
<string name="link_copied_to_clipboard">הקישור הועתק</string>
<string name="links">קישורים</string>
<string name="merging_FORMAT">ממזג %s</string>
<string name="new_updates_available">היי, זמינות גרסאות חדשות של יישומים</string>
<plurals name="new_updates_DESC_FORMAT">
<item quantity="one">%d לאפליקציה יש גרסה חדשה.</item>
<item quantity="two">%d לאפליקציות יש גרסאות חדשות.</item>
<item quantity="many">%d לאפליקציה יש גרסה חדשה.</item>
<item quantity="other">%d לאפליקציות יש גרסאות חדשות.</item>
<item quantity="one">לאפליקציה %d יש גרסה חדשה.</item>
<item quantity="two">%d אפליקציות עם גרסאות חדשות.</item>
<item quantity="other">%d אפליקציות עם גרסאות חדשות.</item>
</plurals>
<string name="no_applications_available">אין אפליקציות זמינות</string>
<string name="no_applications_available">עדיין אין אפליקציות זמינות</string>
<string name="no_applications_installed">אין יישומים מותקנים</string>
<string name="no_description_available_DESC">אין תיאור זמין</string>
<string name="no_matching_applications_found">לא הצלחתי למצוא אפליקציות כאלה</string>
<string name="no_proxy">אין פרוקסי</string>
<string name="no_description_available_DESC">לא נמצא תיאור זמין</string>
<string name="no_matching_applications_found">לא הצלחנו למצוא אפליקציות כאלה</string>
<string name="no_proxy">ללא פרוקסי</string>
<string name="notify_about_updates">התראה על עידכונים</string>
<string name="notify_about_updates_summary">הצג התראה כאשר גרסאות חדשות זמינות</string>
<string name="number_of_applications">מספר אפליקציות</string>
@ -109,19 +108,19 @@
<string name="themes">עיצובים</string>
<string name="tracks_or_reports_your_activity">עוקב או מדווח על הפעילות שלך</string>
<string name="unknown">לא ידוע</string>
<string name="upstream_source_code_is_not_free">קוד המקור המלא אינו חינמי</string>
<string name="upstream_source_code_is_not_free">קוד המקור המלא אינו חופשי</string>
<string name="username">שם משתמש</string>
<string name="username_missing">שם משתמש חסר</string>
<string name="prefs_language_title">שפה</string>
<string name="update_all">עדכן הכל</string>
<string name="action_failed">פעולה נכשל</string>
<string name="action_failed">פעולה נכשלה</string>
<string name="add_repository">הוסף מאגר</string>
<string name="all_applications">כל האפליקציות</string>
<string name="all_applications_up_to_date">כל האפליקציות שלך מעודכנות</string>
<string name="author_website">אתר היוצר</string>
<string name="contains_non_free_media">מכיל קוד שאינו חופשי</string>
<string name="could_not_validate_FORMAT">לא ניתן היה לאמת את %s</string>
<string name="dark">אפל</string>
<string name="dark">כהה</string>
<string name="file_format_error_DESC">פורמט קובץ לא חוקי.</string>
<string name="compiled_for_debugging">הידור עבור ניפוי באגים</string>
<string name="connecting">מתחבר…</string>
@ -130,7 +129,7 @@
<string name="fingerprint">טביעת אצבע</string>
<string name="has_non_free_dependencies">תלוי בתוספים לא חופשיים</string>
<string name="http_error_DESC">תגובת שרת לא חוקית.</string>
<string name="has_advertising">מכיל פרסום</string>
<string name="has_advertising">מכיל פרסומות</string>
<string name="incompatible_older_DESC">גרסה זו ישנה יותר מזו המותקנת במכשיר שלך. הסר את החדשה קודם.</string>
<plurals name="hours">
<item quantity="one">שעה</item>
@ -187,18 +186,18 @@
<string name="io_error_DESC">לא ניתן לבצע פעולות מסוימות.</string>
<string name="installing">התקנה</string>
<string name="material_you">Material You</string>
<string name="material_you_desc">השתמש בחומר אתה נושא צבע</string>
<string name="material_you_desc">השתמש בעיצוב צבע של- material you</string>
<string name="waiting_to_start_installation">מחכה להתחיל בהתקנה …</string>
<string name="favourites">מועדפים</string>
<string name="force_clean_up_DESC">מנקה קבצים מיותרים</string>
<string name="enable_repo">אפשר את המאגר</string>
<string name="force_clean_up">כוח לנקות</string>
<string name="force_clean_up">כפה ניקוי</string>
<string name="repository_unreachable">מאגר בלתי ניתן להשגה</string>
<string name="auto_update">אפליקציות לעדכון אוטומטי</string>
<string name="auto_update_apps">נסה להתקין עדכונים באופן אוטומטי</string>
<string name="has_non_free_components">בעל רכיבים לא חופשיים</string>
<string name="auto_update">עידכון אפליקציות אוטומטי</string>
<string name="auto_update_apps">ננסה להתקין עדכונים באופן אוטומטי</string>
<string name="has_non_free_components">מכיל רכיבים לא חופשיים</string>
<string name="shizuku_not_alive">שיזוקו לא פועל</string>
<string name="shizuku_not_installed">Shizuku לא הותקן</string>
<string name="shizuku_not_installed">שיזוקו לא הותקן</string>
<string name="repository_not_found">המאגר לא נמצא</string>
<string name="uninstalled_application_DESC">ההתקנה של %s הוסרה</string>
<string name="installation_failed">ההתקנה נכשלה</string>
@ -209,12 +208,12 @@
<string name="export_repos_title">ייצוא מאגרים</string>
<string name="socket_error_DESC">השרת לא הצליח לספק חבילה חדשה.</string>
<string name="connection_error_DESC">לא ניתן להתחבר לשרת</string>
<string name="has_tethered_network">קשור לשירות רשת מסוים</string>
<string name="has_tethered_network">מקושר לשירות רשת מסוים</string>
<string name="home_screen_swiping_DESC">אפשר למשתמש להחליק בין דפים במסך הבית</string>
<string name="special_credits">קרדיטים מיוחדים</string>
<string name="contains_nsfw">מכיל תוכן שאינו בטוח</string>
<string name="export_repos_DESC">ייצא את כל המאגרים לקובץ</string>
<string name="home_screen_swiping">החלקת מסך הבית</string>
<string name="home_screen_swiping">החלקה על מסך הבית</string>
<string name="proxy_port_error_not_int">יציאת פרוקסי יכולה להיות רק מספר שלם</string>
<string name="cannot_open_link">לא ניתן לפתוח קישור</string>
<string name="import_export">ייבוא/ייצוא</string>
@ -235,7 +234,7 @@
<string name="error_shizuku_not_granted_DESC">לא ניתנה הרשאה לשירות Shizuku. אנא בדוק באפליקציית Shizuku</string>
<string name="error_shizuku_not_installed">Shizuku לא מותקן</string>
<string name="error_shizuku_not_installed_DESC">נראה כי Shizuku לא מותקן</string>
<string name="open_shizuku">פתח את Shizuku</string>
<string name="open_shizuku">פתח את שיזוקו</string>
<string name="switch_to_default_installer">עבור לברירת מחדל</string>
<string name="label_unknown_sdk">לא ידוע (%d)</string>
</resources>

View File

@ -24,11 +24,11 @@
<string name="already_exists">Jau eksistē</string>
<string name="always">Vienmēr</string>
<string name="amoled">Melns</string>
<string name="anti_features">Nevēlamās, privātuma aizskarošās funkcijas</string>
<string name="anti_features">Nevēlamas, privātuma aizskarošas funkcijas</string>
<string name="application">Lietotne</string>
<string name="application_not_found">Šo lietotni nevarēja atrast</string>
<string name="author_email">Autora e-pasts</string>
<string name="author_website">Autora vietne</string>
<string name="author_email">Izstrādāja e-pasts</string>
<string name="author_website">Izstrādāja vietne</string>
<string name="available">Izpētīt</string>
<string name="bug_tracker">Kļūdu izsekotājs</string>
<string name="cancel">Atcelt</string>
@ -111,7 +111,7 @@
<string name="only_on_wifi">Tikai Wi-Fi tīklā</string>
<string name="only_on_wifi_with_charging">Tikai Wi-Fi un uzlādes režīmā</string>
<string name="other">Cits</string>
<string name="parsing_index_error_DESC">Nevarēja parsēt indeksa failu.</string>
<string name="parsing_index_error_DESC">Nevarēja parsēt indeksa datni.</string>
<string name="password">Parole</string>
<string name="password_missing">Trūkst paroles</string>
<string name="permissions">Atļaujas</string>
@ -177,7 +177,7 @@
<string name="delete_repository_DESC">Vai dzēst repozitoriju\?</string>
<string name="details">Sīkāka informācija</string>
<string name="incompatible_older_DESC">Šī 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.</string>
<string name="file_format_error_DESC">Nederīgs faila formāts.</string>
<string name="file_format_error_DESC">Nederīgs datnes formāts.</string>
<string name="has_advertising">Ir reklāmas</string>
<string name="http_proxy">HTTP starpniekserveris</string>
<string name="ignore_all_updates">Ignorēt visas jaunās versijas</string>
@ -186,24 +186,24 @@
<string name="auto_update_apps">Mēģiniet automātiski uzstādīt atjauninājumus</string>
<string name="installing">Uzstādīšana</string>
<string name="waiting_to_start_installation">Gaida uzstādīšanas sākšanu…</string>
<string name="favourites">Izlase</string>
<string name="favourites">Iecienītākie</string>
<string name="enable_repo">Iespējot repozitoriju</string>
<string name="force_clean_up">Piespiedu tīrīšana</string>
<string name="material_you">Materiāls Tu</string>
<string name="force_clean_up_DESC">Notīra liekos failus</string>
<string name="force_clean_up_DESC">Notīra liekās datnes</string>
<string name="material_you_desc">Izmantojiet materiāls tu krāsu motīvu</string>
<string name="repository_unreachable">Repozitorijs nav sasniedzams</string>
<string name="has_non_free_components">Ir nesaturošas sastāvdaļas</string>
<string name="cannot_open_link">Nevar atvērt saiti</string>
<string name="import_export">Importēt/eksportēt</string>
<string name="import_settings_title">Importēt iestatījumus</string>
<string name="import_settings_DESC">Importēt iestatījumus un izlasi no faila</string>
<string name="export_settings_title">Eksportēt iestatījumus</string>
<string name="export_settings_DESC">Eksportēt iestatījumus un izlasi no faila</string>
<string name="export_repos_DESC">Eksportējiet visus repozitorijus failā</string>
<string name="import_repos_title">Importēt repozitorijus</string>
<string name="import_repos_DESC">Importēt visus repozitorijus no faila</string>
<string name="export_repos_title">Eksportēt repozitorijus</string>
<string name="import_export">Ievietot/Izgūt</string>
<string name="import_settings_title">Ievietot iestatījumus</string>
<string name="import_settings_DESC">Ievietot iestatījumus un iecienītākos no datnes</string>
<string name="export_settings_title">Izgūt iestatījumus</string>
<string name="export_settings_DESC">Izgūt iestatījumus un iecienītākos datnē</string>
<string name="export_repos_DESC">Izgūt visus repozitorijus datnē</string>
<string name="import_repos_title">Ievietot repozitorijus</string>
<string name="import_repos_DESC">Ievietot visus repozitorijus no datnes</string>
<string name="export_repos_title">Izgūt repozitorijus</string>
<string name="error_shizuku_service_unavailable">Shizuku pakalpojums nav palaists</string>
<string name="error_shizuku_not_running_DESC">Shizuku pakalpojums nedarbojas. Lūdzu, pārbaudiet vai tas ir palaists Shizuku lietotnē</string>
<string name="home_screen_swiping_DESC">Ļauj lietotājam mainīt sadaļas sākuma ekrānā pavelkot ar pirkstu pa kreisi vai labi</string>

View File

@ -103,12 +103,15 @@
<string name="install">Install</string>
<string name="install_types">Installation Types</string>
<string name="installer">Installer</string>
<string name="legacyInstallerComponent">Legacy Installer Component</string>
<string name="unspecified">Unspecified</string>
<string name="insufficient_storage">Insufficient Space</string>
<string name="insufficient_storage_DESC">There is not enough free space on the device to install this application. Try clearing some space</string>
<string name="legacy_installer">Legacy Installer</string>
<string name="session_installer">Session Installer</string>
<string name="root_installer">Root Installer</string>
<string name="shizuku_installer">Shizuku Installer</string>
<string name="shizuku_legacy_installer">Shizuku Legacy Installer</string>
<string name="shizuku_not_alive">Shizuku is not running</string>
<string name="shizuku_not_installed">Shizuku is not installed</string>
<string name="installed">Installed</string>
@ -238,4 +241,6 @@
<string name="label_open_video">Video</string>
<string name="label_unknown_sdk">Unknown (%d)</string>
<string name="label_sdk_version">Targets: Android %1$s | Minimum: Android %2$s</string>
<string name="always_choose">Always Choose</string>
<string name="select_installer">Select installer</string>
</resources>

View File

@ -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"