Merge branch 'main' into show_min_sdk
This commit is contained in:
commit
2036894fa4
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user