## Features
@@ -22,8 +22,10 @@
## Building and Installing
+
1. **Install Android Studio**:
- - Download and install [Android Studio](https://developer.android.com/studio) on your computer if you haven't already.
+ - Download and install [Android Studio](https://developer.android.com/studio) on your computer
+ if you haven't already.
2. **Clone the Repository**:
- Open Android Studio and select "Project from Version Control."
@@ -48,6 +50,7 @@
- Your PR will undergo review
## Translations
+
[](https://hosted.weblate.org/engage/droidify/?utm_source=widget)
## License
@@ -67,3 +70,5 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
```
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index abd3ab09..3cae340c 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -10,7 +10,7 @@ plugins {
}
android {
- val latestVersionName = "0.6.4"
+ val latestVersionName = "0.6.5"
namespace = "com.looker.droidify"
buildToolsVersion = "35.0.0"
compileSdk = 35
@@ -18,7 +18,7 @@ android {
minSdk = 23
targetSdk = 35
applicationId = "com.looker.droidify"
- versionCode = 640
+ versionCode = 650
versionName = latestVersionName
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner = "com.looker.droidify.TestRunner"
@@ -32,7 +32,12 @@ android {
kotlinOptions {
jvmTarget = "17"
- freeCompilerArgs = listOf("-Xcontext-receivers")
+ freeCompilerArgs = listOf(
+ "-opt-in=kotlin.RequiresOptIn",
+ "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
+ "-opt-in=kotlinx.coroutines.FlowPreview",
+ "-Xcontext-receivers"
+ )
}
ksp {
@@ -45,11 +50,11 @@ android {
}
buildTypes {
- getByName("debug") {
+ debug {
applicationIdSuffix = ".debug"
resValue("string", "application_name", "Droid-ify-Debug")
}
- getByName("release") {
+ release {
isMinifyEnabled = true
isShrinkResources = true
resValue("string", "application_name", "Droid-ify")
@@ -79,7 +84,16 @@ android {
}
packaging {
resources {
- excludes += listOf("/DebugProbesKt.bin")
+ excludes += listOf(
+ "/DebugProbesKt.bin",
+ "/kotlin/**.kotlin_builtins",
+ "/kotlin/**.kotlin_metadata",
+ "/META-INF/**.kotlin_module",
+ "/META-INF/**.pro",
+ "/META-INF/**.version",
+ "/META-INF/{AL2.0,LGPL2.1,LICENSE*}",
+ "/META-INF/versions/9/previous-**.bin",
+ )
}
}
buildFeatures {
@@ -87,6 +101,10 @@ android {
viewBinding = true
buildConfig = true
}
+ dependenciesInfo {
+ includeInApk = false
+ includeInBundle = false
+ }
}
dependencies {
@@ -102,7 +120,7 @@ dependencies {
implementation(libs.sqlite.ktx)
implementation(libs.image.viewer)
- implementation(libs.coil.kt)
+ implementation(libs.bundles.coil)
implementation(libs.datastore.core)
implementation(libs.datastore.proto)
diff --git a/app/proguard.pro b/app/proguard.pro
index 6a2417c5..d1de746e 100644
--- a/app/proguard.pro
+++ b/app/proguard.pro
@@ -7,68 +7,3 @@
-dontwarn kotlinx.serialization.KSerializer
-dontwarn kotlinx.serialization.Serializable
-dontwarn org.slf4j.impl.StaticLoggerBinder
-#
-#-dontwarn com.looker.core.common.BuildConfig
-#-dontwarn com.looker.core.common.DeeplinkType$AddRepository
-#-dontwarn com.looker.core.common.DeeplinkType$AppDetail
-#-dontwarn com.looker.core.common.DeeplinkType
-#-dontwarn com.looker.core.common.DeeplinksKt
-#-dontwarn com.looker.core.common.Exporter
-#-dontwarn com.looker.core.common.NotificationKt
-#-dontwarn com.looker.core.common.PermissionsKt
-#-dontwarn com.looker.core.common.Scroller
-#-dontwarn com.looker.core.common.SdkCheck
-#-dontwarn com.looker.core.common.Singleton
-#-dontwarn com.looker.core.common.TextKt
-#-dontwarn com.looker.core.common.cache.Cache
-#-dontwarn com.looker.core.common.cache.Cache
-#-dontwarn com.looker.core.common.device.Huawei
-#-dontwarn com.looker.core.common.extension.ContextKt
-#-dontwarn com.looker.core.common.extension.CursorKt
-#-dontwarn com.looker.core.common.extension.DateTimeKt
-#-dontwarn com.looker.core.common.extension.FingerprintKt
-#-dontwarn com.looker.core.common.extension.FlowKt
-#-dontwarn com.looker.core.common.extension.InsetsKt
-#-dontwarn com.looker.core.common.extension.IntentKt
-#-dontwarn com.looker.core.common.extension.Json
-#-dontwarn com.looker.core.common.extension.JsonKt
-#-dontwarn com.looker.core.common.extension.KeyToken
-#-dontwarn com.looker.core.common.extension.LocaleKt
-#-dontwarn com.looker.core.common.extension.NumberKt
-#-dontwarn com.looker.core.common.extension.PackageInfoKt
-#-dontwarn com.looker.core.common.extension.SQLiteDatabaseKt
-#-dontwarn com.looker.core.common.extension.ServiceKt
-#-dontwarn com.looker.core.common.extension.ViewKt
-#-dontwarn com.looker.core.common.result.Result$Error
-#-dontwarn com.looker.core.common.result.Result$Success
-#-dontwarn com.looker.core.common.result.Result
-#-dontwarn com.looker.core.common.signature.Hash
-#-dontwarn com.looker.core.common.signature.HashCheckerKt
-#
-#-dontwarn com.looker.core.datastore.Settings
-#-dontwarn com.looker.core.datastore.SettingsRepository
-#-dontwarn com.looker.core.datastore.di.DatastoreModule_ProvidePreferenceDatastoreFactory
-#-dontwarn com.looker.core.datastore.di.DatastoreModule_ProvideProtoDatastoreFactory
-#-dontwarn com.looker.core.datastore.di.DatastoreModule_ProvideSettingsExporterFactory
-#-dontwarn com.looker.core.datastore.di.DatastoreModule_ProvideSettingsRepositoryFactory
-#-dontwarn com.looker.core.datastore.extension.PreferencesKt
-#-dontwarn com.looker.core.datastore.model.AutoSync
-#-dontwarn com.looker.core.datastore.model.InstallerType$Companion
-#-dontwarn com.looker.core.datastore.model.InstallerType
-#-dontwarn com.looker.core.datastore.model.ProxyPreference
-#-dontwarn com.looker.core.datastore.model.ProxyType
-#-dontwarn com.looker.core.datastore.model.SortOrder
-#-dontwarn com.looker.core.datastore.model.Theme
-#
-#-dontwarn com.looker.installer.InstallManager
-#-dontwarn com.looker.installer.InstallModule_ProvideRootPermissionHandlerFactory
-#-dontwarn com.looker.installer.InstallModule_ProvideShizukuPermissionHandlerFactory
-#-dontwarn com.looker.installer.InstallModule_ProvidesInstallerFactory
-#-dontwarn com.looker.installer.installers.root.RootPermissionHandler
-#-dontwarn com.looker.installer.installers.session.SessionInstallerReceiver_GeneratedInjector
-#-dontwarn com.looker.installer.installers.shizuku.ShizukuPermissionHandler$State
-#-dontwarn com.looker.installer.installers.shizuku.ShizukuPermissionHandler
-#-dontwarn com.looker.installer.model.InstallItem
-#-dontwarn com.looker.installer.model.InstallItemKt
-#-dontwarn com.looker.installer.model.InstallState
-#-dontwarn com.looker.installer.notification.InstallNotificationKt
diff --git a/app/src/androidTest/kotlin/com/looker/droidify/sync/common/Resource.kt b/app/src/androidTest/kotlin/com/looker/droidify/sync/common/Resource.kt
index a6781a56..9ce29c0f 100644
--- a/app/src/androidTest/kotlin/com/looker/droidify/sync/common/Resource.kt
+++ b/app/src/androidTest/kotlin/com/looker/droidify/sync/common/Resource.kt
@@ -1,7 +1,6 @@
package com.looker.droidify.sync.common
import androidx.test.platform.app.InstrumentationRegistry
-import java.io.File
import java.io.InputStream
fun assets(name: String): InputStream {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c440299f..568c9857 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -50,7 +50,6 @@
diff --git a/app/src/main/kotlin/com/looker/droidify/Droidify.kt b/app/src/main/kotlin/com/looker/droidify/Droidify.kt
index edb610a3..90e73997 100644
--- a/app/src/main/kotlin/com/looker/droidify/Droidify.kt
+++ b/app/src/main/kotlin/com/looker/droidify/Droidify.kt
@@ -13,10 +13,14 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import androidx.work.NetworkType
-import coil.ImageLoader
-import coil.ImageLoaderFactory
-import coil.disk.DiskCache
-import coil.memory.MemoryCache
+import coil3.ImageLoader
+import coil3.PlatformContext
+import coil3.SingletonImageLoader
+import coil3.asImage
+import coil3.disk.DiskCache
+import coil3.disk.directory
+import coil3.memory.MemoryCache
+import coil3.request.crossfade
import com.looker.droidify.content.ProductPreferences
import com.looker.droidify.database.Database
import com.looker.droidify.datastore.SettingsRepository
@@ -35,6 +39,7 @@ import com.looker.droidify.sync.toJobNetworkType
import com.looker.droidify.utility.common.Constants
import com.looker.droidify.utility.common.SdkCheck
import com.looker.droidify.utility.common.cache.Cache
+import com.looker.droidify.utility.common.extension.getDrawableCompat
import com.looker.droidify.utility.common.extension.getInstalledPackagesCompat
import com.looker.droidify.utility.common.extension.jobScheduler
import com.looker.droidify.utility.common.log
@@ -55,7 +60,7 @@ import kotlin.time.Duration.Companion.INFINITE
import kotlin.time.Duration.Companion.hours
@HiltAndroidApp
-class Droidify : Application(), ImageLoaderFactory, Configuration.Provider {
+class Droidify : Application(), SingletonImageLoader.Factory, Configuration.Provider {
private val parentJob = SupervisorJob()
private val appScope = CoroutineScope(Dispatchers.Default + parentJob)
@@ -221,9 +226,14 @@ class Droidify : Application(), ImageLoaderFactory, Configuration.Provider {
override fun onReceive(context: Context, intent: Intent) = Unit
}
- override fun newImageLoader(): ImageLoader {
- val memoryCache = MemoryCache.Builder(this)
- .maxSizePercent(0.25)
+ override val workManagerConfiguration: Configuration
+ get() = Configuration.Builder()
+ .setWorkerFactory(workerFactory)
+ .build()
+
+ override fun newImageLoader(context: PlatformContext): ImageLoader {
+ val memoryCache = MemoryCache.Builder()
+ .maxSizePercent(context, 0.25)
.build()
val diskCache = DiskCache.Builder()
@@ -234,15 +244,10 @@ class Droidify : Application(), ImageLoaderFactory, Configuration.Provider {
return ImageLoader.Builder(this)
.memoryCache(memoryCache)
.diskCache(diskCache)
- .error(R.drawable.ic_cannot_load)
+ .error(getDrawableCompat(R.drawable.ic_cannot_load).asImage())
.crossfade(350)
.build()
}
-
- override val workManagerConfiguration: Configuration
- get() = Configuration.Builder()
- .setWorkerFactory(workerFactory)
- .build()
}
@RequiresApi(Build.VERSION_CODES.O)
diff --git a/app/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt b/app/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt
index 32c4cd11..f2f11120 100644
--- a/app/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt
+++ b/app/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt
@@ -2,9 +2,9 @@ package com.looker.droidify.content
import android.content.Context
import android.content.SharedPreferences
-import com.looker.core.common.extension.Json
-import com.looker.core.common.extension.parseDictionary
-import com.looker.core.common.extension.writeDictionary
+import com.looker.droidify.utility.common.extension.Json
+import com.looker.droidify.utility.common.extension.parseDictionary
+import com.looker.droidify.utility.common.extension.writeDictionary
import com.looker.droidify.model.ProductPreference
import com.looker.droidify.database.Database
import com.looker.droidify.utility.serialization.productPreference
diff --git a/app/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt b/app/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt
index 48a62374..b4a649e9 100644
--- a/app/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt
+++ b/app/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt
@@ -12,28 +12,29 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
sealed class Request {
internal abstract val id: Int
- data class ProductsAvailable(
+ class Available(
val searchQuery: String,
val section: ProductItem.Section,
- val order: SortOrder
+ val order: SortOrder,
) : Request() {
override val id: Int
get() = 1
}
- data class ProductsInstalled(
+ class Installed(
val searchQuery: String,
val section: ProductItem.Section,
- val order: SortOrder
+ val order: SortOrder,
) : Request() {
override val id: Int
get() = 2
}
- data class ProductsUpdates(
+ class Updates(
val searchQuery: String,
val section: ProductItem.Section,
- val order: SortOrder
+ val order: SortOrder,
+ val skipSignatureCheck: Boolean,
) : Request() {
override val id: Int
get() = 3
@@ -52,7 +53,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
private data class ActiveRequest(
val request: Request,
val callback: Callback?,
- val cursor: Cursor?
+ val cursor: Cursor?,
)
init {
@@ -93,7 +94,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
val request = activeRequests[id]!!.request
return QueryLoader(requireContext()) {
when (request) {
- is Request.ProductsAvailable ->
+ is Request.Available ->
Database.ProductAdapter
.query(
installed = false,
@@ -101,10 +102,10 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
searchQuery = request.searchQuery,
section = request.section,
order = request.order,
- signal = it
+ signal = it,
)
- is Request.ProductsInstalled ->
+ is Request.Installed ->
Database.ProductAdapter
.query(
installed = true,
@@ -112,10 +113,10 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
searchQuery = request.searchQuery,
section = request.section,
order = request.order,
- signal = it
+ signal = it,
)
- is Request.ProductsUpdates ->
+ is Request.Updates ->
Database.ProductAdapter
.query(
installed = true,
@@ -123,7 +124,8 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks {
searchQuery = request.searchQuery,
section = request.section,
order = request.order,
- signal = it
+ signal = it,
+ skipSignatureCheck = request.skipSignatureCheck,
)
is Request.Repositories -> Database.RepositoryAdapter.query(it)
diff --git a/app/src/main/kotlin/com/looker/droidify/database/Database.kt b/app/src/main/kotlin/com/looker/droidify/database/Database.kt
index 9e5c6076..01f0b9fc 100644
--- a/app/src/main/kotlin/com/looker/droidify/database/Database.kt
+++ b/app/src/main/kotlin/com/looker/droidify/database/Database.kt
@@ -9,18 +9,18 @@ import android.os.CancellationSignal
import androidx.core.database.sqlite.transaction
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
-import com.looker.core.common.extension.Json
-import com.looker.droidify.utility.common.extension.asSequence
-import com.looker.droidify.utility.common.extension.firstOrNull
-import com.looker.core.common.extension.parseDictionary
-import com.looker.core.common.extension.writeDictionary
-import com.looker.droidify.utility.common.log
+import com.looker.droidify.BuildConfig
import com.looker.droidify.datastore.model.SortOrder
import com.looker.droidify.model.InstalledItem
import com.looker.droidify.model.Product
import com.looker.droidify.model.ProductItem
import com.looker.droidify.model.Repository
-import com.looker.droidify.BuildConfig
+import com.looker.droidify.utility.common.extension.Json
+import com.looker.droidify.utility.common.extension.asSequence
+import com.looker.droidify.utility.common.extension.firstOrNull
+import com.looker.droidify.utility.common.extension.parseDictionary
+import com.looker.droidify.utility.common.extension.writeDictionary
+import com.looker.droidify.utility.common.log
import com.looker.droidify.utility.serialization.product
import com.looker.droidify.utility.serialization.productItem
import com.looker.droidify.utility.serialization.repository
@@ -71,14 +71,20 @@ object Database {
get() = "$databasePrefix$innerName"
fun formatCreateTable(name: String): String {
- return "CREATE TABLE $name (${QueryBuilder.trimQuery(createTable)})"
+ return buildString(128) {
+ append("CREATE TABLE ")
+ append(name)
+ append(" (")
+ trimAndJoin(createTable)
+ append(")")
+ }
}
val createIndexPairFormatted: Pair?
get() = createIndex?.let {
Pair(
"CREATE INDEX ${innerName}_index ON $innerName ($it)",
- "CREATE INDEX ${name}_index ON $innerName ($it)"
+ "CREATE INDEX ${name}_index ON $innerName ($it)",
)
}
}
@@ -214,7 +220,7 @@ object Database {
Schema.Product,
Schema.Category,
Schema.Installed,
- Schema.Lock
+ Schema.Lock,
)
dropOldTables(db, Schema.Repository, Schema.Product, Schema.Category)
this.created = this.created || create
@@ -227,7 +233,7 @@ object Database {
val sql = db.query(
"${table.databasePrefix}sqlite_master",
columns = arrayOf("sql"),
- selection = Pair("type = ? AND name = ?", arrayOf("table", table.innerName))
+ selection = Pair("type = ? AND name = ?", arrayOf("table", table.innerName)),
).use { it.firstOrNull()?.getString(0) }.orEmpty()
table.formatCreateTable(table.innerName) != sql
}
@@ -261,7 +267,7 @@ object Database {
val sqls = db.query(
"${table.databasePrefix}sqlite_master",
columns = arrayOf("name", "sql"),
- selection = Pair("type = ? AND tbl_name = ?", arrayOf("index", table.innerName))
+ selection = Pair("type = ? AND tbl_name = ?", arrayOf("index", table.innerName)),
)
.use { cursor ->
cursor.asSequence()
@@ -289,7 +295,7 @@ object Database {
val tables = db.query(
"sqlite_master",
columns = arrayOf("name"),
- selection = Pair("type = ?", arrayOf("table"))
+ selection = Pair("type = ?", arrayOf("table")),
)
.use { cursor -> cursor.asSequence().mapNotNull { it.getString(0) }.toList() }
.filter { !it.startsWith("sqlite_") && !it.startsWith("android_") }
@@ -345,7 +351,7 @@ object Database {
private fun SQLiteDatabase.insertOrReplace(
replace: Boolean,
table: String,
- contentValues: ContentValues
+ contentValues: ContentValues,
): Long {
return if (replace) {
replace(table, null, contentValues)
@@ -353,7 +359,7 @@ object Database {
insert(
table,
null,
- contentValues
+ contentValues,
)
}
}
@@ -363,7 +369,7 @@ object Database {
columns: Array? = null,
selection: Pair>? = null,
orderBy: String? = null,
- signal: CancellationSignal? = null
+ signal: CancellationSignal? = null,
): Cursor {
return query(
false,
@@ -375,7 +381,7 @@ object Database {
null,
orderBy,
null,
- signal
+ signal,
)
}
@@ -397,7 +403,7 @@ object Database {
internal fun putWithoutNotification(
repository: Repository,
shouldReplace: Boolean,
- database: SQLiteDatabase
+ database: SQLiteDatabase,
): Long {
return database.insertOrReplace(
shouldReplace,
@@ -409,7 +415,7 @@ object Database {
put(Schema.Repository.ROW_ENABLED, if (repository.enabled) 1 else 0)
put(Schema.Repository.ROW_DELETED, 0)
put(Schema.Repository.ROW_DATA, jsonGenerate(repository::serialize))
- }
+ },
)
}
@@ -442,8 +448,8 @@ object Database {
Schema.Repository.name,
selection = Pair(
"${Schema.Repository.ROW_ID} = ? AND ${Schema.Repository.ROW_DELETED} == 0",
- arrayOf(id.toString())
- )
+ arrayOf(id.toString()),
+ ),
).use { it.firstOrNull()?.let(::transform) }
}
@@ -463,9 +469,9 @@ object Database {
selection = Pair(
"${Schema.Repository.ROW_ENABLED} != 0 AND " +
"${Schema.Repository.ROW_DELETED} == 0",
- emptyArray()
+ emptyArray(),
),
- signal = null
+ signal = null,
).use { it.asSequence().map(::transform).toList() }
}
@@ -473,7 +479,7 @@ object Database {
return db.query(
Schema.Repository.name,
selection = Pair("${Schema.Repository.ROW_DELETED} == 0", emptyArray()),
- signal = null
+ signal = null,
).use { it.asSequence().map(::transform).toList() }
}
@@ -489,9 +495,9 @@ object Database {
selection = Pair(
"${Schema.Repository.ROW_ENABLED} == 0 OR " +
"${Schema.Repository.ROW_DELETED} != 0",
- emptyArray()
+ emptyArray(),
),
- signal = null
+ signal = null,
).use { parentCursor ->
parentCursor.asSequence().associate {
val idIndex = it.getColumnIndexOrThrow(Schema.Repository.ROW_ID)
@@ -508,7 +514,7 @@ object Database {
put(Schema.Repository.ROW_DELETED, 1)
},
"${Schema.Repository.ROW_ID} = ?",
- arrayOf(id.toString())
+ arrayOf(id.toString()),
)
notifyChanged(Subject.Repositories, Subject.Repository(id), Subject.Products)
}
@@ -519,18 +525,18 @@ object Database {
val productsCount = db.delete(
Schema.Product.name,
"${Schema.Product.ROW_REPOSITORY_ID} IN ($idsString)",
- null
+ null,
)
val categoriesCount = db.delete(
Schema.Category.name,
"${Schema.Category.ROW_REPOSITORY_ID} IN ($idsString)",
- null
+ null,
)
if (isDeleted) {
db.delete(
Schema.Repository.name,
"${Schema.Repository.ROW_ID} IN ($id)",
- null
+ null,
)
}
productsCount != 0 || categoriesCount != 0
@@ -555,7 +561,7 @@ object Database {
Schema.Repository.name,
selection = Pair("${Schema.Repository.ROW_DELETED} == 0", emptyArray()),
orderBy = "${Schema.Repository.ROW_ENABLED} DESC",
- signal = signal
+ signal = signal,
).observable(Subject.Repositories)
}
@@ -577,26 +583,28 @@ object Database {
.map { get(packageName, null) }
.flowOn(Dispatchers.IO)
- suspend fun getUpdates(): List = withContext(Dispatchers.IO) {
- query(
- installed = true,
- updates = true,
- searchQuery = "",
- section = ProductItem.Section.All,
- order = SortOrder.NAME,
- signal = null
- ).use {
- it.asSequence()
- .map(ProductAdapter::transformItem)
- .toList()
+ suspend fun getUpdates(skipSignatureCheck: Boolean): List =
+ withContext(Dispatchers.IO) {
+ query(
+ installed = true,
+ updates = true,
+ searchQuery = "",
+ skipSignatureCheck = skipSignatureCheck,
+ section = ProductItem.Section.All,
+ order = SortOrder.NAME,
+ signal = null,
+ ).use {
+ it.asSequence()
+ .map(ProductAdapter::transformItem)
+ .toList()
+ }
}
- }
- fun getUpdatesStream(): Flow> = flowOf(Unit)
+ fun getUpdatesStream(skipSignatureCheck: Boolean): Flow> = flowOf(Unit)
.onCompletion { if (it == null) emitAll(flowCollection(Subject.Products)) }
// Crashes due to immediate retrieval of data?
.onEach { delay(50) }
- .map { getUpdates() }
+ .map { getUpdates(skipSignatureCheck) }
.flowOn(Dispatchers.IO)
fun getAll(): List {
@@ -618,10 +626,10 @@ object Database {
columns = arrayOf(
Schema.Product.ROW_REPOSITORY_ID,
Schema.Product.ROW_DESCRIPTION,
- Schema.Product.ROW_DATA
+ Schema.Product.ROW_DATA,
),
selection = Pair("${Schema.Product.ROW_PACKAGE_NAME} = ?", arrayOf(packageName)),
- signal = signal
+ signal = signal,
).use { it.asSequence().map(::transform).toList() }
}
@@ -636,24 +644,26 @@ object Database {
columns = arrayOf("COUNT (*)"),
selection = Pair(
"${Schema.Product.ROW_REPOSITORY_ID} = ?",
- arrayOf(repositoryId.toString())
- )
+ arrayOf(repositoryId.toString()),
+ ),
).use { it.firstOrNull()?.getInt(0) ?: 0 }
}
fun query(
installed: Boolean,
updates: Boolean,
+ skipSignatureCheck: Boolean = false,
searchQuery: String,
section: ProductItem.Section,
order: SortOrder,
- signal: CancellationSignal?
+ signal: CancellationSignal?,
): Cursor {
val builder = QueryBuilder()
- val signatureMatches = """installed.${Schema.Installed.ROW_SIGNATURE} IS NOT NULL AND
- product.${Schema.Product.ROW_SIGNATURES} LIKE ('%.' || installed.${Schema.Installed.ROW_SIGNATURE} || '.%') AND
- product.${Schema.Product.ROW_SIGNATURES} != ''"""
+ val signatureMatches = if (skipSignatureCheck) "1"
+ else """installed.${Schema.Installed.ROW_SIGNATURE} IS NOT NULL AND
+ product.${Schema.Product.ROW_SIGNATURES} LIKE ('%.' || installed.${Schema.Installed.ROW_SIGNATURE} || '.%') AND
+ product.${Schema.Product.ROW_SIGNATURES} != ''"""
builder += """SELECT product.rowid AS _id, product.${Schema.Product.ROW_REPOSITORY_ID},
product.${Schema.Product.ROW_PACKAGE_NAME}, product.${Schema.Product.ROW_NAME},
@@ -741,6 +751,10 @@ object Database {
}
}
+ fun transformPackageName(cursor: Cursor): String {
+ return cursor.getString(cursor.getColumnIndexOrThrow(Schema.Product.ROW_PACKAGE_NAME))
+ }
+
fun transformItem(cursor: Cursor): ProductItem {
return cursor.getBlob(cursor.getColumnIndexOrThrow(Schema.Product.ROW_DATA_ITEM))
.jsonParse {
@@ -806,10 +820,10 @@ object Database {
Schema.Installed.ROW_PACKAGE_NAME,
Schema.Installed.ROW_VERSION,
Schema.Installed.ROW_VERSION_CODE,
- Schema.Installed.ROW_SIGNATURE
+ Schema.Installed.ROW_SIGNATURE,
),
selection = Pair("${Schema.Installed.ROW_PACKAGE_NAME} = ?", arrayOf(packageName)),
- signal = signal
+ signal = signal,
).use { it.firstOrNull()?.let(::transform) }
}
@@ -822,7 +836,7 @@ object Database {
put(Schema.Installed.ROW_VERSION, installedItem.version)
put(Schema.Installed.ROW_VERSION_CODE, installedItem.versionCode)
put(Schema.Installed.ROW_SIGNATURE, installedItem.signature)
- }
+ },
)
if (notify) {
notifyChanged(Subject.Products)
@@ -842,7 +856,7 @@ object Database {
val count = db.delete(
Schema.Installed.name,
"${Schema.Installed.ROW_PACKAGE_NAME} = ?",
- arrayOf(packageName)
+ arrayOf(packageName),
)
if (count > 0) {
notifyChanged(Subject.Products)
@@ -854,7 +868,7 @@ object Database {
cursor.getString(cursor.getColumnIndexOrThrow(Schema.Installed.ROW_PACKAGE_NAME)),
cursor.getString(cursor.getColumnIndexOrThrow(Schema.Installed.ROW_VERSION)),
cursor.getLong(cursor.getColumnIndexOrThrow(Schema.Installed.ROW_VERSION_CODE)),
- cursor.getString(cursor.getColumnIndexOrThrow(Schema.Installed.ROW_SIGNATURE))
+ cursor.getString(cursor.getColumnIndexOrThrow(Schema.Installed.ROW_SIGNATURE)),
)
}
}
@@ -867,7 +881,7 @@ object Database {
ContentValues().apply {
put(Schema.Lock.ROW_PACKAGE_NAME, lock.first)
put(Schema.Lock.ROW_VERSION_CODE, lock.second)
- }
+ },
)
if (notify) {
notifyChanged(Subject.Products)
@@ -923,9 +937,9 @@ object Database {
put(Schema.Product.ROW_DATA, jsonGenerate(product::serialize))
put(
Schema.Product.ROW_DATA_ITEM,
- jsonGenerate(product.item()::serialize)
+ jsonGenerate(product.item()::serialize),
)
- }
+ },
)
for (category in product.categories) {
db.insertOrReplace(
@@ -935,7 +949,7 @@ object Database {
put(Schema.Category.ROW_REPOSITORY_ID, product.repositoryId)
put(Schema.Category.ROW_PACKAGE_NAME, product.packageName)
put(Schema.Category.ROW_NAME, category)
- }
+ },
)
}
}
@@ -948,20 +962,20 @@ object Database {
db.delete(
Schema.Product.name,
"${Schema.Product.ROW_REPOSITORY_ID} = ?",
- arrayOf(repository.id.toString())
+ arrayOf(repository.id.toString()),
)
db.delete(
Schema.Category.name,
"${Schema.Category.ROW_REPOSITORY_ID} = ?",
- arrayOf(repository.id.toString())
+ arrayOf(repository.id.toString()),
)
db.execSQL(
"INSERT INTO ${Schema.Product.name} SELECT * " +
- "FROM ${Schema.Product.temporaryName}"
+ "FROM ${Schema.Product.temporaryName}",
)
db.execSQL(
"INSERT INTO ${Schema.Category.name} SELECT * " +
- "FROM ${Schema.Category.temporaryName}"
+ "FROM ${Schema.Category.temporaryName}",
)
RepositoryAdapter.putWithoutNotification(repository, true, db)
db.execSQL("DROP TABLE IF EXISTS ${Schema.Product.temporaryName}")
@@ -970,7 +984,7 @@ object Database {
notifyChanged(
Subject.Repositories,
Subject.Repository(repository.id),
- Subject.Products
+ Subject.Products,
)
} else {
db.execSQL("DROP TABLE IF EXISTS ${Schema.Product.temporaryName}")
diff --git a/app/src/main/kotlin/com/looker/droidify/database/QueryBuilder.kt b/app/src/main/kotlin/com/looker/droidify/database/QueryBuilder.kt
index 1ecb92b8..de9c01f2 100644
--- a/app/src/main/kotlin/com/looker/droidify/database/QueryBuilder.kt
+++ b/app/src/main/kotlin/com/looker/droidify/database/QueryBuilder.kt
@@ -3,26 +3,20 @@ package com.looker.droidify.database
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.os.CancellationSignal
+import com.looker.droidify.BuildConfig
import com.looker.droidify.utility.common.extension.asSequence
import com.looker.droidify.utility.common.log
-import com.looker.droidify.BuildConfig
class QueryBuilder {
- companion object {
- fun trimQuery(query: String): String {
- return query.lines().map { it.trim() }.filter { it.isNotEmpty() }
- .joinToString(separator = " ")
- }
- }
- private val builder = StringBuilder()
+ private val builder = StringBuilder(256)
private val arguments = mutableListOf()
operator fun plusAssign(query: String) {
if (builder.isNotEmpty()) {
builder.append(" ")
}
- builder.append(trimQuery(query))
+ builder.trimAndJoin(query)
}
operator fun remAssign(argument: String) {
@@ -48,3 +42,53 @@ class QueryBuilder {
return db.rawQuery(query, arguments, signal)
}
}
+
+fun StringBuilder.trimAndJoin(
+ input: String,
+) {
+ var isFirstLine = true
+ var startOfLine = 0
+ for (i in input.indices) {
+ val char = input[i]
+ when {
+ char == '\n' -> {
+ trimAndAppendLine(input, startOfLine, i, this, isFirstLine)
+ isFirstLine = false
+ startOfLine = i + 1
+ }
+
+ else -> {
+ if (i == input.lastIndex) {
+ trimAndAppendLine(input, startOfLine, i + 1, this, isFirstLine)
+ }
+ }
+ }
+ }
+}
+
+private fun trimAndAppendLine(
+ input: String,
+ start: Int,
+ end: Int,
+ builder: StringBuilder,
+ isFirstLine: Boolean,
+) {
+ var lineStart = start
+ var lineEnd = end - 1
+
+ while (lineStart <= lineEnd && input[lineStart].isWhitespace()) {
+ lineStart++
+ }
+
+ while (lineEnd >= lineStart && input[lineEnd].isWhitespace()) {
+ lineEnd--
+ }
+
+ if (lineStart <= lineEnd) {
+ if (!isFirstLine) {
+ builder.append(' ')
+ }
+ builder.append(input, lineStart, lineEnd + 1)
+ }
+}
+
diff --git a/app/src/main/kotlin/com/looker/droidify/database/RepositoryExporter.kt b/app/src/main/kotlin/com/looker/droidify/database/RepositoryExporter.kt
index 822667b7..d4e5666a 100644
--- a/app/src/main/kotlin/com/looker/droidify/database/RepositoryExporter.kt
+++ b/app/src/main/kotlin/com/looker/droidify/database/RepositoryExporter.kt
@@ -4,12 +4,12 @@ import android.content.Context
import android.net.Uri
import com.fasterxml.jackson.core.JsonToken
import com.looker.droidify.utility.common.Exporter
-import com.looker.core.common.extension.Json
-import com.looker.core.common.extension.forEach
-import com.looker.core.common.extension.forEachKey
-import com.looker.core.common.extension.parseDictionary
-import com.looker.core.common.extension.writeArray
-import com.looker.core.common.extension.writeDictionary
+import com.looker.droidify.utility.common.extension.Json
+import com.looker.droidify.utility.common.extension.forEach
+import com.looker.droidify.utility.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.parseDictionary
+import com.looker.droidify.utility.common.extension.writeArray
+import com.looker.droidify.utility.common.extension.writeDictionary
import com.looker.droidify.di.ApplicationScope
import com.looker.droidify.di.IoDispatcher
import com.looker.droidify.model.Repository
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/di/CoroutinesModule.kt b/app/src/main/kotlin/com/looker/droidify/di/CoroutinesModule.kt
index 70549734..57d2b117 100644
--- a/app/src/main/kotlin/com/looker/droidify/di/CoroutinesModule.kt
+++ b/app/src/main/kotlin/com/looker/droidify/di/CoroutinesModule.kt
@@ -1,5 +1,3 @@
-@file:Suppress("unused")
-
package com.looker.droidify.di
import dagger.Module
diff --git a/app/src/main/kotlin/com/looker/droidify/domain/model/Repo.kt b/app/src/main/kotlin/com/looker/droidify/domain/model/Repo.kt
index d9fcef5f..10809353 100644
--- a/app/src/main/kotlin/com/looker/droidify/domain/model/Repo.kt
+++ b/app/src/main/kotlin/com/looker/droidify/domain/model/Repo.kt
@@ -22,9 +22,6 @@ data class Repo(
}
}
-val String.isOnion: Boolean
- get() = endsWith(".onion")
-
data class AntiFeature(
val id: Long,
val name: String,
diff --git a/app/src/main/kotlin/com/looker/droidify/graphics/DrawableWrapper.kt b/app/src/main/kotlin/com/looker/droidify/graphics/DrawableWrapper.kt
index 72f6b8ca..3d334957 100644
--- a/app/src/main/kotlin/com/looker/droidify/graphics/DrawableWrapper.kt
+++ b/app/src/main/kotlin/com/looker/droidify/graphics/DrawableWrapper.kt
@@ -51,7 +51,6 @@ open class DrawableWrapper(val drawable: Drawable) : Drawable() {
drawable.colorFilter = colorFilter
}
- @Deprecated("Deprecated in Java")
@Suppress("DEPRECATION")
override fun getOpacity(): Int = drawable.opacity
}
diff --git a/app/src/main/kotlin/com/looker/droidify/index/IndexMerger.kt b/app/src/main/kotlin/com/looker/droidify/index/IndexMerger.kt
index 65801edd..e544aa5d 100644
--- a/app/src/main/kotlin/com/looker/droidify/index/IndexMerger.kt
+++ b/app/src/main/kotlin/com/looker/droidify/index/IndexMerger.kt
@@ -3,10 +3,10 @@ package com.looker.droidify.index
import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import com.fasterxml.jackson.core.JsonToken
-import com.looker.core.common.extension.Json
+import com.looker.droidify.utility.common.extension.Json
import com.looker.droidify.utility.common.extension.asSequence
-import com.looker.core.common.extension.collectNotNull
-import com.looker.core.common.extension.writeDictionary
+import com.looker.droidify.utility.common.extension.collectNotNull
+import com.looker.droidify.utility.common.extension.writeDictionary
import com.looker.droidify.model.Product
import com.looker.droidify.model.Release
import com.looker.droidify.utility.serialization.product
@@ -82,9 +82,9 @@ class IndexMerger(file: File) : Closeable {
closeTransaction()
db.rawQuery(
"""SELECT product.description, product.data AS pd, releases.data AS rd FROM product
- LEFT JOIN releases ON product.package_name = releases.package_name""",
+ LEFT JOIN releases ON product.package_name = releases.package_name""",
null
- )?.use { cursor ->
+ ).use { cursor ->
cursor.asSequence().map { currentCursor ->
val description = currentCursor.getString(0)
val product = Json.factory.createParser(currentCursor.getBlob(1)).use {
diff --git a/app/src/main/kotlin/com/looker/droidify/index/IndexV1Parser.kt b/app/src/main/kotlin/com/looker/droidify/index/IndexV1Parser.kt
index eff4cb2d..0aeacd98 100644
--- a/app/src/main/kotlin/com/looker/droidify/index/IndexV1Parser.kt
+++ b/app/src/main/kotlin/com/looker/droidify/index/IndexV1Parser.kt
@@ -5,16 +5,27 @@ import androidx.core.os.ConfigurationCompat.getLocales
import androidx.core.os.LocaleListCompat
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
-import com.looker.droidify.utility.common.SdkCheck
-import com.looker.core.common.extension.Json
-import com.looker.core.common.extension.collectDistinctNotEmptyStrings
-import com.looker.core.common.extension.collectNotNull
-import com.looker.core.common.extension.forEach
-import com.looker.core.common.extension.forEachKey
-import com.looker.core.common.extension.illegal
-import com.looker.droidify.utility.common.nullIfEmpty
+import com.looker.droidify.utility.common.extension.Json
+import com.looker.droidify.utility.common.extension.collectDistinctNotEmptyStrings
+import com.looker.droidify.utility.common.extension.collectNotNull
+import com.looker.droidify.utility.common.extension.forEach
+import com.looker.droidify.utility.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.illegal
import com.looker.droidify.model.Product
+import com.looker.droidify.model.Product.Donate.Bitcoin
+import com.looker.droidify.model.Product.Donate.Liberapay
+import com.looker.droidify.model.Product.Donate.Litecoin
+import com.looker.droidify.model.Product.Donate.OpenCollective
+import com.looker.droidify.model.Product.Donate.Regular
+import com.looker.droidify.model.Product.Screenshot.Type.LARGE_TABLET
+import com.looker.droidify.model.Product.Screenshot.Type.PHONE
+import com.looker.droidify.model.Product.Screenshot.Type.SMALL_TABLET
+import com.looker.droidify.model.Product.Screenshot.Type.TV
+import com.looker.droidify.model.Product.Screenshot.Type.VIDEO
+import com.looker.droidify.model.Product.Screenshot.Type.WEAR
import com.looker.droidify.model.Release
+import com.looker.droidify.utility.common.SdkCheck
+import com.looker.droidify.utility.common.nullIfEmpty
import java.io.InputStream
object IndexV1Parser {
@@ -32,9 +43,12 @@ object IndexV1Parser {
}
private class Screenshots(
+ val video: List,
val phone: List,
val smallTablet: List,
- val largeTablet: List
+ val largeTablet: List,
+ val wear: List,
+ val tv: List,
)
private class Localized(
@@ -90,10 +104,9 @@ object IndexV1Parser {
}
private fun Map.find(callback: (String, Localized) -> T?): T? {
- return getAndCall("en-US", callback) ?: getAndCall("en_US", callback) ?: getAndCall(
- "en",
- callback
- )
+ return getAndCall("en-US", callback)
+ ?: getAndCall("en_US", callback)
+ ?: getAndCall("en", callback)
}
private fun Map.findLocalized(callback: (Localized) -> T?): T? {
@@ -122,12 +135,11 @@ object IndexV1Parser {
internal object DonateComparator : Comparator {
private val classes = listOf(
- Product.Donate.Regular::class,
- Product.Donate.Bitcoin::class,
- Product.Donate.Litecoin::class,
- Product.Donate.Flattr::class,
- Product.Donate.Liberapay::class,
- Product.Donate.OpenCollective::class
+ Regular::class,
+ Bitcoin::class,
+ Litecoin::class,
+ Liberapay::class,
+ OpenCollective::class
)
override fun compare(donate1: Product.Donate, donate2: Product.Donate): Int {
@@ -236,14 +248,17 @@ object IndexV1Parser {
private const val KEY_PRODUCT_LICENSE = "license"
private const val KEY_PRODUCT_DONATE = "donate"
private const val KEY_PRODUCT_BITCOIN = "bitcoin"
- private const val KEY_PRODUCT_FLATTRID = "flattrID"
- private const val KEY_PRODUCT_LIBERAPAYID = "liberapayID"
+ private const val KEY_PRODUCT_LIBERAPAYID = "liberapay"
+ private const val KEY_PRODUCT_LITECOIN = "litecoin"
private const val KEY_PRODUCT_OPENCOLLECTIVE = "openCollective"
private const val KEY_PRODUCT_LOCALIZED = "localized"
private const val KEY_PRODUCT_WHATSNEW = "whatsNew"
- private const val KEY_PRODUCT_PHONESCREENSHOTS = "phoneScreenshots"
- private const val KEY_PRODUCT_SEVENINCHSCREENSHOTS = "sevenInchScreenshots"
- private const val KEY_PRODUCT_TENINCHSCREENSHOTS = "tenInchScreenshots"
+ private const val KEY_PRODUCT_PHONE_SCREENSHOTS = "phoneScreenshots"
+ private const val KEY_PRODUCT_SEVEN_INCH_SCREENSHOTS = "sevenInchScreenshots"
+ private const val KEY_PRODUCT_TEN_INCH_SCREENSHOTS = "tenInchScreenshots"
+ private const val KEY_PRODUCT_WEAR_SCREENSHOTS = "wearScreenshots"
+ private const val KEY_PRODUCT_TV_SCREENSHOTS = "tvScreenshots"
+ private const val KEY_PRODUCT_VIDEO = "video"
private fun JsonParser.parseProduct(repositoryId: Long): Product {
var packageName = ""
@@ -293,16 +308,11 @@ object IndexV1Parser {
key.string(KEY_PRODUCT_LICENSE) -> licenses += valueAsString.split(',')
.filter { it.isNotEmpty() }
- key.string(KEY_PRODUCT_DONATE) -> donates += Product.Donate.Regular(valueAsString)
- key.string(KEY_PRODUCT_BITCOIN) -> donates += Product.Donate.Bitcoin(valueAsString)
- key.string(KEY_PRODUCT_FLATTRID) -> donates += Product.Donate.Flattr(valueAsString)
- key.string(KEY_PRODUCT_LIBERAPAYID) -> donates += Product.Donate.Liberapay(
- valueAsString
- )
-
- key.string(KEY_PRODUCT_OPENCOLLECTIVE) -> donates += Product.Donate.OpenCollective(
- valueAsString
- )
+ key.string(KEY_PRODUCT_DONATE) -> donates += Regular(valueAsString)
+ key.string(KEY_PRODUCT_BITCOIN) -> donates += Bitcoin(valueAsString)
+ key.string(KEY_PRODUCT_LIBERAPAYID) -> donates += Liberapay(valueAsString)
+ key.string(KEY_PRODUCT_LITECOIN) -> donates += Litecoin(valueAsString)
+ key.string(KEY_PRODUCT_OPENCOLLECTIVE) -> donates += OpenCollective(valueAsString)
key.dictionary(KEY_PRODUCT_LOCALIZED) -> forEachKey { localizedKey ->
if (localizedKey.token == JsonToken.START_OBJECT) {
@@ -315,6 +325,9 @@ object IndexV1Parser {
var phone = emptyList()
var smallTablet = emptyList()
var largeTablet = emptyList()
+ var wear = emptyList()
+ var tv = emptyList()
+ var video = emptyList()
forEachKey {
when {
it.string(KEY_PRODUCT_NAME) -> name = valueAsString
@@ -322,39 +335,42 @@ object IndexV1Parser {
it.string(KEY_PRODUCT_DESCRIPTION) -> description = valueAsString
it.string(KEY_PRODUCT_WHATSNEW) -> whatsNew = valueAsString
it.string(KEY_PRODUCT_ICON) -> metadataIcon = valueAsString
- it.array(KEY_PRODUCT_PHONESCREENSHOTS) ->
- phone =
- collectDistinctNotEmptyStrings()
+ it.string(KEY_PRODUCT_VIDEO) -> video = listOf(valueAsString)
+ it.array(KEY_PRODUCT_PHONE_SCREENSHOTS) ->
+ phone = collectDistinctNotEmptyStrings()
- it.array(KEY_PRODUCT_SEVENINCHSCREENSHOTS) ->
- smallTablet =
- collectDistinctNotEmptyStrings()
+ it.array(KEY_PRODUCT_SEVEN_INCH_SCREENSHOTS) ->
+ smallTablet = collectDistinctNotEmptyStrings()
- it.array(KEY_PRODUCT_TENINCHSCREENSHOTS) ->
- largeTablet =
- collectDistinctNotEmptyStrings()
+ it.array(KEY_PRODUCT_TEN_INCH_SCREENSHOTS) ->
+ largeTablet = collectDistinctNotEmptyStrings()
+
+ it.array(KEY_PRODUCT_WEAR_SCREENSHOTS) ->
+ wear = collectDistinctNotEmptyStrings()
+
+ it.array(KEY_PRODUCT_TV_SCREENSHOTS) ->
+ tv = collectDistinctNotEmptyStrings()
else -> skipChildren()
}
}
+ val isScreenshotEmpty =
+ arrayOf(video, phone, smallTablet, largeTablet, wear, tv)
+ .any { it.isNotEmpty() }
val screenshots =
- if (sequenceOf(
- phone,
- smallTablet,
- largeTablet
- ).any { it.isNotEmpty() }
- ) {
- Screenshots(phone, smallTablet, largeTablet)
+ if (isScreenshotEmpty) {
+ Screenshots(video, phone, smallTablet, largeTablet, wear, tv)
} else {
null
}
localizedMap[locale] = Localized(
- name,
- summary,
- description,
- whatsNew,
- metadataIcon.nullIfEmpty()?.let { "$locale/$it" }.orEmpty(),
- screenshots
+ name = name,
+ summary = summary,
+ description = description,
+ whatsNew = whatsNew,
+ metadataIcon = metadataIcon.nullIfEmpty()?.let { "$locale/$it" }
+ .orEmpty(),
+ screenshots = screenshots,
)
} else {
skipChildren()
@@ -377,28 +393,14 @@ object IndexV1Parser {
}
val screenshotPairs =
localizedMap.find { key, localized -> localized.screenshots?.let { Pair(key, it) } }
- val screenshots = screenshotPairs
- ?.let { (key, screenshots) ->
- screenshots.phone.asSequence()
- .map { Product.Screenshot(key, Product.Screenshot.Type.PHONE, it) } +
- screenshots.smallTablet.asSequence()
- .map {
- Product.Screenshot(
- key,
- Product.Screenshot.Type.SMALL_TABLET,
- it
- )
- } +
- screenshots.largeTablet.asSequence()
- .map {
- Product.Screenshot(
- key,
- Product.Screenshot.Type.LARGE_TABLET,
- it
- )
- }
- }
- .orEmpty().toList()
+ val screenshots = screenshotPairs?.let { (key, screenshots) ->
+ screenshots.video.map { Product.Screenshot(key, VIDEO, it) } +
+ screenshots.phone.map { Product.Screenshot(key, PHONE, it) } +
+ screenshots.smallTablet.map { Product.Screenshot(key, SMALL_TABLET, it) } +
+ screenshots.largeTablet.map { Product.Screenshot(key, LARGE_TABLET, it) } +
+ screenshots.wear.map { Product.Screenshot(key, WEAR, it) } +
+ screenshots.tv.map { Product.Screenshot(key, TV, it) }
+ }.orEmpty()
return Product(
repositoryId = repositoryId,
packageName = packageName,
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 8420c544..3530757d 100644
--- a/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt
+++ b/app/src/main/kotlin/com/looker/droidify/installer/InstallManager.kt
@@ -16,6 +16,8 @@ import com.looker.droidify.installer.installers.session.SessionInstaller
import com.looker.droidify.installer.installers.shizuku.ShizukuInstaller
import com.looker.droidify.installer.model.InstallItem
import com.looker.droidify.installer.model.InstallState
+import com.looker.droidify.installer.notification.createInstallNotification
+import com.looker.droidify.installer.notification.installNotification
import com.looker.droidify.installer.notification.removeInstallNotification
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.Channel
@@ -30,7 +32,7 @@ import kotlinx.coroutines.sync.withLock
class InstallManager(
private val context: Context,
- settingsRepository: SettingsRepository
+ private val settingsRepository: SettingsRepository
) {
private val installItems = Channel()
@@ -87,6 +89,13 @@ class InstallManager(
}.consumeEach { item ->
if (state.value.containsKey(item.packageName)) {
updateState { put(item.packageName, InstallState.Installing) }
+ context.notificationManager?.installNotification(
+ packageName = item.packageName.name,
+ notification = context.createInstallNotification(
+ appName = item.packageName.name,
+ state = InstallState.Installing,
+ )
+ )
val success = installer.use {
it.install(item)
}
@@ -106,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 3e95d042..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,49 +1,80 @@
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.utility.common.SdkCheck
-import com.looker.droidify.utility.common.cache.Cache
+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 kotlin.coroutines.resume
+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")
-internal 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"
}
override suspend fun install(
- installItem: InstallItem
- ): InstallState = suspendCancellableCoroutine { cont ->
- val (uri, flags) = if (SdkCheck.isNougat) {
- Cache.getReleaseUri(
- context,
- installItem.installFileName
- ) to Intent.FLAG_GRANT_READ_URI_PERMISSION
+ installItem: InstallItem,
+ ): InstallState {
+ val installFlag = if (SdkCheck.isNougat) Intent.FLAG_GRANT_READ_URI_PERMISSION else 0
+ val fileUri = if (SdkCheck.isNougat) {
+ Cache.getReleaseUri(context, installItem.installFileName)
} else {
- val file = Cache.getReleaseFile(context, installItem.installFileName)
- file.toUri() to 0
+ Cache.getReleaseFile(context, installItem.installFileName).toUri()
}
- try {
- context.startActivity(
- Intent(Intent.ACTION_INSTALL_PACKAGE).setDataAndType(uri, APK_MIME).setFlags(flags)
- )
- cont.resume(InstallState.Installed)
- } catch (e: AndroidRuntimeException) {
- context.startActivity(
- Intent(Intent.ACTION_INSTALL_PACKAGE).setDataAndType(uri, APK_MIME)
- .setFlags(flags or Intent.FLAG_ACTIVITY_NEW_TASK)
- )
- 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)
+ }
}
}
@@ -53,14 +84,14 @@ internal class LegacyInstaller(private val context: Context) : Installer {
override fun close() {}
}
-internal suspend fun Context.uninstallPackage(packageName: PackageName) =
+suspend fun Context.uninstallPackage(packageName: PackageName) =
suspendCancellableCoroutine { cont ->
try {
startActivity(
- Intent(
- Intent.ACTION_UNINSTALL_PACKAGE,
- "package:${packageName.name}".toUri()
- ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ intent(Intent.ACTION_UNINSTALL_PACKAGE) {
+ data = "package:${packageName.name}".toUri()
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ }
)
cont.resume(Unit)
} catch (e: Exception) {
diff --git a/app/src/main/kotlin/com/looker/droidify/installer/installers/root/RootInstaller.kt b/app/src/main/kotlin/com/looker/droidify/installer/installers/root/RootInstaller.kt
index e0bc8423..368f7bad 100644
--- a/app/src/main/kotlin/com/looker/droidify/installer/installers/root/RootInstaller.kt
+++ b/app/src/main/kotlin/com/looker/droidify/installer/installers/root/RootInstaller.kt
@@ -1,70 +1,34 @@
package com.looker.droidify.installer.installers.root
import android.content.Context
-import com.looker.droidify.utility.common.SdkCheck
-import com.looker.droidify.utility.common.cache.Cache
import com.looker.droidify.domain.model.PackageName
import com.looker.droidify.installer.installers.Installer
import com.looker.droidify.installer.installers.uninstallPackage
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.topjohnwu.superuser.Shell
import kotlinx.coroutines.suspendCancellableCoroutine
-import java.io.File
import kotlin.coroutines.resume
-internal class RootInstaller(private val context: Context) : Installer {
-
- private companion object {
- const val ROOT_INSTALL_PACKAGE = "cat %s | pm install --user %s -t -r -S %s"
- const val DELETE_PACKAGE = "%s rm %s"
-
- val getCurrentUserState: String
- get() = if (SdkCheck.isOreo) {
- com.topjohnwu.superuser.Shell.cmd("am get-current-user").exec().out[0]
- } else {
- com.topjohnwu.superuser.Shell.cmd("dumpsys activity | grep -E \"mUserLru\"")
- .exec().out[0].trim()
- .removePrefix("mUserLru: [").removeSuffix("]")
- }
-
- val String.quote
- get() = "\"${this.replace(Regex("""[\\$"`]""")) { c -> "\\${c.value}" }}\""
-
- val getUtilBoxPath: String
- get() {
- listOf("toybox", "busybox").forEach {
- val shellResult = com.topjohnwu.superuser.Shell.cmd("which $it").exec()
- if (shellResult.out.isNotEmpty()) {
- val utilBoxPath = shellResult.out.joinToString("")
- if (utilBoxPath.isNotEmpty()) return utilBoxPath.quote
- }
- }
- return ""
- }
-
- fun installCmd(file: File): String = String.format(
- ROOT_INSTALL_PACKAGE,
- file.absolutePath,
- getCurrentUserState,
- file.length()
- )
-
- fun deleteCmd(file: File): String = String.format(
- DELETE_PACKAGE,
- getUtilBoxPath,
- file.absolutePath.quote
- )
- }
+class RootInstaller(private val context: Context) : Installer {
override suspend fun install(
- installItem: InstallItem
+ installItem: InstallItem,
): InstallState = suspendCancellableCoroutine { cont ->
val releaseFile = Cache.getReleaseFile(context, installItem.installFileName)
- com.topjohnwu.superuser.Shell.cmd(installCmd(releaseFile)).submit { shellResult ->
+ val installCommand = INSTALL_COMMAND.format(
+ releaseFile.absolutePath,
+ currentUser(),
+ releaseFile.length(),
+ )
+ Shell.cmd(installCommand).submit { shellResult ->
val result = if (shellResult.isSuccess) InstallState.Installed
else InstallState.Failed
cont.resume(result)
- com.topjohnwu.superuser.Shell.cmd(deleteCmd(releaseFile)).submit()
+ val deleteCommand = DELETE_COMMAND.format(utilBox(), releaseFile.absolutePath)
+ Shell.cmd(deleteCommand).submit()
}
}
@@ -72,4 +36,34 @@ internal class RootInstaller(private val context: Context) : Installer {
context.uninstallPackage(packageName)
override fun close() {}
+
+}
+
+private const val INSTALL_COMMAND = "cat %s | pm install --user %s -t -r -S %s"
+private const val DELETE_COMMAND = "%s rm %s"
+
+/** Returns the path of either toybox or busybox, or empty string if not found. */
+private fun utilBox(): String {
+ listOf("toybox", "busybox").forEach {
+ // Returns the path of the requested [command], or empty string if not found
+ val out = Shell.cmd("which $it").exec().out
+ if (out.isEmpty()) return ""
+ if (out.first().contains("not found")) return ""
+ return out.first()
+ }
+ return ""
+}
+
+/** Returns the current user of the device. */
+private fun currentUser() = if (SdkCheck.isOreo) {
+ Shell.cmd("am get-current-user")
+ .exec()
+ .out[0]
+} else {
+ Shell.cmd("dumpsys activity | grep -E \"mUserLru\"")
+ .exec()
+ .out[0]
+ .trim()
+ .removePrefix("mUserLru: [")
+ .removeSuffix("]")
}
diff --git a/app/src/main/kotlin/com/looker/droidify/installer/installers/session/SessionInstaller.kt b/app/src/main/kotlin/com/looker/droidify/installer/installers/session/SessionInstaller.kt
index baedffe2..9f4cc18b 100644
--- a/app/src/main/kotlin/com/looker/droidify/installer/installers/session/SessionInstaller.kt
+++ b/app/src/main/kotlin/com/looker/droidify/installer/installers/session/SessionInstaller.kt
@@ -20,7 +20,7 @@ import com.looker.droidify.installer.model.InstallState
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
-internal class SessionInstaller(private val context: Context) : Installer {
+class SessionInstaller(private val context: Context) : Installer {
private val installer = context.packageManager.packageInstaller
private val intent = Intent(context, SessionInstallerReceiver::class.java)
diff --git a/app/src/main/kotlin/com/looker/droidify/installer/installers/shizuku/ShizukuInstaller.kt b/app/src/main/kotlin/com/looker/droidify/installer/installers/shizuku/ShizukuInstaller.kt
index 927e49a2..a70b3a5c 100644
--- a/app/src/main/kotlin/com/looker/droidify/installer/installers/shizuku/ShizukuInstaller.kt
+++ b/app/src/main/kotlin/com/looker/droidify/installer/installers/shizuku/ShizukuInstaller.kt
@@ -14,7 +14,7 @@ import java.io.BufferedReader
import java.io.InputStream
import kotlin.coroutines.resume
-internal class ShizukuInstaller(private val context: Context) : Installer {
+class ShizukuInstaller(private val context: Context) : Installer {
companion object {
private val SESSION_ID_REGEX = Regex("(?<=\\[).+?(?=])")
diff --git a/app/src/main/kotlin/com/looker/droidify/installer/model/InstallItem.kt b/app/src/main/kotlin/com/looker/droidify/installer/model/InstallItem.kt
index 0c604daa..8f4ce263 100644
--- a/app/src/main/kotlin/com/looker/droidify/installer/model/InstallItem.kt
+++ b/app/src/main/kotlin/com/looker/droidify/installer/model/InstallItem.kt
@@ -3,7 +3,7 @@ package com.looker.droidify.installer.model
import com.looker.droidify.domain.model.PackageName
import com.looker.droidify.domain.model.toPackageName
-data class InstallItem(
+class InstallItem(
val packageName: PackageName,
val installFileName: String
)
diff --git a/app/src/main/kotlin/com/looker/droidify/model/Product.kt b/app/src/main/kotlin/com/looker/droidify/model/Product.kt
index 25554353..6a7a6e6a 100644
--- a/app/src/main/kotlin/com/looker/droidify/model/Product.kt
+++ b/app/src/main/kotlin/com/looker/droidify/model/Product.kt
@@ -1,7 +1,9 @@
package com.looker.droidify.model
-import com.looker.droidify.domain.model.Donation
-import com.looker.droidify.domain.model.Screenshots
+import android.content.Context
+import com.looker.droidify.utility.common.extension.getColorFromAttr
+import com.looker.droidify.utility.common.extension.videoPlaceHolder
+import com.google.android.material.R as MaterialR
data class Product(
var repositoryId: Long,
@@ -33,29 +35,38 @@ data class Product(
data class Regular(val url: String) : Donate()
data class Bitcoin(val address: String) : Donate()
data class Litecoin(val address: String) : Donate()
- data class Flattr(val id: String) : Donate()
data class Liberapay(val id: String) : Donate()
data class OpenCollective(val id: String) : Donate()
}
class Screenshot(val locale: String, val type: Type, val path: String) {
enum class Type(val jsonName: String) {
+ VIDEO("video"),
PHONE("phone"),
SMALL_TABLET("smallTablet"),
- LARGE_TABLET("largeTablet")
+ LARGE_TABLET("largeTablet"),
+ WEAR("wear"),
+ TV("tv")
}
val identifier: String
get() = "$locale.${type.name}.$path"
fun url(
+ context: Context,
repository: Repository,
packageName: String
- ): String {
+ ): Any {
+ if (type == Type.VIDEO) return context.videoPlaceHolder.apply {
+ setTintList(context.getColorFromAttr(MaterialR.attr.colorOnSurfaceInverse))
+ }
val phoneType = when (type) {
Type.PHONE -> "phoneScreenshots"
Type.SMALL_TABLET -> "sevenInchScreenshots"
Type.LARGE_TABLET -> "tenInchScreenshots"
+ Type.WEAR -> "wearScreenshots"
+ Type.TV -> "tvScreenshots"
+ else -> error("Should not be here, video url already returned")
}
return "${repository.address}/$packageName/$locale/$phoneType/$path"
}
@@ -115,48 +126,3 @@ fun List>.findSuggested(
}
)
)
-//
-//fun App.toProduct() = Product(
-// packageName = metadata.packageName.name,
-// name = metadata.name,
-// summary = metadata.summary,
-// description = metadata.description,
-// whatsNew = metadata.whatsNew,
-// icon = metadata.icon,
-// metadataIcon = "",
-// author = Product.Author(
-// name = author.name,
-// email = author.email,
-// web = author.web,
-// ),
-// source = links.sourceCode,
-// changelog = links.changelog,
-// web = links.webSite,
-// tracker = links.issueTracker,
-// added = metadata.added,
-// updated = metadata.lastUpdated,
-// suggestedVersionCode = metadata.suggestedVersionCode,
-// categories = categories,
-// antiFeatures = metadata.antiFeatures,
-// licenses = listOf(metadata.license),
-// donates = donation.toLegacy(),
-// screenshots = screenshots.toLegacy(),
-// releases = packages
-//)
-
-fun Donation.toLegacy() = buildList {
- regularUrl?.let { it.forEach { add(Product.Donate.Regular(it)) } }
- bitcoinAddress?.let { add(Product.Donate.Bitcoin(it)) }
- flattrId?.let { add(Product.Donate.Flattr(it)) }
- litecoinAddress?.let { add(Product.Donate.Litecoin(it)) }
- openCollectiveId?.let { add(Product.Donate.OpenCollective(it)) }
- liberapayId?.let { add(Product.Donate.Liberapay(it)) }
-}
-
-fun Screenshots.toLegacy() = buildList {
- phone.forEach { add(Product.Screenshot("en-US", Product.Screenshot.Type.PHONE, it)) }
- sevenInch.forEach { add(Product.Screenshot("en-US", Product.Screenshot.Type.SMALL_TABLET, it)) }
- tenInch.forEach { add(Product.Screenshot("en-US", Product.Screenshot.Type.LARGE_TABLET, it)) }
- tv.forEach { add(Product.Screenshot("en-US", Product.Screenshot.Type.PHONE, it)) }
- wear.forEach { add(Product.Screenshot("en-US", Product.Screenshot.Type.PHONE, it)) }
-}
diff --git a/app/src/main/kotlin/com/looker/droidify/model/ProductItem.kt b/app/src/main/kotlin/com/looker/droidify/model/ProductItem.kt
index 5fc1c998..7b29cf60 100644
--- a/app/src/main/kotlin/com/looker/droidify/model/ProductItem.kt
+++ b/app/src/main/kotlin/com/looker/droidify/model/ProductItem.kt
@@ -18,16 +18,16 @@ data class ProductItem(
var canUpdate: Boolean,
var matchRank: Int
) {
- sealed class Section : Parcelable {
+ sealed interface Section : Parcelable {
@Parcelize
- data object All : Section()
+ object All : Section
@Parcelize
- data class Category(val name: String) : Section()
+ class Category(val name: String) : Section
@Parcelize
- data class Repository(val id: Long, val name: String) : Section()
+ class Repository(val id: Long, val name: String) : Section
}
private val supportedDpi = intArrayOf(120, 160, 240, 320, 480, 640)
diff --git a/app/src/main/kotlin/com/looker/droidify/model/Release.kt b/app/src/main/kotlin/com/looker/droidify/model/Release.kt
index f9209e03..aba123e3 100644
--- a/app/src/main/kotlin/com/looker/droidify/model/Release.kt
+++ b/app/src/main/kotlin/com/looker/droidify/model/Release.kt
@@ -31,7 +31,7 @@ data class Release(
object MinSdk : Incompatibility()
object MaxSdk : Incompatibility()
object Platform : Incompatibility()
- data class Feature(val feature: String) : Incompatibility()
+ class Feature(val feature: String) : Incompatibility()
}
val identifier: String
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 f19eeef6..4ea93461 100644
--- a/app/src/main/kotlin/com/looker/droidify/model/Repository.kt
+++ b/app/src/main/kotlin/com/looker/droidify/model/Repository.kt
@@ -15,7 +15,7 @@ data class Repository(
val entityTag: String,
val updated: Long,
val timestamp: Long,
- val authentication: String
+ val authentication: String,
) {
fun edit(address: String, fingerprint: String, authentication: String): Repository {
@@ -38,7 +38,7 @@ data class Repository(
version: Int,
lastModified: String,
entityTag: String,
- timestamp: Long
+ timestamp: Long,
): Repository {
return copy(
mirrors = mirrors,
@@ -62,7 +62,7 @@ data class Repository(
fun newRepository(
address: String,
fingerprint: String,
- authentication: String
+ authentication: String,
): Repository {
val name = try {
URL(address).let { "${it.host}${it.path}" }
@@ -79,7 +79,7 @@ data class Repository(
version: Int = 21,
enabled: Boolean = false,
fingerprint: String,
- authentication: String = ""
+ authentication: String = "",
): Repository {
return Repository(
-1, address, emptyList(), name, description, version, enabled,
@@ -150,14 +150,6 @@ data class Repository(
" by Netsyms Technologies.",
fingerprint = "2581BA7B32D3AB443180C4087CAB6A7E8FB258D3A6E98870ECB3C675E4D64489"
),
- defaultRepository(
- address = "https://fdroid.bromite.org/fdroid/repo",
- name = "Bromite",
- description = "The official repository for Bromite. " +
- "Bromite is a Chromium with ad blocking and enhanced p" +
- "rivacy.",
- fingerprint = "E1EE5CD076D7B0DC84CB2B45FB78B86DF2EB39A3B6C56BA3DC292A5E0C3B9504"
- ),
defaultRepository(
address = "https://molly.im/fdroid/foss/fdroid/repo",
name = "Molly",
@@ -217,7 +209,7 @@ data class Repository(
name = "Kali Nethunter",
description = "Kali Nethunter's official selection of original b" +
"inaries.",
- fingerprint = "7E418D34C3AD4F3C37D7E6B0FACE13332364459C862134EB099A3BDA2CCF4494"
+ fingerprint = "FE7A23DFC003A1CF2D2ADD2469B9C0C49B206BA5DC9EDD6563B3B7EB6A8F5FAB"
),
defaultRepository(
address = "https://secfirst.org/fdroid/repo",
@@ -265,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(
@@ -398,7 +390,7 @@ data class Repository(
),
)
- val newlyAdded = listOf(
+ val newlyAdded: List = listOf(
defaultRepository(
address = "https://fdroid.ironfoxoss.org/fdroid/repo",
name = "IronFox",
@@ -412,6 +404,14 @@ data class Repository(
description = "The official repository for Total Commander",
fingerprint = "3576596CECDD70488D61CFD90799A49B7FFD26A81A8FEF1BADEC88D069FA72C1"
),
+ defaultRepository(
+ address = "https://www.cromite.org/fdroid/repo",
+ name = "Cromite",
+ description = "The official repository for Cromite. " +
+ "Cromite is a Chromium fork based on Bromite with " +
+ "built-in support for ad blocking and an eye for privacy.",
+ fingerprint = "49F37E74DEE483DCA2B991334FB5A0200787430D0B5F9A783DD5F13695E9517B"
+ )
)
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/network/KtorDownloader.kt b/app/src/main/kotlin/com/looker/droidify/network/KtorDownloader.kt
index 3939ccfb..88e91c6a 100644
--- a/app/src/main/kotlin/com/looker/droidify/network/KtorDownloader.kt
+++ b/app/src/main/kotlin/com/looker/droidify/network/KtorDownloader.kt
@@ -136,7 +136,7 @@ internal class KtorDownloader(
private const val CONNECTION_TIMEOUT = 30_000L
private const val SOCKET_TIMEOUT = 15_000L
-private const val USER_AGENT = "Droid-ify, ${BuildConfig.VERSION_NAME}"
+private const val USER_AGENT = "Droid-ify/${BuildConfig.VERSION_NAME}-${BuildConfig.BUILD_TYPE}"
private fun HttpClientConfig<*>.userAgentConfig() = install(UserAgent) {
agent = USER_AGENT
diff --git a/app/src/main/kotlin/com/looker/droidify/service/SyncService.kt b/app/src/main/kotlin/com/looker/droidify/service/SyncService.kt
index f94f103a..18afd196 100644
--- a/app/src/main/kotlin/com/looker/droidify/service/SyncService.kt
+++ b/app/src/main/kotlin/com/looker/droidify/service/SyncService.kt
@@ -22,7 +22,6 @@ import com.looker.droidify.utility.common.extension.getColorFromAttr
import com.looker.droidify.utility.common.extension.notificationManager
import com.looker.droidify.utility.common.extension.startServiceCompat
import com.looker.droidify.utility.common.extension.stopForegroundCompat
-import com.looker.droidify.utility.common.log
import com.looker.droidify.utility.common.result.Result
import com.looker.droidify.utility.common.sdkAbove
import com.looker.droidify.datastore.SettingsRepository
@@ -53,6 +52,8 @@ import kotlinx.coroutines.withContext
import java.lang.ref.WeakReference
import javax.inject.Inject
import com.looker.droidify.R
+import kotlinx.coroutines.FlowPreview
+import kotlin.math.roundToInt
import android.R as AndroidR
import com.looker.droidify.R.string as stringRes
import com.looker.droidify.R.style as styleRes
@@ -69,15 +70,16 @@ class SyncService : ConnectionService() {
private const val MAX_UPDATE_NOTIFICATION = 5
private const val ACTION_CANCEL = "${BuildConfig.APPLICATION_ID}.intent.action.CANCEL"
- private val syncState = MutableSharedFlow()
+ val syncState = MutableSharedFlow()
}
@Inject
lateinit var settingsRepository: SettingsRepository
sealed class State(val name: String) {
- data class Connecting(val appName: String) : State(appName)
- data class Syncing(
+ class Connecting(appName: String) : State(appName)
+
+ class Syncing(
val appName: String,
val stage: RepositoryUpdater.Stage,
val read: DataSize,
@@ -85,6 +87,18 @@ class SyncService : ConnectionService() {
) : State(appName)
data object Finish : State("")
+
+ val progress: Int
+ get() = when (this) {
+ is Connecting -> Int.MIN_VALUE
+ Finish -> Int.MAX_VALUE
+ is Syncing -> when(stage) {
+ RepositoryUpdater.Stage.DOWNLOAD -> ((read percentBy total) * 0.4F).roundToInt()
+ RepositoryUpdater.Stage.PROCESS -> 50
+ RepositoryUpdater.Stage.MERGE -> 75
+ RepositoryUpdater.Stage.COMMIT -> 90
+ }
+ }
}
private class Task(val repositoryId: Long, val manual: Boolean)
@@ -145,7 +159,8 @@ class SyncService : ConnectionService() {
}
suspend fun updateAllApps() {
- updateAllAppsInternal()
+ val skipSignature = settingsRepository.getInitial().ignoreSignature
+ updateAllAppsInternal(skipSignature)
}
fun setUpdateNotificationBlocker(fragment: Fragment?) {
@@ -198,6 +213,7 @@ class SyncService : ConnectionService() {
private val binder = Binder()
override fun onBind(intent: Intent): Binder = binder
+ @OptIn(FlowPreview::class)
override fun onCreate() {
super.onCreate()
@@ -389,7 +405,8 @@ class SyncService : ConnectionService() {
handleUpdates(
hasUpdates = hasUpdates,
notifyUpdates = setting.notifyUpdate,
- autoUpdate = setting.autoUpdate
+ autoUpdate = setting.autoUpdate,
+ skipSignature = setting.ignoreSignature,
)
}
}
@@ -470,7 +487,8 @@ class SyncService : ConnectionService() {
private suspend fun handleUpdates(
hasUpdates: Boolean,
notifyUpdates: Boolean,
- autoUpdate: Boolean
+ autoUpdate: Boolean,
+ skipSignature: Boolean,
) {
try {
if (!hasUpdates) {
@@ -481,15 +499,16 @@ class SyncService : ConnectionService() {
return
}
val blocked = updateNotificationBlockerFragment?.get()?.isAdded == true
- val updates = Database.ProductAdapter.getUpdates()
+ val updates = Database.ProductAdapter.getUpdates(skipSignature)
if (!blocked && updates.isNotEmpty()) {
if (notifyUpdates) displayUpdatesNotification(updates)
- if (autoUpdate) updateAllAppsInternal()
+ if (autoUpdate) updateAllAppsInternal(skipSignature)
}
handleUpdates(
hasUpdates = false,
notifyUpdates = notifyUpdates,
- autoUpdate = autoUpdate
+ autoUpdate = autoUpdate,
+ skipSignature = skipSignature,
)
} finally {
withContext(NonCancellable) {
@@ -499,10 +518,9 @@ class SyncService : ConnectionService() {
}
}
- private suspend fun updateAllAppsInternal() {
- log("Check Running", "Syncing")
+ private suspend fun updateAllAppsInternal(skipSignature: Boolean) {
Database.ProductAdapter
- .getUpdates()
+ .getUpdates(skipSignature)
// Update Droid-ify the last
.sortedBy { if (it.packageName == packageName) 1 else -1 }
.map {
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt
index 4f3a2056..ef31a053 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt
@@ -40,7 +40,7 @@ import androidx.core.text.util.LinkifyCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import coil.load
+import coil3.load
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.google.android.material.imageview.ShapeableImageView
@@ -56,6 +56,7 @@ import com.looker.droidify.model.Release
import com.looker.droidify.model.Repository
import com.looker.droidify.model.findSuggested
import com.looker.droidify.network.DataSize
+import com.looker.droidify.network.percentBy
import com.looker.droidify.utility.PackageItemResolver
import com.looker.droidify.utility.common.extension.authentication
import com.looker.droidify.utility.common.extension.copyToClipboard
@@ -69,6 +70,7 @@ import com.looker.droidify.utility.common.extension.inflate
import com.looker.droidify.utility.common.extension.open
import com.looker.droidify.utility.common.extension.setTextSizeScaled
import com.looker.droidify.utility.common.nullIfEmpty
+import com.looker.droidify.utility.common.sdkName
import com.looker.droidify.utility.extension.android.Android
import com.looker.droidify.utility.extension.resources.TypefaceExtra
import com.looker.droidify.utility.extension.resources.sizeScaled
@@ -101,7 +103,7 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
fun onFavouriteClicked()
fun onPreferenceChanged(preference: ProductPreference)
fun onPermissionsClick(group: String?, permissions: List)
- fun onScreenshotClick(screenshot: Product.Screenshot, parentView: ImageView)
+ fun onScreenshotClick(position: Int)
fun onReleaseClick(release: Release)
fun onRequestAddRepository(address: String)
fun onUriClick(uri: Uri, shouldConfirm: Boolean): Boolean
@@ -313,7 +315,6 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
is Product.Donate.Regular -> drawableRes.ic_donate
is Product.Donate.Bitcoin -> drawableRes.ic_donate_bitcoin
is Product.Donate.Litecoin -> drawableRes.ic_donate_litecoin
- is Product.Donate.Flattr -> drawableRes.ic_donate_flattr
is Product.Donate.Liberapay -> drawableRes.ic_donate_liberapay
is Product.Donate.OpenCollective -> drawableRes.ic_donate_opencollective
}
@@ -322,7 +323,6 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
is Product.Donate.Regular -> context.getString(stringRes.website)
is Product.Donate.Bitcoin -> "Bitcoin"
is Product.Donate.Litecoin -> "Litecoin"
- is Product.Donate.Flattr -> "Flattr"
is Product.Donate.Liberapay -> "Liberapay"
is Product.Donate.OpenCollective -> "Open Collective"
}
@@ -331,12 +331,8 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
is Product.Donate.Regular -> Uri.parse(donate.url)
is Product.Donate.Bitcoin -> Uri.parse("bitcoin:${donate.address}")
is Product.Donate.Litecoin -> Uri.parse("litecoin:${donate.address}")
- is Product.Donate.Flattr -> Uri.parse(
- "https://flattr.com/thing/${donate.id}"
- )
-
is Product.Donate.Liberapay -> Uri.parse(
- "https://liberapay.com/~${donate.id}"
+ "https://liberapay.com/${donate.id}"
)
is Product.Donate.OpenCollective -> Uri.parse(
@@ -561,6 +557,7 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
val size = itemView.findViewById(R.id.size)!!
val signature = itemView.findViewById(R.id.signature)!!
val compatibility = itemView.findViewById(R.id.compatibility)!!
+ val sdkVer = itemView.findViewById(R.id.sdk_ver)!!
val statefulViews: Sequence
get() = sequenceOf(
@@ -571,7 +568,8 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
added,
size,
signature,
- compatibility
+ compatibility,
+ sdkVer,
)
}
@@ -1365,12 +1363,10 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
)
holder.progress.isIndeterminate = status.total == null
if (status.total != null) {
- holder.progress.progress =
- (
- holder.progress.max.toFloat() *
- status.read.value /
- status.total.value
- ).roundToInt()
+ holder.progress.setProgressCompat(
+ status.read.value percentBy status.total.value,
+ true
+ )
}
}
@@ -1430,17 +1426,15 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
holder as ScreenShotViewHolder
item as Item.ScreenshotItem
holder.screenshotsRecycler.run {
+ setHasFixedSize(true)
isNestedScrollingEnabled = false
clipToPadding = false
setPadding(8.dp, 8.dp, 8.dp, 8.dp)
layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
- adapter =
- ScreenshotsAdapter { screenshot, view ->
- callbacks.onScreenshotClick(screenshot, view)
- }.apply {
- setScreenshots(item.repository, item.packageName, item.screenshots)
- }
+ adapter = ScreenshotsAdapter(callbacks::onScreenshotClick).apply {
+ setScreenshots(item.repository, item.packageName, item.screenshots)
+ }
}
}
@@ -1626,7 +1620,7 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
holder.version.text =
context.getString(stringRes.version_FORMAT, item.release.version)
- holder.status.apply {
+ with(holder.status) {
isVisible = installed || suggested
setText(
when {
@@ -1637,14 +1631,15 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
)
background = context.corneredBackground
setPadding(15, 15, 15, 15)
- val (background, foreground) = if (installed) {
- MaterialR.attr.colorSecondaryContainer to MaterialR.attr.colorOnSecondaryContainer
+ if (installed) {
+ backgroundTintList =
+ context.getColorFromAttr(MaterialR.attr.colorSecondaryContainer)
+ setTextColor(context.getColorFromAttr(MaterialR.attr.colorOnSecondaryContainer))
} else {
- MaterialR.attr.colorPrimaryContainer to MaterialR.attr.colorOnPrimaryContainer
+ backgroundTintList =
+ context.getColorFromAttr(MaterialR.attr.colorPrimaryContainer)
+ setTextColor(context.getColorFromAttr(MaterialR.attr.colorOnPrimaryContainer))
}
- backgroundTintList =
- context.getColorFromAttr(background)
- setTextColor(context.getColorFromAttr(foreground))
}
holder.source.text =
context.getString(stringRes.provided_by_FORMAT, item.repository.name)
@@ -1688,35 +1683,51 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
}
holder.signature.text = builder
}
- holder.compatibility.isVisible = incompatibility != null || singlePlatform != null
- if (incompatibility != null) {
- holder.compatibility.setTextColor(
- context.getColorFromAttr(MaterialR.attr.colorError)
- )
- holder.compatibility.text = when (incompatibility) {
- is Release.Incompatibility.MinSdk,
- is Release.Incompatibility.MaxSdk
- -> context.getString(
- stringRes.incompatible_with_FORMAT,
- Android.name
- )
+ with(holder.compatibility) {
+ isVisible = incompatibility != null || singlePlatform != null
+ if (incompatibility != null) {
+ setTextColor(context.getColorFromAttr(MaterialR.attr.colorError))
+ text = when (incompatibility) {
+ is Release.Incompatibility.MinSdk,
+ is Release.Incompatibility.MaxSdk -> context.getString(
+ stringRes.incompatible_with_FORMAT,
+ Android.name
+ )
- is Release.Incompatibility.Platform -> context.getString(
- stringRes.incompatible_with_FORMAT,
- Android.primaryPlatform ?: context.getString(stringRes.unknown)
- )
+ is Release.Incompatibility.Platform -> context.getString(
+ stringRes.incompatible_with_FORMAT,
+ Android.primaryPlatform ?: context.getString(stringRes.unknown)
+ )
- is Release.Incompatibility.Feature -> context.getString(
- stringRes.requires_FORMAT,
- incompatibility.feature
+ is Release.Incompatibility.Feature -> context.getString(
+ stringRes.requires_FORMAT,
+ incompatibility.feature
+ )
+ }
+ } else if (singlePlatform != null) {
+ setTextColor(context.getColorFromAttr(android.R.attr.textColorSecondary))
+ text = context.getString(
+ stringRes.only_compatible_with_FORMAT,
+ singlePlatform,
)
}
- } else if (singlePlatform != null) {
- holder.compatibility.setTextColor(
- context.getColorFromAttr(android.R.attr.textColorSecondary)
+ }
+ with(holder.sdkVer) {
+ val targetSdkVersion = sdkName.getOrDefault(
+ item.release.targetSdkVersion,
+ context.getString(
+ stringRes.label_unknown_sdk,
+ item.release.targetSdkVersion,
+ ),
)
- holder.compatibility.text =
- context.getString(stringRes.only_compatible_with_FORMAT, singlePlatform)
+ val minSdkVersion = sdkName.getOrDefault(
+ item.release.minSdkVersion,
+ context.getString(
+ stringRes.label_unknown_sdk,
+ item.release.minSdkVersion,
+ ),
+ )
+ text = context.getString(stringRes.label_sdk_version, targetSdkVersion, minSdkVersion)
}
val enabled = status == Status.Idle
holder.statefulViews.forEach { it.isEnabled = enabled }
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt
index ab17d868..d15c7cc9 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt
@@ -1,5 +1,6 @@
package com.looker.droidify.ui.appDetail
+import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Intent
@@ -8,7 +9,6 @@ import android.os.Bundle
import android.provider.Settings
import android.view.MenuItem
import android.view.View
-import android.widget.ImageView
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.core.os.bundleOf
@@ -20,16 +20,13 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SimpleItemAnimator
-import coil.load
+import coil3.load
+import coil3.request.allowHardware
import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import com.looker.droidify.utility.common.cache.Cache
-import com.looker.droidify.utility.common.extension.getLauncherActivities
-import com.looker.droidify.utility.common.extension.getMutatedIcon
-import com.looker.droidify.utility.common.extension.isFirstItemVisible
-import com.looker.droidify.utility.common.extension.isSystemApplication
-import com.looker.droidify.utility.common.extension.systemBarsPadding
-import com.looker.droidify.utility.common.extension.updateAsMutable
import com.looker.droidify.content.ProductPreferences
+import com.looker.droidify.installer.installers.launchShizuku
+import com.looker.droidify.installer.model.InstallState
+import com.looker.droidify.installer.model.isCancellable
import com.looker.droidify.model.InstalledItem
import com.looker.droidify.model.Product
import com.looker.droidify.model.ProductPreference
@@ -43,11 +40,15 @@ import com.looker.droidify.ui.MessageDialog
import com.looker.droidify.ui.ScreenFragment
import com.looker.droidify.ui.appDetail.AppDetailViewModel.Companion.ARG_PACKAGE_NAME
import com.looker.droidify.ui.appDetail.AppDetailViewModel.Companion.ARG_REPO_ADDRESS
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.common.cache.Cache
+import com.looker.droidify.utility.common.extension.getLauncherActivities
+import com.looker.droidify.utility.common.extension.getMutatedIcon
+import com.looker.droidify.utility.common.extension.isFirstItemVisible
+import com.looker.droidify.utility.common.extension.isSystemApplication
+import com.looker.droidify.utility.common.extension.systemBarsPadding
+import com.looker.droidify.utility.common.extension.updateAsMutable
+import com.looker.droidify.utility.extension.mainActivity
import com.looker.droidify.utility.extension.startUpdate
-import com.looker.droidify.installer.installers.launchShizuku
-import com.looker.droidify.installer.model.InstallState
-import com.looker.droidify.installer.model.isCancellable
import com.stfalcon.imageviewer.StfalconImageViewer
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
@@ -89,6 +90,7 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
private val viewModel: AppDetailViewModel by viewModels()
+ @SuppressLint("RestrictedApi")
private var layoutManagerState: LinearLayoutManager.SavedState? = null
private var actions = Pair(emptySet(), null as Action?)
@@ -99,6 +101,7 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
private var recyclerView: RecyclerView? = null
private var detailAdapter: AppDetailAdapter? = null
+ private var imageViewer: StfalconImageViewer.Builder? = null
private val downloadConnection = Connection(
serviceClass = DownloadService::class.java,
@@ -109,11 +112,12 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
}
)
+ @SuppressLint("RestrictedApi")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
detailAdapter = AppDetailAdapter(this@AppDetailFragment)
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.onToolbarCreated(toolbar)
toolbar.menu.apply {
Action.entries.forEach { action ->
add(0, action.id, 0, action.adapterAction.titleResId)
@@ -205,10 +209,12 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
super.onDestroyView()
recyclerView = null
detailAdapter = null
+ imageViewer = null
downloadConnection.unbind(requireContext())
}
+ @SuppressLint("RestrictedApi")
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
@@ -446,20 +452,27 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
.show(childFragmentManager)
}
- override fun onScreenshotClick(screenshot: Product.Screenshot, parentView: ImageView) {
- val product = products
- .firstOrNull { (product, _) ->
- product.screenshots.find { it === screenshot }?.identifier != null
+ override fun onScreenshotClick(position: Int) {
+ if (imageViewer == null) {
+ val productRepository = products.findSuggested(installed?.installedItem) ?: return
+ val screenshots = productRepository.first.screenshots.mapNotNull {
+ if (it.type == Product.Screenshot.Type.VIDEO) null
+ else it
}
- ?: return
- val screenshots = product.first.screenshots
- val position = screenshots.indexOfFirst { screenshot.identifier == it.identifier }
- StfalconImageViewer
- .Builder(context, screenshots) { view, current ->
- view.load(current.url(product.second, viewModel.packageName))
- }
- .withStartPosition(position)
- .show()
+ imageViewer = StfalconImageViewer
+ .Builder(context, screenshots) { view, current ->
+ val screenshotUrl = current.url(
+ context = requireContext(),
+ repository = productRepository.second,
+ packageName = viewModel.packageName
+ )
+ view.load(screenshotUrl) {
+ allowHardware(false)
+ }
+ }
+ }
+ imageViewer?.withStartPosition(position)
+ imageViewer?.show()
}
override fun onReleaseClick(release: Release) {
@@ -517,7 +530,7 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
}
override fun onRequestAddRepository(address: String) {
- screenActivity.navigateAddRepository(address)
+ mainActivity.navigateAddRepository(address)
}
override fun onUriClick(uri: Uri, shouldConfirm: Boolean): Boolean {
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/ScreenshotsAdapter.kt b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/ScreenshotsAdapter.kt
index a44e590a..29d02fa0 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/ScreenshotsAdapter.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/ScreenshotsAdapter.kt
@@ -5,55 +5,71 @@ import android.graphics.drawable.Drawable
import android.view.Gravity
import android.view.ViewGroup
import android.widget.FrameLayout
-import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
-import coil.dispose
-import coil.load
-import coil.size.Dimension
-import coil.size.Scale
+import coil3.asImage
+import coil3.dispose
+import coil3.load
+import coil3.request.placeholder
+import coil3.size.Scale
import com.google.android.material.imageview.ShapeableImageView
+import com.looker.droidify.databinding.VideoButtonBinding
+import com.looker.droidify.graphics.PaddingDrawable
+import com.looker.droidify.model.Product
+import com.looker.droidify.model.Repository
import com.looker.droidify.utility.common.extension.aspectRatio
import com.looker.droidify.utility.common.extension.authentication
import com.looker.droidify.utility.common.extension.camera
import com.looker.droidify.utility.common.extension.dp
-import com.looker.droidify.utility.common.extension.dpToPx
import com.looker.droidify.utility.common.extension.getColorFromAttr
+import com.looker.droidify.utility.common.extension.layoutInflater
+import com.looker.droidify.utility.common.extension.openLink
import com.looker.droidify.utility.common.extension.selectableBackground
-import com.looker.droidify.graphics.PaddingDrawable
-import com.looker.droidify.model.Product
-import com.looker.droidify.model.Repository
import com.looker.droidify.widget.StableRecyclerAdapter
import com.google.android.material.R as MaterialR
import com.looker.droidify.R.dimen as dimenRes
-class ScreenshotsAdapter(private val onClick: (Product.Screenshot, ImageView) -> Unit) :
+class ScreenshotsAdapter(private val onClick: (position: Int) -> Unit) :
StableRecyclerAdapter() {
- enum class ViewType { SCREENSHOT }
+ enum class ViewType { SCREENSHOT, VIDEO }
- private val items = mutableListOf()
+ private val items = mutableListOf()
- private class ViewHolder(context: Context) :
- RecyclerView.ViewHolder(FrameLayout(context)) {
- val image: ShapeableImageView = object : ShapeableImageView(context) {
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec)
- setMeasuredDimension(measuredWidth, measuredHeight)
+ private inner class VideoViewHolder(
+ binding: VideoButtonBinding,
+ ) : RecyclerView.ViewHolder(binding.root) {
+ val button = binding.videoButton
+
+ init {
+ with(button) {
+ layoutParams = RecyclerView.LayoutParams(
+ RecyclerView.LayoutParams.WRAP_CONTENT,
+ 150.dp,
+ )
+ setOnClickListener {
+ val item = items[absoluteAdapterPosition] as Item.VideoItem
+ it.context?.openLink(item.videoUrl)
+ }
}
}
+ }
+
+
+ private inner class ScreenshotViewHolder(
+ context: Context,
+ ) : RecyclerView.ViewHolder(FrameLayout(context)) {
+ val image = ShapeableImageView(context)
val placeholderColor = context.getColorFromAttr(MaterialR.attr.colorPrimaryContainer)
val radius = context.resources.getDimension(dimenRes.shape_small_corner)
val imageShapeModel = image.shapeAppearanceModel.toBuilder()
.setAllCornerSizes(radius)
.build()
- val cameraIcon = context.camera
- .apply { setTintList(placeholderColor) }
+ val cameraIcon = context.camera.apply { setTintList(placeholderColor) }
val placeholder: Drawable = PaddingDrawable(cameraIcon, 3f, context.aspectRatio)
init {
with(image) {
layout(0, 0, 0, 0)
- adjustViewBounds = true
shapeAppearanceModel = imageShapeModel
background = context.selectableBackground
isFocusable = true
@@ -68,6 +84,14 @@ class ScreenshotsAdapter(private val onClick: (Product.Screenshot, ImageView) ->
marginEnd = radius.toInt()
}
foregroundGravity = Gravity.CENTER
+ setOnClickListener {
+ val position = if (items.any { it.viewType == ViewType.VIDEO }) {
+ absoluteAdapterPosition - 1
+ } else {
+ absoluteAdapterPosition
+ }
+ onClick(position)
+ }
}
}
}
@@ -75,67 +99,73 @@ class ScreenshotsAdapter(private val onClick: (Product.Screenshot, ImageView) ->
fun setScreenshots(
repository: Repository,
packageName: String,
- screenshots: List
+ screenshots: List,
) {
items.clear()
- items += screenshots.map { Item.ScreenshotItem(repository, packageName, it) }
+ items += screenshots.map {
+ if (it.type == Product.Screenshot.Type.VIDEO) Item.VideoItem(it.path)
+ else Item.ScreenshotItem(repository, packageName, it)
+ }
notifyItemRangeInserted(0, screenshots.size)
}
- override val viewTypeClass: Class
- get() = ViewType::class.java
-
- override fun getItemEnumViewType(position: Int): ViewType {
- return ViewType.SCREENSHOT
- }
+ override val viewTypeClass: Class get() = ViewType::class.java
+ override fun getItemCount(): Int = items.size
+ override fun getItemEnumViewType(position: Int) = items[position].viewType
+ override fun getItemDescriptor(position: Int): String = items[position].descriptor
override fun onCreateViewHolder(
parent: ViewGroup,
- viewType: ViewType
+ viewType: ViewType,
): RecyclerView.ViewHolder {
- return ViewHolder(parent.context).apply {
- image.setOnClickListener {
- onClick(
- items[absoluteAdapterPosition].screenshot,
- it as ImageView
- )
- }
+ return when (viewType) {
+ ViewType.VIDEO -> VideoViewHolder(VideoButtonBinding.inflate(parent.context.layoutInflater))
+ ViewType.SCREENSHOT -> ScreenshotViewHolder(parent.context)
}
}
- override fun getItemDescriptor(position: Int): String = items[position].descriptor
- override fun getItemCount(): Int = items.size
-
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
- holder as ViewHolder
- val item = items[position]
- with(holder.image) {
- load(item.screenshot.url(item.repository, item.packageName)) {
- size(Dimension.Undefined, Dimension(150.dp.dpToPx.toInt()))
- scale(Scale.FIT)
- placeholder(holder.placeholder)
- error(holder.placeholder)
- authentication(item.repository.authentication)
+ when (getItemEnumViewType(position)) {
+ ViewType.SCREENSHOT -> {
+ holder as ScreenshotViewHolder
+ val item = items[position] as Item.ScreenshotItem
+ with(holder.image) {
+ load(item.screenshot.url(context, item.repository, item.packageName)) {
+ authentication(item.repository.authentication)
+ scale(Scale.FILL)
+ placeholder(holder.placeholder)
+ error(holder.placeholder.asImage())
+ }
+ }
}
+
+ ViewType.VIDEO -> {}
}
}
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
- holder as ViewHolder
- holder.image.dispose()
+ if (holder is ScreenshotViewHolder) holder.image.dispose()
}
- private sealed class Item {
- abstract val descriptor: String
+ private sealed interface Item {
+
+ val descriptor: String
+ val viewType: ViewType
class ScreenshotItem(
val repository: Repository,
val packageName: String,
- val screenshot: Product.Screenshot
- ) : Item() {
+ val screenshot: Product.Screenshot,
+ ) : Item {
+ override val viewType: ViewType get() = ViewType.SCREENSHOT
override val descriptor: String
get() = "screenshot.${repository.id}.${screenshot.identifier}"
}
+
+ class VideoItem(val videoUrl: String) : Item {
+ override val viewType: ViewType get() = ViewType.VIDEO
+ override val descriptor: String get() = "video"
+ }
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListAdapter.kt b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListAdapter.kt
index ade4a324..3450508d 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListAdapter.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListAdapter.kt
@@ -2,6 +2,7 @@ package com.looker.droidify.ui.appList
import android.annotation.SuppressLint
import android.content.Context
+import android.content.res.ColorStateList
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
@@ -9,7 +10,7 @@ import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
-import coil.load
+import coil3.load
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.progressindicator.CircularProgressIndicator
import com.looker.droidify.R
@@ -22,23 +23,31 @@ import com.looker.droidify.utility.common.extension.dp
import com.looker.droidify.utility.common.extension.getColorFromAttr
import com.looker.droidify.utility.common.extension.inflate
import com.looker.droidify.utility.common.extension.setTextSizeScaled
+import com.looker.droidify.utility.common.log
import com.looker.droidify.utility.common.nullIfEmpty
import com.looker.droidify.utility.extension.resources.TypefaceExtra
import com.looker.droidify.widget.CursorRecyclerAdapter
+import kotlin.system.measureTimeMillis
import com.google.android.material.R as MaterialR
class AppListAdapter(
private val source: AppListFragment.Source,
- private val onClick: (ProductItem) -> Unit
+ private val onClick: (packageName: String) -> Unit,
) : CursorRecyclerAdapter() {
enum class ViewType { PRODUCT, LOADING, EMPTY }
- private class ProductViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ private inner class ProductViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val name = itemView.findViewById(R.id.name)!!
val status = itemView.findViewById(R.id.status)!!
val summary = itemView.findViewById(R.id.summary)!!
val icon = itemView.findViewById(R.id.icon)!!
+
+ init {
+ itemView.setOnClickListener {
+ log(measureTimeMillis { onClick(getPackageName(absoluteAdapterPosition)) }, "Bench")
+ }
+ }
}
private class LoadingViewHolder(context: Context) :
@@ -82,12 +91,14 @@ class AppListAdapter(
}
}
- var repositories: Map = emptyMap()
- @SuppressLint("NotifyDataSetChanged")
- set(value) {
- field = value
- notifyDataSetChanged()
+ private val repositories: HashMap = HashMap()
+
+ fun updateRepos(repos: List) {
+ repos.forEach {
+ repositories[it.id] = it
}
+ notifyDataSetChanged()
+ }
var emptyText: String = ""
@SuppressLint("NotifyDataSetChanged")
@@ -117,24 +128,31 @@ class AppListAdapter(
}
}
+ private fun getPackageName(position: Int): String {
+ return Database.ProductAdapter.transformPackageName(moveTo(position.coerceAtLeast(0)))
+ }
+
private fun getProductItem(position: Int): ProductItem {
return Database.ProductAdapter.transformItem(moveTo(position.coerceAtLeast(0)))
}
override fun onCreateViewHolder(
parent: ViewGroup,
- viewType: ViewType
+ viewType: ViewType,
): RecyclerView.ViewHolder {
return when (viewType) {
- ViewType.PRODUCT -> ProductViewHolder(parent.inflate(R.layout.product_item)).apply {
- itemView.setOnClickListener { onClick(getProductItem(absoluteAdapterPosition)) }
- }
-
+ ViewType.PRODUCT -> ProductViewHolder(parent.inflate(R.layout.product_item))
ViewType.LOADING -> LoadingViewHolder(parent.context)
ViewType.EMPTY -> EmptyViewHolder(parent.context)
}
}
+ private var updateBackground: ColorStateList? = null
+ private var updateForeground: ColorStateList? = null
+ private var installedBackground: ColorStateList? = null
+ private var installedForeground: ColorStateList? = null
+ private var defaultForeground: ColorStateList? = null
+
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemEnumViewType(position)) {
ViewType.PRODUCT -> {
@@ -142,9 +160,9 @@ class AppListAdapter(
val productItem = getProductItem(position)
holder.name.text = productItem.name
holder.summary.text = productItem.summary
- holder.summary.isVisible =
- productItem.summary.isNotEmpty() && productItem.name != productItem.summary
- val repository: Repository? = repositories[productItem.repositoryId]
+ holder.summary.isVisible = productItem.summary.isNotEmpty()
+ && productItem.name != productItem.summary
+ val repository = repositories[productItem.repositoryId]
if (repository != null) {
val iconUrl = productItem.icon(view = holder.icon, repository = repository)
holder.icon.load(iconUrl) {
@@ -161,28 +179,38 @@ class AppListAdapter(
val isInstalled = productItem.installedVersion.nullIfEmpty() != null
when {
productItem.canUpdate -> {
- backgroundTintList =
- context.getColorFromAttr(MaterialR.attr.colorTertiaryContainer)
- setTextColor(
- context.getColorFromAttr(MaterialR.attr.colorOnTertiaryContainer)
- )
+ if (updateBackground == null) {
+ updateBackground =
+ context.getColorFromAttr(MaterialR.attr.colorTertiaryContainer)
+ }
+ if (updateForeground == null) {
+ updateForeground =
+ context.getColorFromAttr(MaterialR.attr.colorOnTertiaryContainer)
+ }
+ backgroundTintList = updateBackground
+ setTextColor(updateForeground)
}
isInstalled -> {
- backgroundTintList =
- context.getColorFromAttr(MaterialR.attr.colorSecondaryContainer)
- setTextColor(
- context.getColorFromAttr(MaterialR.attr.colorOnSecondaryContainer)
- )
+ if (installedBackground == null) {
+ installedBackground =
+ context.getColorFromAttr(MaterialR.attr.colorSecondaryContainer)
+ }
+ if (installedForeground == null) {
+ installedForeground =
+ context.getColorFromAttr(MaterialR.attr.colorOnSecondaryContainer)
+ }
+ backgroundTintList = installedBackground
+ setTextColor(installedForeground)
}
else -> {
setPadding(0, 0, 0, 0)
- setTextColor(
- holder.status.context.getColorFromAttr(
- MaterialR.attr.colorOnBackground
- )
- )
+ if (defaultForeground == null) {
+ defaultForeground =
+ context.getColorFromAttr(MaterialR.attr.colorOnBackground)
+ }
+ setTextColor(defaultForeground)
background = null
return@with
}
@@ -191,9 +219,9 @@ class AppListAdapter(
6.dp.let { setPadding(it, it, it, it) }
}
val enabled = productItem.compatible || productItem.installedVersion.isNotEmpty()
- sequenceOf(holder.name, holder.status, holder.summary).forEach {
- it.isEnabled = enabled
- }
+ holder.name.isEnabled = enabled
+ holder.status.isEnabled = enabled
+ holder.summary.isEnabled = enabled
}
ViewType.LOADING -> {
@@ -204,6 +232,6 @@ class AppListAdapter(
holder as EmptyViewHolder
holder.text.text = emptyText
}
- }::class
+ }
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListFragment.kt
index 4591d1ff..0c7a7d74 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListFragment.kt
@@ -14,19 +14,19 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import com.looker.droidify.utility.common.Scroller
import com.looker.droidify.R
-import com.looker.droidify.R.string as stringRes
+import com.looker.droidify.database.CursorOwner
+import com.looker.droidify.databinding.RecyclerViewWithFabBinding
+import com.looker.droidify.model.ProductItem
+import com.looker.droidify.utility.common.Scroller
import com.looker.droidify.utility.common.extension.dp
import com.looker.droidify.utility.common.extension.isFirstItemVisible
import com.looker.droidify.utility.common.extension.systemBarsMargin
import com.looker.droidify.utility.common.extension.systemBarsPadding
-import com.looker.droidify.model.ProductItem
-import com.looker.droidify.database.CursorOwner
-import com.looker.droidify.databinding.RecyclerViewWithFabBinding
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.extension.mainActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
+import com.looker.droidify.R.string as stringRes
@AndroidEntryPoint
class AppListFragment() : Fragment(), CursorOwner.Callback {
@@ -46,7 +46,7 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
val titleResId: Int,
val sections: Boolean,
val order: Boolean,
- val updateAll: Boolean
+ val updateAll: Boolean,
) {
AVAILABLE(stringRes.available, true, true, false),
INSTALLED(stringRes.installed, false, true, false),
@@ -63,14 +63,15 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
get() = requireArguments().getString(EXTRA_SOURCE)!!.let(Source::valueOf)
private lateinit var recyclerView: RecyclerView
- private lateinit var recyclerViewAdapter: AppListAdapter
+ private lateinit var appListAdapter: AppListAdapter
+ private var scroller: Scroller? = null
private var shortAnimationDuration: Int = 0
private var layoutManagerState: Parcelable? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View {
_binding = RecyclerViewWithFabBinding.inflate(inflater, container, false)
@@ -83,10 +84,8 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
isMotionEventSplittingEnabled = false
setHasFixedSize(true)
recycledViewPool.setMaxRecycledViews(AppListAdapter.ViewType.PRODUCT.ordinal, 30)
- recyclerViewAdapter = AppListAdapter(source) {
- screenActivity.navigateProduct(it.packageName)
- }
- adapter = recyclerViewAdapter
+ appListAdapter = AppListAdapter(source, mainActivity::navigateProduct)
+ adapter = appListAdapter
systemBarsPadding()
}
val fab = binding.scrollUp
@@ -103,11 +102,13 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
}
systemBarsMargin(16.dp)
} else {
- text = ""
+ text = null
setIconResource(R.drawable.arrow_up)
setOnClickListener {
- val scroller = Scroller(requireContext())
- scroller.targetPosition = 0
+ if (scroller == null) {
+ scroller = Scroller(requireContext())
+ }
+ scroller!!.targetPosition = 0
recyclerView.layoutManager?.startSmoothScroll(scroller)
}
alpha = 0f
@@ -138,7 +139,7 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
launch {
viewModel.reposStream.collect { repos ->
- recyclerViewAdapter.repositories = repos.associateBy { it.id }
+ appListAdapter.updateRepos(repos)
}
}
launch {
@@ -160,12 +161,13 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
super.onDestroyView()
viewModel.syncConnection.unbind(requireContext())
_binding = null
- screenActivity.cursorOwner.detach(this)
+ scroller = null
+ mainActivity.cursorOwner.detach(this)
}
override fun onCursorData(request: CursorOwner.Request, cursor: Cursor?) {
- recyclerViewAdapter.cursor = cursor
- recyclerViewAdapter.emptyText = when {
+ appListAdapter.cursor = cursor
+ appListAdapter.emptyText = when {
cursor == null -> ""
viewModel.searchQuery.value.isNotEmpty() -> {
getString(stringRes.no_matching_applications_found)
@@ -197,7 +199,7 @@ class AppListFragment() : Fragment(), CursorOwner.Callback {
private fun updateRequest() {
if (view != null) {
- screenActivity.cursorOwner.attach(this, viewModel.request(source))
+ mainActivity.cursorOwner.attach(this, viewModel.request(source))
}
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListViewModel.kt b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListViewModel.kt
index 076a2084..18605ee3 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListViewModel.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/appList/AppListViewModel.kt
@@ -2,40 +2,52 @@ package com.looker.droidify.ui.appList
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.looker.droidify.utility.common.extension.asStateFlow
+import com.looker.droidify.database.CursorOwner
+import com.looker.droidify.database.CursorOwner.Request.Available
+import com.looker.droidify.database.CursorOwner.Request.Installed
+import com.looker.droidify.database.CursorOwner.Request.Updates
+import com.looker.droidify.database.Database
import com.looker.droidify.datastore.SettingsRepository
import com.looker.droidify.datastore.get
import com.looker.droidify.datastore.model.SortOrder
import com.looker.droidify.model.ProductItem
import com.looker.droidify.model.ProductItem.Section.All
-import com.looker.droidify.database.CursorOwner
-import com.looker.droidify.database.Database
import com.looker.droidify.service.Connection
import com.looker.droidify.service.SyncService
+import com.looker.droidify.utility.common.extension.asStateFlow
import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
+import javax.inject.Inject
@HiltViewModel
class AppListViewModel
@Inject constructor(
- settingsRepository: SettingsRepository
+ settingsRepository: SettingsRepository,
) : ViewModel() {
+ private val skipSignatureStream = settingsRepository
+ .get { ignoreSignature }
+ .asStateFlow(false)
+
+ val sortOrderFlow = settingsRepository
+ .get { sortOrder }
+ .asStateFlow(SortOrder.UPDATED)
+
val reposStream = Database.RepositoryAdapter
.getAllStream()
.asStateFlow(emptyList())
- val showUpdateAllButton = Database.ProductAdapter
- .getUpdatesStream()
- .map { it.isNotEmpty() }
- .asStateFlow(false)
-
- val sortOrderFlow = settingsRepository.get { sortOrder }
- .asStateFlow(SortOrder.UPDATED)
+ @OptIn(ExperimentalCoroutinesApi::class)
+ val showUpdateAllButton = skipSignatureStream.flatMapConcat { skip ->
+ Database.ProductAdapter
+ .getUpdatesStream(skip)
+ .map { it.isNotEmpty() }
+ }.asStateFlow(false)
private val sections = MutableStateFlow(All)
@@ -51,22 +63,23 @@ class AppListViewModel
fun request(source: AppListFragment.Source): CursorOwner.Request {
return when (source) {
- AppListFragment.Source.AVAILABLE -> CursorOwner.Request.ProductsAvailable(
- searchQuery.value,
- sections.value,
- sortOrderFlow.value
+ AppListFragment.Source.AVAILABLE -> Available(
+ searchQuery = searchQuery.value,
+ section = sections.value,
+ order = sortOrderFlow.value,
)
- AppListFragment.Source.INSTALLED -> CursorOwner.Request.ProductsInstalled(
- searchQuery.value,
- sections.value,
- sortOrderFlow.value
+ AppListFragment.Source.INSTALLED -> Installed(
+ searchQuery = searchQuery.value,
+ section = sections.value,
+ order = sortOrderFlow.value,
)
- AppListFragment.Source.UPDATES -> CursorOwner.Request.ProductsUpdates(
- searchQuery.value,
- sections.value,
- sortOrderFlow.value
+ AppListFragment.Source.UPDATES -> Updates(
+ searchQuery = searchQuery.value,
+ section = sections.value,
+ order = sortOrderFlow.value,
+ skipSignatureCheck = skipSignatureStream.value,
)
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouriteFragmentAdapter.kt b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouriteFragmentAdapter.kt
index 7806b9bd..4c0ba3fa 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouriteFragmentAdapter.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouriteFragmentAdapter.kt
@@ -4,7 +4,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
-import coil.load
+import coil3.load
import com.looker.droidify.databinding.ProductItemBinding
import com.looker.droidify.model.Product
import com.looker.droidify.model.Repository
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesFragment.kt
index 53e0212b..d9cff3ef 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesFragment.kt
@@ -15,7 +15,7 @@ import com.looker.droidify.R
import com.looker.droidify.utility.common.extension.systemBarsPadding
import com.looker.droidify.database.Database
import com.looker.droidify.ui.ScreenFragment
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.extension.mainActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@@ -43,7 +43,7 @@ class FavouritesFragment : ScreenFragment() {
isVerticalScrollBarEnabled = false
setHasFixedSize(true)
recyclerViewAdapter =
- FavouriteFragmentAdapter { screenActivity.navigateProduct(it) }
+ FavouriteFragmentAdapter { mainActivity.navigateProduct(it) }
this.adapter = recyclerViewAdapter
systemBarsPadding(includeFab = false)
recyclerView = this
@@ -74,6 +74,6 @@ class FavouritesFragment : ScreenFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.onToolbarCreated(toolbar)
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesViewModel.kt b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesViewModel.kt
index 02974487..eb253460 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesViewModel.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/favourites/FavouritesViewModel.kt
@@ -1,21 +1,19 @@
package com.looker.droidify.ui.favourites
import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import com.looker.droidify.utility.common.extension.asStateFlow
+import com.looker.droidify.database.Database
import com.looker.droidify.datastore.SettingsRepository
import com.looker.droidify.datastore.get
import com.looker.droidify.model.Product
-import com.looker.droidify.database.Database
+import com.looker.droidify.utility.common.extension.asStateFlow
import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.launch
+import javax.inject.Inject
@HiltViewModel
class FavouritesViewModel @Inject constructor(
- private val settingsRepository: SettingsRepository
+ settingsRepository: SettingsRepository,
) : ViewModel() {
val favouriteApps: StateFlow>> =
@@ -27,9 +25,4 @@ class FavouritesViewModel @Inject constructor(
}
}.asStateFlow(emptyList())
- fun updateFavourites(packageName: String) {
- viewModelScope.launch {
- settingsRepository.toggleFavourites(packageName)
- }
- }
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/repository/EditRepositoryFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/repository/EditRepositoryFragment.kt
index 3bc14894..8fb86a9d 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/repository/EditRepositoryFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/repository/EditRepositoryFragment.kt
@@ -15,26 +15,25 @@ import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
-import com.looker.droidify.utility.common.extension.clipboardManager
-import com.looker.droidify.utility.common.extension.get
-import com.looker.droidify.utility.common.extension.getMutatedIcon
-import com.looker.droidify.utility.common.nullIfEmpty
-import com.looker.droidify.model.Repository
+import com.looker.droidify.R
import com.looker.droidify.database.Database
import com.looker.droidify.databinding.EditRepositoryBinding
+import com.looker.droidify.model.Repository
+import com.looker.droidify.network.Downloader
+import com.looker.droidify.network.NetworkResponse
import com.looker.droidify.service.Connection
import com.looker.droidify.service.SyncService
import com.looker.droidify.ui.Message
import com.looker.droidify.ui.MessageDialog
import com.looker.droidify.ui.ScreenFragment
-import com.looker.droidify.utility.extension.screenActivity
-import com.looker.droidify.network.Downloader
-import com.looker.droidify.network.NetworkResponse
+import com.looker.droidify.utility.common.extension.clipboardManager
+import com.looker.droidify.utility.common.extension.get
+import com.looker.droidify.utility.common.extension.getMutatedIcon
+import com.looker.droidify.utility.common.nullIfEmpty
+import com.looker.droidify.utility.extension.mainActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import java.net.URI
@@ -44,7 +43,6 @@ import java.nio.charset.Charset
import java.util.Locale
import javax.inject.Inject
import kotlin.math.min
-import com.looker.droidify.R
import com.looker.droidify.R.string as stringRes
@AndroidEntryPoint
@@ -82,11 +80,9 @@ class EditRepositoryFragment() : ScreenFragment() {
syncConnection.bind(requireContext())
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.onToolbarCreated(toolbar)
toolbar.title =
- getString(
- if (repoId != null) stringRes.edit_repository else stringRes.add_repository
- )
+ getString(if (repoId != null) stringRes.edit_repository else stringRes.add_repository)
saveMenuItem = toolbar.menu.add(stringRes.save)
.setIcon(toolbar.context.getMutatedIcon(R.drawable.ic_save))
@@ -240,6 +236,8 @@ class EditRepositoryFragment() : ScreenFragment() {
saveMenuItem = null
syncConnection.unbind(requireContext())
+ checkJob?.cancel()
+ checkJob = null
_binding = null
}
@@ -394,22 +392,22 @@ class EditRepositoryFragment() : ScreenFragment() {
}
private suspend fun checkAddress(
- address: String,
+ rawAddress: String,
authentication: String
): String? = coroutineScope {
checkInProgress = true
invalidateState()
- val allAddresses = addressSuffixes.map { "$address/$it" } + address
- val pathCheck = allAddresses.map {
- async {
- downloader.headCall(
- url = "$it/index-v1.jar",
+ val allAddresses = addressSuffixes.map { "$rawAddress/$it" } + rawAddress
+ allAddresses
+ .sortedBy { it.length }
+ .forEach { address ->
+ val response = downloader.headCall(
+ url = "$address/index-v1.jar",
headers = { authentication(authentication) }
- ) is NetworkResponse.Success
+ )
+ if (response is NetworkResponse.Success) return@coroutineScope address
}
- }
- val indexOfValidAddress = pathCheck.awaitAll().indexOf(true)
- allAddresses[indexOfValidAddress].nullIfEmpty()
+ null
}
private fun onSaveRepositoryProceedInvalidate(
@@ -431,7 +429,7 @@ class EditRepositoryFragment() : ScreenFragment() {
if (repositoryId == null && changedRepository.enabled) {
binder.sync(changedRepository)
}
- screenActivity.onBackPressedDispatcher.onBackPressed()
+ mainActivity.onBackPressedDispatcher.onBackPressed()
}
} else {
invalidateState()
@@ -470,6 +468,6 @@ class EditRepositoryFragment() : ScreenFragment() {
const val EXTRA_REPOSITORY_ID = "repositoryId"
const val EXTRA_REPOSITORY_ADDRESS = "repositoryAddress"
- val addressSuffixes = listOf("fdroid/repo", "repo")
+ val addressSuffixes = arrayOf("fdroid/repo", "repo")
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoriesFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoriesFragment.kt
index d4000e49..5cacb480 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoriesFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoriesFragment.kt
@@ -15,7 +15,7 @@ import com.looker.droidify.databinding.RecyclerViewWithFabBinding
import com.looker.droidify.service.Connection
import com.looker.droidify.service.SyncService
import com.looker.droidify.ui.ScreenFragment
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.extension.mainActivity
import com.looker.droidify.widget.addDivider
class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
@@ -36,7 +36,7 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
binding.scrollUp.apply {
setIconResource(R.drawable.ic_add)
setText(R.string.add_repository)
- setOnClickListener { screenActivity.navigateAddRepository() }
+ setOnClickListener { mainActivity.navigateAddRepository() }
systemBarsMargin(16.dp)
}
binding.recyclerView.apply {
@@ -44,7 +44,7 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
isMotionEventSplittingEnabled = false
setHasFixedSize(true)
adapter = RepositoriesAdapter(
- navigate = { screenActivity.navigateRepository(it.id) }
+ navigate = { mainActivity.navigateRepository(it.id) }
) { repository, isEnabled ->
repository.enabled != isEnabled &&
syncConnection.binder?.setEnabled(repository, isEnabled) == true
@@ -79,8 +79,8 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext())
- screenActivity.cursorOwner.attach(this, CursorOwner.Request.Repositories)
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.cursorOwner.attach(this, CursorOwner.Request.Repositories)
+ mainActivity.onToolbarCreated(toolbar)
toolbar.title = getString(R.string.repositories)
}
@@ -89,7 +89,7 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
_binding = null
syncConnection.unbind(requireContext())
- screenActivity.cursorOwner.detach(this)
+ mainActivity.cursorOwner.detach(this)
}
override fun onCursorData(request: CursorOwner.Request, cursor: Cursor?) {
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoryFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoryFragment.kt
index 9d8c3ecd..0fe79529 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoryFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/repository/RepositoryFragment.kt
@@ -22,7 +22,7 @@ import com.looker.droidify.databinding.RepositoryPageBinding
import com.looker.droidify.ui.Message
import com.looker.droidify.ui.MessageDialog
import com.looker.droidify.ui.ScreenFragment
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.extension.mainActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@@ -53,7 +53,7 @@ class RepositoryFragment() : ScreenFragment() {
super.onCreateView(inflater, container, savedInstanceState)
_binding = RepositoryPageBinding.inflate(inflater, container, false)
viewModel.bindService(requireContext())
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.onToolbarCreated(toolbar)
toolbar.title = getString(stringRes.repository)
val scroll = NestedScrollView(binding.root.context)
scroll.addView(binding.root)
@@ -149,7 +149,7 @@ class RepositoryFragment() : ScreenFragment() {
}
editRepoButton.setOnClickListener {
- screenActivity.navigateEditRepository(viewModel.id)
+ mainActivity.navigateEditRepository(viewModel.id)
}
deleteRepoButton.setOnClickListener {
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 9f44d849..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
@@ -23,13 +24,11 @@ import androidx.lifecycle.repeatOnLifecycle
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText
-import com.looker.droidify.utility.common.SdkCheck
-import com.looker.droidify.utility.common.extension.getColorFromAttr
-import com.looker.droidify.utility.common.extension.homeAsUp
-import com.looker.droidify.utility.common.extension.systemBarsPadding
-import com.looker.droidify.utility.common.extension.updateAsMutable
-import com.looker.droidify.utility.common.isIgnoreBatteryEnabled
-import com.looker.droidify.utility.common.requestBatteryFreedom
+import com.looker.droidify.BuildConfig
+import com.looker.droidify.R
+import com.looker.droidify.databinding.EnumTypeBinding
+import com.looker.droidify.databinding.SettingsPageBinding
+import com.looker.droidify.databinding.SwitchTypeBinding
import com.looker.droidify.datastore.Settings
import com.looker.droidify.datastore.extension.autoSyncName
import com.looker.droidify.datastore.extension.installerName
@@ -38,22 +37,25 @@ 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.BuildConfig
-import com.looker.droidify.databinding.EnumTypeBinding
-import com.looker.droidify.databinding.SettingsPageBinding
-import com.looker.droidify.databinding.SwitchTypeBinding
+import com.looker.droidify.utility.common.SdkCheck
+import com.looker.droidify.utility.common.extension.getColorFromAttr
+import com.looker.droidify.utility.common.extension.homeAsUp
+import com.looker.droidify.utility.common.extension.systemBarsPadding
+import com.looker.droidify.utility.common.extension.updateAsMutable
+import com.looker.droidify.utility.common.isIgnoreBatteryEnabled
+import com.looker.droidify.utility.common.requestBatteryFreedom
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import java.util.Locale
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 com.looker.droidify.R
+import androidx.core.net.toUri
@AndroidEntryPoint
class SettingsFragment : Fragment() {
@@ -119,9 +121,7 @@ class SettingsFragment : Fragment() {
): View {
_binding = SettingsPageBinding.inflate(inflater, container, false)
binding.nestedScrollView.systemBarsPadding()
- if (requireContext().isIgnoreBatteryEnabled()) {
- viewModel.allowBackground()
- }
+ viewModel.toggleBackgroundAccess(requireContext().isIgnoreBatteryEnabled())
val toolbar = binding.toolbar
toolbar.navigationIcon = toolbar.context.homeAsUp
toolbar.setNavigationOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() }
@@ -233,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 },
@@ -283,6 +333,7 @@ class SettingsFragment : Fragment() {
exportRepos.title.text = getString(R.string.export_repos_title)
exportRepos.content.text = getString(R.string.export_repos_DESC)
+ allowBackgroundWork.root.isVisible = false
allowBackgroundWork.title.text = getString(R.string.require_background_access)
allowBackgroundWork.content.text =
getString(R.string.require_background_access_DESC)
@@ -315,8 +366,8 @@ class SettingsFragment : Fragment() {
launch {
viewModel.settingsFlow.collect { setting ->
updateSettings(setting)
- binding.allowBackgroundWork.root.isVisible = !viewModel.backgroundTask.first()
- && setting.autoSync != AutoSync.NEVER
+ binding.allowBackgroundWork.root.isVisible =
+ !viewModel.isBackgroundAllowed && setting.autoSync != AutoSync.NEVER
}
}
}
@@ -326,9 +377,7 @@ class SettingsFragment : Fragment() {
override fun onResume() {
super.onResume()
- if (requireContext().isIgnoreBatteryEnabled()) {
- viewModel.allowBackground()
- }
+ viewModel.toggleBackgroundAccess(requireContext().isIgnoreBatteryEnabled())
}
override fun onDestroyView() {
@@ -376,9 +425,7 @@ class SettingsFragment : Fragment() {
}
allowBackgroundWork.root.setOnClickListener {
requireContext().requestBatteryFreedom()
- if (requireContext().isIgnoreBatteryEnabled()) {
- viewModel.allowBackground()
- }
+ viewModel.toggleBackgroundAccess(requireContext().isIgnoreBatteryEnabled())
}
creditFoxy.root.setOnClickListener {
openLink(FOXY_DROID_URL)
@@ -395,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 77d81b34..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
@@ -7,35 +7,35 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import com.looker.droidify.R
+import com.looker.droidify.database.Database
+import com.looker.droidify.database.RepositoryExporter
import com.looker.droidify.datastore.Settings
import com.looker.droidify.datastore.SettingsRepository
import com.looker.droidify.datastore.get
import com.looker.droidify.datastore.model.AutoSync
import com.looker.droidify.datastore.model.InstallerType
-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.database.Database
-import com.looker.droidify.database.RepositoryExporter
-import com.looker.droidify.work.CleanUpWorker
import com.looker.droidify.installer.installers.isMagiskGranted
import com.looker.droidify.installer.installers.isShizukuAlive
import com.looker.droidify.installer.installers.isShizukuGranted
import com.looker.droidify.installer.installers.isShizukuInstalled
import com.looker.droidify.installer.installers.requestPermissionListener
+import com.looker.droidify.work.CleanUpWorker
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import java.util.Locale
import javax.inject.Inject
import kotlin.time.Duration
-import com.looker.droidify.R
@HiltViewModel
class SettingsViewModel
@@ -49,8 +49,8 @@ class SettingsViewModel
}
val settingsFlow get() = settingsRepository.data
- private val _backgroundTask = MutableStateFlow(false)
- val backgroundTask = _backgroundTask.asStateFlow()
+ var isBackgroundAllowed = true
+ private set
private val _snackbarStringId = MutableSharedFlow()
val snackbarStringId = _snackbarStringId.asSharedFlow()
@@ -59,10 +59,8 @@ class SettingsViewModel
fun getInitialSetting(block: Settings.() -> T): Flow = initialSetting.map { it.block() }
- fun allowBackground() {
- viewModelScope.launch {
- _backgroundTask.emit(true)
- }
+ fun toggleBackgroundAccess(enable: Boolean) {
+ isBackgroundAllowed = enable
}
fun setLanguage(language: String) {
@@ -172,7 +170,7 @@ class SettingsViewModel
} else if (isShizukuGranted()) {
settingsRepository.setInstallerType(installerType)
} else if (!isShizukuGranted()) {
- if(requestPermissionListener()) {
+ if (requestPermissionListener()) {
settingsRepository.setInstallerType(installerType)
}
}
@@ -194,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/kotlin/com/looker/droidify/ui/tabsFragment/TabsFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsFragment.kt
index ebe8a0f1..8872bf19 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsFragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsFragment.kt
@@ -14,6 +14,7 @@ import android.widget.FrameLayout
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView
+import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -28,24 +29,24 @@ import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
import com.google.android.material.tabs.TabLayoutMediator
+import com.looker.droidify.R
+import com.looker.droidify.databinding.TabsToolbarBinding
+import com.looker.droidify.datastore.model.supportedSortOrders
+import com.looker.droidify.datastore.extension.sortOrderName
+import com.looker.droidify.datastore.model.SortOrder
+import com.looker.droidify.model.ProductItem
+import com.looker.droidify.service.Connection
+import com.looker.droidify.service.SyncService
+import com.looker.droidify.ui.ScreenFragment
+import com.looker.droidify.ui.appList.AppListFragment
import com.looker.droidify.utility.common.device.Huawei
import com.looker.droidify.utility.common.extension.dp
import com.looker.droidify.utility.common.extension.getMutatedIcon
import com.looker.droidify.utility.common.extension.selectableBackground
import com.looker.droidify.utility.common.extension.systemBarsPadding
import com.looker.droidify.utility.common.sdkAbove
-import com.looker.droidify.datastore.extension.sortOrderName
-import com.looker.droidify.datastore.model.SortOrder
-import com.looker.droidify.R
-import com.looker.droidify.databinding.TabsToolbarBinding
-import com.looker.droidify.datastore.model.supportedSortOrders
-import com.looker.droidify.model.ProductItem
-import com.looker.droidify.service.Connection
-import com.looker.droidify.service.SyncService
-import com.looker.droidify.ui.ScreenFragment
-import com.looker.droidify.ui.appList.AppListFragment
import com.looker.droidify.utility.extension.resources.sizeScaled
-import com.looker.droidify.utility.extension.screenActivity
+import com.looker.droidify.utility.extension.mainActivity
import com.looker.droidify.widget.DividerConfiguration
import com.looker.droidify.widget.FocusSearchView
import com.looker.droidify.widget.StableRecyclerAdapter
@@ -152,7 +153,7 @@ class TabsFragment : ScreenFragment() {
}
}
- screenActivity.onToolbarCreated(toolbar)
+ mainActivity.onToolbarCreated(toolbar)
toolbar.title = getString(R.string.application_name)
// Move focus from SearchView to Toolbar
toolbar.isFocusable = true
@@ -204,7 +205,7 @@ class TabsFragment : ScreenFragment() {
syncRepositoriesMenuItem = add(0, 0, 0, stringRes.sync_repositories)
.setIcon(toolbar.context.getMutatedIcon(R.drawable.ic_sync))
.setOnMenuItemClickListener {
- viewModel.sync()
+ syncConnection.binder?.sync(SyncService.SyncRequest.MANUAL)
true
}
@@ -226,19 +227,19 @@ class TabsFragment : ScreenFragment() {
favouritesItem = add(1, 0, 0, stringRes.favourites)
.setIcon(toolbar.context.getMutatedIcon(R.drawable.ic_favourite_checked))
.setOnMenuItemClickListener {
- view.post { screenActivity.navigateFavourites() }
+ view.post { mainActivity.navigateFavourites() }
true
}
add(1, 0, 0, stringRes.repositories)
.setOnMenuItemClickListener {
- view.post { screenActivity.navigateRepositories() }
+ view.post { mainActivity.navigateRepositories() }
true
}
add(1, 0, 0, stringRes.settings)
.setOnMenuItemClickListener {
- view.post { screenActivity.navigatePreferences() }
+ view.post { mainActivity.navigatePreferences() }
true
}
}
@@ -295,6 +296,25 @@ class TabsFragment : ScreenFragment() {
onBackPressedCallback?.isEnabled = it != BackAction.None
}
}
+ launch {
+ SyncService.syncState.collect {
+ when (it) {
+ is SyncService.State.Connecting -> {
+ tabsBinding.syncState.isVisible = true
+ tabsBinding.syncState.isIndeterminate = true
+ }
+
+ SyncService.State.Finish -> {
+ tabsBinding.syncState.isGone = true
+ }
+
+ is SyncService.State.Syncing -> {
+ tabsBinding.syncState.isVisible = true
+ tabsBinding.syncState.setProgressCompat(it.progress, true)
+ }
+ }
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsViewModel.kt b/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsViewModel.kt
index f01e4d9c..606637a7 100644
--- a/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsViewModel.kt
+++ b/app/src/main/kotlin/com/looker/droidify/ui/tabsFragment/TabsViewModel.kt
@@ -3,17 +3,12 @@ package com.looker.droidify.ui.tabsFragment
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.looker.droidify.data.local.dao.IndexDao
-import com.looker.droidify.data.local.model.RepoEntity
-import com.looker.droidify.data.local.model.toRepo
import com.looker.droidify.database.Database
import com.looker.droidify.datastore.SettingsRepository
import com.looker.droidify.datastore.get
import com.looker.droidify.datastore.model.SortOrder
import com.looker.droidify.domain.model.Fingerprint
import com.looker.droidify.model.ProductItem
-import com.looker.droidify.sync.Syncable
-import com.looker.droidify.sync.v2.model.IndexV2
import com.looker.droidify.ui.tabsFragment.TabsFragment.BackAction
import com.looker.droidify.utility.common.extension.asStateFlow
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -68,9 +63,15 @@ class TabsViewModel @Inject constructor(
val backAction = combine(
currentSection,
isSearchActionItemExpanded,
- showSections,
- ::calcBackAction,
- ).asStateFlow(BackAction.None)
+ showSections
+ ) { currentSection, isSearchActionItemExpanded, showSections ->
+ when {
+ currentSection != ProductItem.Section.All -> BackAction.ProductAll
+ isSearchActionItemExpanded -> BackAction.CollapseSearchView
+ showSections -> BackAction.HideSections
+ else -> BackAction.None
+ }
+ }.asStateFlow(BackAction.None)
fun setSection(section: ProductItem.Section) {
savedStateHandle[STATE_SECTION] = section
@@ -82,33 +83,6 @@ class TabsViewModel @Inject constructor(
}
}
- fun sync() {
- viewModelScope.launch {
- val repo = RepoEntity(
- id = 1,
- address = "https://apt.izzysoft.de/fdroid/repo",
- name = mapOf("en-US" to "IzzyOnDroid F-Droid Repo"),
- description = emptyMap(),
- fingerprint = Fingerprint("3BF0D6ABFEAE2F401707B6D966BE743BF0EEE49C2561B9BA39073711F628937A"),
- timestamp = 0L,
- icon = emptyMap(),
- )
- val (_, index) = syncable.sync(
- repo.toRepo(
- locale = "en-US",
- mirrors = emptyList(),
- enabled = true,
- ),
- )
- requireNotNull(index)
- indexDao.insertIndex(
- fingerprint = repo.fingerprint,
- index = index,
- expectedRepoId = repo.id,
- )
- }
- }
-
private fun calcBackAction(
currentSection: ProductItem.Section,
isSearchActionItemExpanded: Boolean,
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/Deeplinks.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/Deeplinks.kt
index f6327c33..4fa07a6b 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/Deeplinks.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/Deeplinks.kt
@@ -12,7 +12,7 @@ private val supportedExternalHosts = arrayOf(
"f-droid.org",
"www.f-droid.org",
"staging.f-droid.org",
- "apt.izzysoft.de"
+ "apt.izzysoft.de",
)
val Intent.deeplinkType: DeeplinkType?
@@ -77,7 +77,7 @@ private inline fun invalidDeeplink(message: String): Nothing = throw InvalidDeep
sealed interface DeeplinkType {
- data class AddRepository(val address: String) : DeeplinkType
+ class AddRepository(val address: String) : DeeplinkType
- data class AppDetail(val packageName: String, val repoAddress: String? = null) : DeeplinkType
+ class AppDetail(val packageName: String, val repoAddress: String? = null) : DeeplinkType
}
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/SdkCheck.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/SdkCheck.kt
index b69e67d0..75d667d8 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/SdkCheck.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/SdkCheck.kt
@@ -33,3 +33,28 @@ object SdkCheck {
@get:ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N)
val isNougat: Boolean get() = sdk >= Build.VERSION_CODES.N
}
+
+val sdkName by lazy {
+ mapOf(
+ 16 to "4.1",
+ 17 to "4.2",
+ 18 to "4.3",
+ 19 to "4.4",
+ 21 to "5.0",
+ 22 to "5.1",
+ 23 to "6",
+ 24 to "7.0",
+ 25 to "7.1",
+ 26 to "8.0",
+ 27 to "8.1",
+ 28 to "9",
+ 29 to "10",
+ 30 to "11",
+ 31 to "12",
+ 32 to "12L",
+ 33 to "13",
+ 34 to "14",
+ 35 to "15",
+ 36 to "16",
+ )
+}
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/cache/Cache.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/cache/Cache.kt
index c3556252..12337530 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/cache/Cache.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/cache/Cache.kt
@@ -46,13 +46,6 @@ object Cache {
}
}
- private fun subPath(dir: File, file: File): String {
- val dirPath = "${dir.path}/"
- val filePath = file.path
- filePath.startsWith(dirPath) || throw RuntimeException()
- return filePath.substring(dirPath.length)
- }
-
fun getEmptySpace(context: Context): Long {
val dir = context.cacheDir
return min(dir.usableSpace, dir.freeSpace)
@@ -187,7 +180,7 @@ object Cache {
projection: Array?,
selection: String?,
selectionArgs: Array?,
- sortOrder: String?
+ sortOrder: String?,
): Cursor {
val file = getFileAndTypeForUri(uri).first
val columns = (projection ?: defaultColumns).mapNotNull {
@@ -217,7 +210,7 @@ object Cache {
uri: Uri,
contentValues: ContentValues?,
selection: String?,
- selectionArgs: Array?
+ selectionArgs: Array?,
): Int = unsupported
override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? {
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Context.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Context.kt
index 1bd318e0..a457d850 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Context.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Context.kt
@@ -5,9 +5,9 @@ import android.app.job.JobScheduler
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
+import android.content.Intent
import android.content.res.ColorStateList
import android.graphics.drawable.Drawable
-import android.net.ConnectivityManager
import android.os.PowerManager
import android.view.inputmethod.InputMethodManager
import androidx.annotation.AttrRes
@@ -15,14 +15,12 @@ import androidx.annotation.DrawableRes
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
+import androidx.core.net.toUri
import com.looker.droidify.R
inline val Context.clipboardManager: ClipboardManager?
get() = getSystemService()
-inline val Context.connectivityManager: ConnectivityManager?
- get() = getSystemService()
-
inline val Context.inputManager: InputMethodManager?
get() = getSystemService()
@@ -39,6 +37,13 @@ fun Context.copyToClipboard(clip: String) {
clipboardManager?.setPrimaryClip(ClipData.newPlainText(null, clip))
}
+fun Context.openLink(url: String) {
+ val intent = intent(Intent.ACTION_VIEW) {
+ setData(url.toUri())
+ }
+ startActivity(intent)
+}
+
val Context.corneredBackground: Drawable
get() = getDrawableCompat(R.drawable.background_border)
@@ -57,6 +62,9 @@ val Context.selectableBackground: Drawable
val Context.camera: Drawable
get() = getDrawableCompat(R.drawable.ic_image)
+val Context.videoPlaceHolder: Drawable
+ get() = getDrawableCompat(R.drawable.ic_video)
+
val Context.aspectRatio: Float
get() = with(resources.displayMetrics) {
(heightPixels / widthPixels).toFloat()
@@ -75,14 +83,21 @@ private fun Context.getDrawableFromAttr(attrResId: Int): Drawable {
}
fun Context.getDrawableCompat(@DrawableRes resId: Int = R.drawable.background_border): Drawable =
- requireNotNull(AppCompatResources.getDrawable(this, resId)) { "Cannot find drawable, ID: $resId" }
+ requireNotNull(
+ AppCompatResources.getDrawable(
+ this,
+ resId
+ )
+ ) { "Cannot find drawable, ID: $resId" }
fun Context.getColorFromAttr(@AttrRes attrResId: Int): ColorStateList {
val typedArray = obtainStyledAttributes(intArrayOf(attrResId))
- val (colorStateList, resId) = try {
- Pair(typedArray.getColorStateList(0), typedArray.getResourceId(0, 0))
+ return try {
+ typedArray.getColorStateList(0) ?: run {
+ val resourceId = typedArray.getResourceId(0, 0)
+ ContextCompat.getColorStateList(this, resourceId)!!
+ }
} finally {
typedArray.recycle()
}
- return colorStateList ?: ContextCompat.getColorStateList(this, resId)!!
}
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Json.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Json.kt
index 66451b09..f2f7dd0b 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Json.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/Json.kt
@@ -1,4 +1,4 @@
-package com.looker.core.common.extension
+package com.looker.droidify.utility.common.extension
import com.fasterxml.jackson.core.JsonFactory
import com.fasterxml.jackson.core.JsonGenerator
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/PackageInfo.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/PackageInfo.kt
index d4a350da..ee2c24ee 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/PackageInfo.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/PackageInfo.kt
@@ -74,7 +74,6 @@ fun PackageManager.getApplicationInfoCompat(
PackageManager.ApplicationInfoFlags.of(0L)
)
} else {
- @Suppress("DEPRECATION")
getApplicationInfo(filePath, 0)
}
@@ -98,7 +97,6 @@ fun PackageManager.getPackageInfoCompat(
PackageManager.PackageInfoFlags.of(signatureFlag.toLong())
)
} else {
- @Suppress("DEPRECATION")
getPackageInfo(packageName, signatureFlag)
}
} catch (e: Exception) {
@@ -131,7 +129,6 @@ fun PackageManager.getPackageArchiveInfoCompat(
PackageManager.PackageInfoFlags.of(signatureFlag.toLong())
)
} else {
- @Suppress("DEPRECATION")
getPackageArchiveInfo(filePath, signatureFlag)
}
} catch (e: Exception) {
@@ -144,7 +141,6 @@ fun PackageManager.getInstalledPackagesCompat(
if (SdkCheck.isTiramisu) {
getInstalledPackages(PackageManager.PackageInfoFlags.of(signatureFlag.toLong()))
} else {
- @Suppress("DEPRECATION")
getInstalledPackages(signatureFlag)
}
} catch (e: Exception) {
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/View.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/View.kt
index 2935c1f4..a32c08fc 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/extension/View.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/extension/View.kt
@@ -1,5 +1,6 @@
package com.looker.droidify.utility.common.extension
+import android.content.Context
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
@@ -7,7 +8,9 @@ import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import coil.request.ImageRequest
+import coil3.network.NetworkHeaders
+import coil3.network.httpHeaders
+import coil3.request.ImageRequest
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
@@ -17,8 +20,13 @@ import kotlinx.coroutines.flow.map
import kotlin.math.min
import kotlin.math.roundToInt
+private val networkHeader by lazy { NetworkHeaders.Builder() }
+
fun ImageRequest.Builder.authentication(base64: String) {
- addHeader("Authorization", base64)
+ if (base64.isNotEmpty()) {
+ networkHeader["Authorization"] = base64
+ httpHeaders(networkHeader.build())
+ }
}
fun TextView.setTextSizeScaled(size: Int) {
@@ -26,6 +34,9 @@ fun TextView.setTextSizeScaled(size: Int) {
setTextSize(TypedValue.COMPLEX_UNIT_PX, realSize.toFloat())
}
+val Context.layoutInflater: LayoutInflater
+ get() = LayoutInflater.from(this)
+
fun ViewGroup.inflate(layoutResId: Int): View {
return LayoutInflater.from(context).inflate(layoutResId, this, false)
}
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/common/signature/HashChecker.kt b/app/src/main/kotlin/com/looker/droidify/utility/common/signature/HashChecker.kt
index 652016d0..538983bc 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/common/signature/HashChecker.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/common/signature/HashChecker.kt
@@ -34,7 +34,7 @@ suspend fun File.calculateHash(hashType: String): String? {
}
private suspend fun MessageDigest.readBytesFrom(
- file: File
+ file: File,
): ByteArray? = withContext(Dispatchers.IO) {
try {
if (file.length() < DIRECT_READ_LIMIT) return@withContext digest(file.readBytes())
@@ -57,16 +57,9 @@ private suspend fun MessageDigest.readBytesFrom(
// 25 MB
private const val DIRECT_READ_LIMIT = 25 * 1024 * 1024
-@Suppress("FunctionName")
data class Hash(
val type: String,
- val hash: String
+ val hash: String,
) {
-
- companion object {
- fun SHA256(hash: String) = Hash(type = "sha256", hash)
- fun MD5(hash: String) = Hash(type = "md5", hash)
- }
-
fun isValid(): Boolean = type.isNotBlank() && hash.isNotBlank()
}
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/extension/Fragment.kt b/app/src/main/kotlin/com/looker/droidify/utility/extension/Fragment.kt
index 371dc526..f62e03ee 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/extension/Fragment.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/extension/Fragment.kt
@@ -3,5 +3,5 @@ package com.looker.droidify.utility.extension
import androidx.fragment.app.Fragment
import com.looker.droidify.MainActivity
-inline val Fragment.screenActivity: MainActivity
+inline val Fragment.mainActivity: MainActivity
get() = requireActivity() as MainActivity
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductItemSerialization.kt b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductItemSerialization.kt
index eb4b47e4..37abbb07 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductItemSerialization.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductItemSerialization.kt
@@ -2,7 +2,7 @@ package com.looker.droidify.utility.serialization
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
-import com.looker.core.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.forEachKey
import com.looker.droidify.model.ProductItem
fun ProductItem.serialize(generator: JsonGenerator) {
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductPreferenceSerialization.kt b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductPreferenceSerialization.kt
index cd7b9086..405d955d 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductPreferenceSerialization.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductPreferenceSerialization.kt
@@ -2,7 +2,7 @@ package com.looker.droidify.utility.serialization
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
-import com.looker.core.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.forEachKey
import com.looker.droidify.model.ProductPreference
fun ProductPreference.serialize(generator: JsonGenerator) {
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductSerialization.kt b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductSerialization.kt
index 33640b96..fbcba6ba 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductSerialization.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ProductSerialization.kt
@@ -3,11 +3,11 @@ package com.looker.droidify.utility.serialization
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
-import com.looker.core.common.extension.collectNotNull
-import com.looker.core.common.extension.collectNotNullStrings
-import com.looker.core.common.extension.forEachKey
-import com.looker.core.common.extension.writeArray
-import com.looker.core.common.extension.writeDictionary
+import com.looker.droidify.utility.common.extension.collectNotNull
+import com.looker.droidify.utility.common.extension.collectNotNullStrings
+import com.looker.droidify.utility.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.writeArray
+import com.looker.droidify.utility.common.extension.writeDictionary
import com.looker.droidify.model.Product
import com.looker.droidify.model.Release
@@ -53,11 +53,6 @@ fun Product.serialize(generator: JsonGenerator) {
writeStringField(ADDRESS, it.address)
}
- is Product.Donate.Flattr -> {
- writeStringField(TYPE, DONATION_FLATTR)
- writeStringField(ID, it.id)
- }
-
is Product.Donate.Liberapay -> {
writeStringField(TYPE, DONATION_LIBERAPAY)
writeStringField(ID, it.id)
@@ -149,7 +144,6 @@ fun JsonParser.product(): Product {
DONATION_EMPTY -> Product.Donate.Regular(url)
DONATION_BITCOIN -> Product.Donate.Bitcoin(address)
DONATION_LITECOIN -> Product.Donate.Litecoin(address)
- DONATION_FLATTR -> Product.Donate.Flattr(id)
DONATION_LIBERAPAY -> Product.Donate.Liberapay(id)
DONATION_OPENCOLLECTIVE -> Product.Donate.OpenCollective(id)
else -> null
@@ -243,6 +237,5 @@ private const val KEY_EMPTY = ""
private const val DONATION_EMPTY = ""
private const val DONATION_BITCOIN = "bitcoin"
private const val DONATION_LITECOIN = "litecoin"
-private const val DONATION_FLATTR = "flattr"
private const val DONATION_LIBERAPAY = "liberapay"
private const val DONATION_OPENCOLLECTIVE = "openCollective"
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ReleaseSerialization.kt b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ReleaseSerialization.kt
index 30ac26a0..f18730eb 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/serialization/ReleaseSerialization.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/serialization/ReleaseSerialization.kt
@@ -3,11 +3,11 @@ package com.looker.droidify.utility.serialization
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
-import com.looker.core.common.extension.collectNotNull
-import com.looker.core.common.extension.collectNotNullStrings
-import com.looker.core.common.extension.forEachKey
-import com.looker.core.common.extension.writeArray
-import com.looker.core.common.extension.writeDictionary
+import com.looker.droidify.utility.common.extension.collectNotNull
+import com.looker.droidify.utility.common.extension.collectNotNullStrings
+import com.looker.droidify.utility.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.writeArray
+import com.looker.droidify.utility.common.extension.writeDictionary
import com.looker.droidify.model.Release
fun Release.serialize(generator: JsonGenerator) {
diff --git a/app/src/main/kotlin/com/looker/droidify/utility/serialization/RepositorySerialization.kt b/app/src/main/kotlin/com/looker/droidify/utility/serialization/RepositorySerialization.kt
index f0bd4ddd..8fde8e50 100644
--- a/app/src/main/kotlin/com/looker/droidify/utility/serialization/RepositorySerialization.kt
+++ b/app/src/main/kotlin/com/looker/droidify/utility/serialization/RepositorySerialization.kt
@@ -2,9 +2,9 @@ package com.looker.droidify.utility.serialization
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
-import com.looker.core.common.extension.collectNotNullStrings
-import com.looker.core.common.extension.forEachKey
-import com.looker.core.common.extension.writeArray
+import com.looker.droidify.utility.common.extension.collectNotNullStrings
+import com.looker.droidify.utility.common.extension.forEachKey
+import com.looker.droidify.utility.common.extension.writeArray
import com.looker.droidify.model.Repository
fun Repository.serialize(generator: JsonGenerator) {
diff --git a/app/src/main/res/color/switch_thumb_tint.xml b/app/src/main/res/color/switch_thumb_tint.xml
deleted file mode 100644
index 2ba4d629..00000000
--- a/app/src/main/res/color/switch_thumb_tint.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/switch_track_tint.xml b/app/src/main/res/color/switch_track_tint.xml
deleted file mode 100644
index a0899857..00000000
--- a/app/src/main/res/color/switch_track_tint.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_donate_flattr.xml b/app/src/main/res/drawable/ic_donate_flattr.xml
deleted file mode 100644
index 62de4a6a..00000000
--- a/app/src/main/res/drawable/ic_donate_flattr.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_gitlab.xml b/app/src/main/res/drawable/ic_gitlab.xml
deleted file mode 100644
index a4089ea0..00000000
--- a/app/src/main/res/drawable/ic_gitlab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_kde.xml b/app/src/main/res/drawable/ic_kde.xml
deleted file mode 100644
index ffd419f3..00000000
--- a/app/src/main/res/drawable/ic_kde.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_video.xml b/app/src/main/res/drawable/ic_video.xml
new file mode 100644
index 00000000..9959ba37
--- /dev/null
+++ b/app/src/main/res/drawable/ic_video.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/app_detail_header.xml b/app/src/main/res/layout/app_detail_header.xml
index 957530c3..1a957be6 100644
--- a/app/src/main/res/layout/app_detail_header.xml
+++ b/app/src/main/res/layout/app_detail_header.xml
@@ -90,7 +90,6 @@
@@ -120,7 +119,6 @@
diff --git a/app/src/main/res/layout/edit_repository.xml b/app/src/main/res/layout/edit_repository.xml
index bd6468fb..fed51e2d 100644
--- a/app/src/main/res/layout/edit_repository.xml
+++ b/app/src/main/res/layout/edit_repository.xml
@@ -10,77 +10,68 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+ android:orientation="vertical"
+ android:paddingHorizontal="12dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="12dp">
-
+ android:hint="@string/address"
+ android:paddingVertical="12dp">
-
+ android:layout_height="match_parent"
+ android:inputType="textNoSuggestions|textVisiblePassword" />
+
-
-
+
-
+ android:layout_height="match_parent" />
+
-
-
+
-
+ android:layout_height="match_parent"
+ android:autofillHints="username" />
+
-
-
+
-
-
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:autofillHints="password"
+ android:inputType="textNoSuggestions|textVisiblePassword" />
+
+
diff --git a/app/src/main/res/layout/enum_type.xml b/app/src/main/res/layout/enum_type.xml
index f7b2651a..ee6dc1c9 100644
--- a/app/src/main/res/layout/enum_type.xml
+++ b/app/src/main/res/layout/enum_type.xml
@@ -19,4 +19,4 @@
android:layout_height="wrap_content"
android:textAppearance="?textAppearanceBodyMedium"
android:textColor="?colorOutline" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/recycler_view_with_fab.xml b/app/src/main/res/layout/recycler_view_with_fab.xml
index 16596c09..c4d7d91d 100644
--- a/app/src/main/res/layout/recycler_view_with_fab.xml
+++ b/app/src/main/res/layout/recycler_view_with_fab.xml
@@ -19,4 +19,4 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:ignore="ContentDescription" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/release_item.xml b/app/src/main/res/layout/release_item.xml
index d9356563..79180b28 100644
--- a/app/src/main/res/layout/release_item.xml
+++ b/app/src/main/res/layout/release_item.xml
@@ -20,7 +20,7 @@
android:orientation="horizontal">
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/repository_page.xml b/app/src/main/res/layout/repository_page.xml
index 64e31e2a..8e668a83 100644
--- a/app/src/main/res/layout/repository_page.xml
+++ b/app/src/main/res/layout/repository_page.xml
@@ -2,7 +2,8 @@
+ android:orientation="vertical"
+ android:paddingBottom="20dp">
-
-
-
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 @@
+
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/layout/video_button.xml b/app/src/main/res/layout/video_button.xml
new file mode 100644
index 00000000..190da49c
--- /dev/null
+++ b/app/src/main/res/layout/video_button.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/app/src/main/res/menu/navigation_menu_main.xml b/app/src/main/res/menu/navigation_menu_main.xml
deleted file mode 100644
index dbce94a9..00000000
--- a/app/src/main/res/menu/navigation_menu_main.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index cc2e82fe..00000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 6f07ca1f..02a29f6d 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -6,17 +6,13 @@
الوصفالحد الأدنى لإصدار واجهة برمجة التطبيقات هو %d.فاتح
- تحريكات القائمةحسنًاليس موقعًا. تعذر التحقق من قائمة التطبيقات. كن حذرًا عند تنزيل التطبيقات من مستودعات غير موقعة.زامن المستودعاتجاري المزامنةغير معروف: %s
- لم يُوقعتحديثات غير مستقرةاعرض أقل
- الأحدث
- استكشففشل الإجراءأضف مستودعًاكل التطبيقات
@@ -90,7 +86,6 @@
رخصة %sتم نسخ الرابطالروابط
- أظهر تحريكات القائمة على الصفحة الرئيسةجاري الدمج %sالاسمخطأ في الشبكة
@@ -135,12 +130,8 @@
يتطلب %sالمستودعاتالمستودع
- هذا المستودع لم يُستخدم بعد. مكنه لعرض التطبيقات التي يحتويها.
- تثبيت صامت
- اسمح لصلاحية الجذر لتمكين التثبيت الصامتاحفظجارٍ حفظ التفاصيل…
- لقطات الشاشةابحثاختر مرآةشارك
@@ -159,12 +150,10 @@
جاري مزامنة %s…النظاماضغط للتثبيت.
- الهدفالسمةالسماتيتعقب أو يرفق نشاطكإلغاء التثبيت
- لم يُتحقق منهحدثالتحديثاتغير معروف
@@ -183,10 +172,6 @@
اللغةالتفضيلاتحدث الكل
- التطبيقات المثبَّتة
- افرز وصفِّ
- التطبيقات الجديدة
- الزمن المار قبل فحص وإزالة الملفات المنزَّلةمدة تنظيف ملفات APKأقل من يوم
@@ -206,9 +191,6 @@
فقط على شبكة واي-فاي وعند الشحنتعذر أداء بعض الإجراءات.
- ليس لديك اتصال بالإنترنت
- اسمح بتوسيع شريط التطبيقات العلوي
- اسمح لشريط التطبيقات العلوي بالتوسع والطيلون النظام ( Material You )استخدم سمة ألوان النظامالمفضَّلات
@@ -216,7 +198,6 @@
افرض التنظيفينظِّف الملفَّات المتكرِّرةمكِّن المستودع
- أعد تشغيل Droid-ify لرؤية التغييراتيثبّتفي انتظار بدء التثبيت…حدِّث التطبيقات تلقائيًّا
@@ -230,7 +211,6 @@
شكر خاصايماءات الشاشة الرئيسةاسمح للمستخدم بالتمرير بين الصفحات في الشاشة الرئيسة
- انسخيجب أن يكون منفذ الوكيل رقمًا صحيحًالم يُعثَر على المستودعاستيراد الإعدادات
@@ -254,4 +234,14 @@
تجاهل التوقيعمساحة غير كافيةلا توجد مساحة خالية كافية على الجهاز لتثبيت هذا التطبيق. حاول إفراغ بعض المساحة
-
\ No newline at end of file
+ إذن Shizuku مفقود
+ لم يتم منح إذن خدمة Shizuku. يُرجى التحقق من تطبيق Shizuku
+ لا يبدو أن Shizuku مثبت
+ افتح Shizuku
+ غير معروف (%d)
+ Shizuku غير مثبت
+ خدمة Shizuku لا تعمل. يُرجى التحقق من تطبيق Shizuku
+ فيديو
+ Shizuku لا يعمل
+ بدّل إلى الافتراضي
+
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 680c91e6..4218135b 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -3,8 +3,6 @@
Yeni qaynaq əlavə etÜnvanBütün applikasiyalar
- Üst çubuğun genişlədilməsinə izn ver
- Üst çubuğun genişləndirilməsinə və sıxılmasına izn verZatən mövcuddurHər zamanAnti-özəlliklər
@@ -20,7 +18,6 @@
Dəyişim günlüyüDəyişikliklərAPK cleanup interval
- Period to check and remove downloaded filesXəta tapmaq üçün kompayl edildiTəsdiqBağlanılır…
@@ -78,8 +75,6 @@
%s lisenziyasıAçıqLinklər
- Siyahı Animasiyaları
- Siyahı canlandırmasını ana səhifədə göstərMaterial YouMaterial you rəng temasını istifadə et%s birləşdirilir
@@ -92,7 +87,6 @@
İstifadə edilə bilən applikasiya yoxdurAçıqlama yoxdur
- İnternet bağlantınız yoxdurProxy yoxdurApplikasiyanın yeni versiyaları haqqında bilgiləndirApplikasiya sayı
@@ -144,16 +138,11 @@
Bu yaxınlarda yeniləndiAnbarlarRepozitoriya
- Bu anbardan hələ istifadə olunmayıb. İçindəki proqramlara baxmaq üçün onu yandırın.İmzasız. Tətbiq siyahısını yoxlamaq mümkün olmadı. İmzasız depolardan proqramları endirərkən diqqətli olun.Repozitoriya əlçatmazdır%s tələb edir
- Dəyişiklikləri görmək üçün Droid-ify-ı yenidən başladın
- Səssiz Quraşdırma
- Səssiz quraşdırmalar üçün kök icazəsinə icazə verinYadda saxlaDetallar yadda saxlanılır…
- Ekran görüntüləriAxtarGüzgü seçinParametrlər
@@ -173,17 +162,14 @@
Sinxronizasiya%s sinxronizasiya edilir…Sistem
- HədəfMövzuMövzularFəaliyyətinizi izləyir və ya hesabat verirNaməlumNaməlum xəta.Naməlum: %s
- İmzasızQeyri-sabit yeniləmələrQeyri-sabit versiyaların quraşdırılmasını təklif edin
- DoğrulanmamışYeniləyinYeniləmələrİstifadəçi adı
@@ -197,16 +183,11 @@
Veb saytDilFərdiləşdirmə
- Ən son
- AraşdırınHamısını yeniləyin
- Quraşdırılmış proqramlar
- Çeşidləyin və Filtr edin
- Yeni tətbiqlərDaha az göstərRepozitoriyaları avtomatik sinxronlaşdırınSilinYuxarı mənbə kodu pulsuz deyilİndeksi doğrulamaq mümkün olmadı.Quraşdırmaq üçün toxunun.
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 149e7951..4f48e768 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -1,14 +1,12 @@
Не атрымалася выканаць дзеянне
- Дазволіць верхняй панэлі праграм пашыраццаНе ўдалося знайсці гэтую праграмуСайт аўтараАўтаабнаўленне праграмДадаць рэпазіторыйАдрасЎсе праграмы
- Дазволіць верхнюю панэль праграмы пашыраць і згортвацьЎжо існуеЗаўсёдыЧорная
@@ -21,7 +19,6 @@
СкасавацьУсе вашыя праграмы абноўленыВыдаліць
- Перыяд для праверкі і выдалення спампаваных файлаўАпісаннеДэталіІдзе загрузка %s…
@@ -80,7 +77,6 @@
ЎсталяваннеВаша платформа %1$s не падтрымліваецца. Падтрымліваюцца платформы: %2$s.Рэпазіторый недаступны
- Перазапусціце Droid-ify, каб убачыць зменыАдсутныя функцыі.Няма даступных праграмПароль адсутнічае
@@ -96,8 +92,6 @@
ІншаеСпасылка скапіяванаАпрацоўваецца %1$s…
- Капіяваць
- У вас няма падключэння да інтэрнэтуПорт проксі можа быць толькі цэлым лікамКолькасць праграмНесумяшчальна з %s
@@ -158,19 +152,15 @@
+%d большНалады імпартуВаш %1$s (версія API %2$d) не падтрымліваецца. %3$s
- Без подпісуЗмяшчае NSFW кантэнтВыберыце люстэрка
- Паказаць анімацыю спісу на галоўнай старонцыСінхранізацыя %s…Імпарт/ЭкспартАдсочвае або паведамляе аб вашай дзейнасціВэб-сайтАб\'яднанне %sЧаканне пачатку загрузкі…
- АглядРэкамендуецца
- Сартаваць і фільтравацьАдкрыць %s?Не ўдалося праверыць індэкс.Shizuku не працуе
@@ -181,14 +171,12 @@
ТэмаSOCKS проксіMaterial You
- МэтавыЧаканне пачатку ўстаноўкі…Падпісана з выкарыстаннем небяспечнага алгарытмуЗыходны кодІмя карыстальнікаВерсія %sСветлая
- Ўсталяваныя праграмыІмпарт налад і абранага з файлаРэпазіторыйПрапанаваць усталёўваць нестабільныя версіі
@@ -196,17 +184,13 @@
ПерсаналізацыяПодпіс %sShizuku устаноўшчык
- Новыя праграмыВыдаліцьПрапусціцьНалады экспартуЭкспарт усіх рэпазіторыяў з файлаІмпарт рэпазіторыяў
- СкрыншотыНядаўна абноўленыПарадак сартавання
- Неправераныя
- Ціхая ўстаноўкаНяправільны фармат адбіткаЗахаванне даных…Што новага
@@ -218,14 +202,12 @@
ПошукНевядомая памылка.Тэмы
- Анімацыя спісаўДазволіць карыстальніку гартаць старонкі на галоўным экранеЭкспарт рэпазіторыяўПаказаць меншНаладыЗыходны код не з\'яўляецца свабоднымВерсіі
- Гэты рэпазіторый яшчэ не выкарыстоўваўся. Вам трэба ўключыць яго для прагляду прымянення ў ім.Імпарт усіх рэпазіторыяў з файлаЯк у сістэмеАсаблівыя падзякі
@@ -233,8 +215,6 @@
Паказаць старыя версііShizuku не ўстаноўленаНестабільнае абнаўленне
- Апошнія
- Падайце root-правы для ўключэння ціхай устаноўкіНевядома: %sНемагчыма адкрыць спасылкуПрывязка да вызначанай сеткавай службы
@@ -246,4 +226,15 @@
Ігнараваць подпісНе ўдалося ўсталяваць %sІгнараванне праверкі подпісу пры ўстаноўцы apk, для карыстальнікаў LSPosed або прасунутых карыстальнікаў
-
\ No newline at end of file
+ Shizuku не працуе
+ Сэрвіс Shizuku не працуе. Калі ласка, праверце праграму Shizuku
+ Shizuku няма дазволу
+ Не дадзены дазвол на сэрвіс Shizuku. Калі ласка, праверце праграму Shizuku
+ Shizuku не ўсталявана
+ Здаецца, Shizuku не ўсталявана
+ Не хапае месца
+ На вашай прыладзе не хапае памяці для ўсталявання гэтай праграмы. Паспрабуйце вызваліць крыху месца
+ Адкрыць Shizuku
+ Пераключыцца на стандартны
+ Відэа
+
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 7bb428e1..2563e496 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -55,7 +55,6 @@
%s лицензСветлаЛинкове
- Анимирай списъка на главната страницаСливане на %sИмеМрежова грешка
@@ -66,7 +65,7 @@
Уведомления за актуализацииБрой приложенияОкей
- Само на Wi-Fi
+ Само при Wi-FiОтвори %s\?ДругиНе може да се прочете индекс файла.
@@ -79,14 +78,10 @@
Наскоро обновениХранилищаХранилище
- Това хранилище все още не е използвано.Включете го, за да видите приложенията в него.Неподписано. Не може да провери списъка с неподписаните приложения. Внимавайте с тегленето на приложения от неподписани хранилища.Изисква %s
- Безшумна Инсталация
- За безшумни инсталации дайте root разрешениеЗапазиЗапазване на подробности…
- Екранни снимкиИзбери източникСподелиПокажи повече
@@ -100,12 +95,10 @@
ПредложеноАвтоматично синхронизиране на хранилищатаСинхронизиране
- ЦелТемаПроследява или отчита вашата дейностНеизвестноНеизвестно: %s
- НепровереноАктуализацияАктуализацииПотребителско име
@@ -114,12 +107,7 @@
В очакване да започне изтеглянето…Какво е новотоПокажи по-малко
- Последни
- РазглежданеИнсталирай всички
- Инсталирани приложения
- Сортиране & Филтриране
- Нови приложенияАнтифункцииУебстраница на автораНе може да се редактират синхронизиращи се хранилища.
@@ -134,7 +122,6 @@
Вашата %1$s (АПИ версия %2$d) се поддържа. %3$sТази версия е по-стара от инсталираната на вашето устройство. Деинсталирайте първо нея.Невалиден формат на потребителското име
- Анимации на списъцитеНестабилни актуализацииТази версия е подписана със сертификат, различен от този, инсталиран на вашето устройство. Деинсталирайте първо нея.Показване на версии, несъвместими с устройството
@@ -170,7 +157,6 @@
Докосни за инсталиране.Неизвестна грешка.Предложи инсталирането на нестабилни версии
- НеподписаноАктуалният програмен код вече не е със свободен лицензПотребителско име липсваНе може да валидира индексът.
@@ -188,24 +174,19 @@
Само при Wi-Fi и зарежданеИнтервал за почистване на APK
- Период за проверка и премахване на изтеглените файловеЧасЧаса
- Нямате интернет връзка
- Разрешете горната лента на приложението да се разшириНевъзможност за извършване на определени действия.
- Разрешете горната лента на приложението да се разширява и свиваИзползвайте material you цветова темаMaterial YouАвтоматично актуализиране на приложенияИнсталиранеОпитайте се да инсталирате актуализации автоматично
- Рестартирайте Droid-ify, за да видите променитеИзчакване за стартиране на инсталацията…Любими
- Активирайте хранилището
+ Активирай хранилищетоПринудително почистванеПочиства излишните файловеХранилището е недостъпно
@@ -215,7 +196,6 @@
Плъзгане на началния екранСъдържа неподходящо за работа съдържаниеShizuku не работи
- КопирайПрокси портът може да бъде само цяло числоПозволете на потребителя да плъзга между страниците в началния екранСледното хранилище не бе намерено
@@ -225,12 +205,12 @@
Внеси НастройкиВнасяне на настройки и любими от файлИзнеси Настройки
- Изнеси всички хранилища във файл
+ Изнасяне на всички хранилища във файлВнеси хранилищаИзнасяне на настройки и любими във файлИзнеси хранилищаЛинкът не може да се отвори
- Внеси всички хранилища от файл
+ Внасяне на всички хранилища от файлОбвързан с определена мрежова услугаИзискване на фонов достъпНеобходим е фонов достъп, за да стартирате правилно фоновото синхронизиране
@@ -242,4 +222,14 @@
*Внимание* Игнорирайте проверката на подписа при инсталиране на APK за LSPosed потребители или напреднали потребителиНедостатъчно мястоНяма достатъчно свободно място на устройството за инсталиране на това приложение. Опитайте да освободите малко място
-
\ No newline at end of file
+ Shizuku Не е инсталиран
+ Видео
+ Превключване към подразбиране
+ Отворете Shizuku
+ Услугата Shizuku не работи. Моля, проверете в приложението Shizuku
+ Липсва разрешение за Shizuku
+ Разрешението за услуга Shizuku не е дадено. Моля, проверете в приложението Shizuku
+ Shizuku изглежда не е инсталиран
+ Shizuku Не работи
+ Неизвестен (%d)
+
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index f93c8f27..e66795b0 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -21,7 +21,6 @@
আগে থেকেই আছেসর্বদাঅন্ধকার
- অ্যাপের টপ বার সম্প্রসারিত হতে দাও%s সত্যায়িত করা সম্ভব হয়নিঅনুদানবর্ণনা
@@ -30,7 +29,6 @@
ঘণ্টাসর্বোচ্চ এপিআই সংস্করণ %d।
- অ্যাপের টপ বার সম্প্রসারিত ও সংকুচিত হতে দাওঅপবৈশিষ্ট্যবিজ্ঞাপন আছেHTTP প্রক্সি
@@ -60,7 +58,6 @@
রিপোজিটরি ডিলিট করতে চান\?রিপোজিটরি সম্পাদনা করুনএই সংস্করণটি অগ্রাহ্য করো
- ডাউনলোড করা নথিগুলো পরীক্ষা এবং অপসারণের সময়কালডিবাগিংয়ের জন্য কম্পাইল করা হয়েছেবাগ ট্র্যাকারএই সংস্করণটি আপনার ডিভাইসে ইনস্টল করা একটি থেকে একটি ভিন্ন শংসাপত্রের সাথে স্বাক্ষরিত৷ প্রথমে এটি আনইনস্টল করুন।
@@ -91,8 +88,6 @@
লাইসেন্স%s লাইসেন্সআলো
- তালিকা অ্যানিমেশন
- প্রধান পৃষ্ঠায় তালিকা অ্যানিমেশন দেখান%s মার্জ করা হচ্ছেউপাদান আপনিসেশন ইনস্টলার
@@ -108,7 +103,6 @@
নতুন সংস্করণ সহ %dটি অ্যাপ্লিকেশন।কোনো ইনস্টল করা অ্যাপ্লিকেশন নেই
- আপনার কোন ইন্টারনেট সংযোগ নেইএই ধরনের কোনো অ্যাপ্লিকেশন খুঁজে পাওয়া যায়নিআবেদনের সংখ্যাস্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন হালনাগাদ
@@ -129,8 +123,6 @@
প্রক্সি পর্টসম্প্রতি আপডেট করা হয়েছেভান্ডার
- এই সংগ্রহস্থল এখনও ব্যবহার করা হয় নি. এটিতে থাকা অ্যাপ্লিকেশনগুলি দেখতে এটি চালু করুন।
- পরিবর্তনগুলি দেখতে Droid-ify পুনরায় চালু করুনপুরানো সংস্করণ দেখান+%d আরোপ্রিয়
@@ -149,10 +141,7 @@
প্রকল্প ওয়েবসাইটরিপোজিটরি পৌঁছানো যায় না%s প্রয়োজন
- নীরব ইনস্টলবিবরণ সংরক্ষণ করা হচ্ছে…
- স্ক্রিনশট
- নীরব ইনস্টলেশনের জন্য রুট অনুমতির অনুমতি দিনসংরক্ষণঅনুসন্ধান করুনএকটি আয়না নির্বাচন করুন
@@ -172,24 +161,18 @@
সিঙ্ক হচ্ছেপদ্ধতিইনস্টল করতে আলতো চাপুন।
- টার্গেটআনইনস্টল করুনঅজানাঅজানা ত্রুটি.অজানা: %s
- স্বাক্ষরবিহীন
- যাচাই করা হয়নিব্যবহারকারীর নামসংস্করণ %sওয়েবসাইটব্যক্তিগতকরণপ্রদর্শন কম
- সর্বশেষ
- বাছাই এবং ফিল্টারসিঙ্ক রিপোজিটরিআপনার কার্যকলাপ ট্র্যাক বা রিপোর্টসংস্করণ
- অন্বেষণ%s সিঙ্ক হচ্ছে…নতুন কিরঙ
@@ -204,12 +187,49 @@
ইনস্টলেশন শুরু করার জন্য অপেক্ষা করা হচ্ছে…আপস্ট্রিম সোর্স কোড বিনামূল্যে নয়সূচক যাচাই করা যায়নি.
- ইনস্টল করা অ্যাপ্লিকেশনহালনাগাদডাউনলোড শুরু করার জন্য অপেক্ষা করা হচ্ছে…ভাষা
- নতুন অ্যাপ্লিকেশনলিংকটি ওপেন করা সম্ভব হয়নিইম্পোর্ট/এক্সপোর্টসেটিংস ইম্পোর্ট করুন
-
\ No newline at end of file
+ অপসারিত
+ বিশেষ কৃতজ্ঞতাস্বীকার
+ শিজুকু সেবার অনুমতি দেওয়া হয়নি। শিজুকু অ্যাপটি দেখো
+ *সতর্কতা* এপিকে ইন্সটলে সময় স্বাক্ষর যাচাইকরণ এড়াও, এলএসপোজড ব্যবহারকারী বা অগ্রগামী ব্যবহারকারীর জন্য
+ নিষিদ্ধ বিষয়বস্ত বিদ্যমান
+ ভিডিও
+ পছন্দসমূহ রপ্তানি করো
+ অপর্যাপ্ত জায়গা
+ শিজুকু চলছে না
+ শিজুকু চলছে না। অনুগ্রহ করে শিজুকু অ্যাপ দেখো
+ সব ভাণ্ডার ফাইলে রপ্তানি
+ ব্যবহারকারীকে মূলপাতাসমূহের মধ্যে টান দেওয়া অনুমোদন করো
+ সার্ভারে যুক্ত হতে ব্যর্থ
+ শিজুকু ইন্সটল করা নেই
+ ইন্সটল ব্যর্থ
+ %s ইন্সটল করতে ব্যর্থ
+ স্বাক্ষর উপেক্ষা করো
+ শিজুকু চলছে না
+ শিজুকু অনুমতি নেই
+ শিজুকু ইন্সটল করা হয়নি
+ শিজুকু মনে হচ্ছে না ইন্সটল করা
+ পছন্দসমূহ ফাইল থেকে আমদানি করো
+ পছন্দসমূহ ফাইলে রপ্তানি করো
+ ভাণ্ডার আমদানি করো
+ ফাইল থেকে সব ভাণ্ডার আমদানি করো
+ ভাণ্ডার রপ্তানি
+ অমুক্ত অংশ আছে
+ একটি নির্দিষ্ট নেটওয়ার্ক সেবার সাথে আবদ্ধ
+ মূলপাতা টান দেওয়া(সোয়াইপিং)
+ সার্ভার নতুন প্যাকেট সরবরাহে ব্যর্থ।
+ %s অপসারিত হয়েছে
+ এই অ্যাপটি ইন্সটল করার জন্য পর্যাপ্ত জায়গা নেই। কিছু জায়গা পরিষ্কারের চেষ্টা করো
+ শিজুকু খুলো
+ প্রক্সি পোর্ট শুধু পূর্ণ ধনাত্মক সংখ্যা হতে পারে
+ পটভূমিতে চলার অনুমতি প্রয়োজন
+ পটভূমি অনুমোদন প্রয়োজন পটভূমি সিঙ্কের জন্য
+ এই ভাণ্ডারগুলো পাওয়া যায়নি
+ সহজাতে পরিবর্তন করো
+ অজানা (%d)
+
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 662945cf..634a16b2 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -16,7 +16,6 @@
CanvisComprovant repositori…Interval de neteja de l\'APK
- Període per comprovar i eliminar els fitxers descarregatsCompilat per a depuracióConfirmacióConnectant…
@@ -87,11 +86,8 @@
Recentment actualitzatRepositorisRepositori
- Aquest repositori no ha estat utilitzat tot i així. Gira\'l damunt per veure les aplicacions en ell.Sense signar. No podria verificar la llista d\'aplicació. Ser prudent descarregar aplicacions des de repositoris sense signar.Requereix %s
- Silenciós Instal·lar
- Permet permís d\'arrel per silenciós instal·laSalvaRecercaSelecciona un mirall
@@ -112,10 +108,8 @@
DesconegutError desconegut.Desconegut: %s
- Sense signarActualitzacions inestablesSuggereix instal·lant versions inestables
- Sense verificarActualitzacióActualitzacionsEl codi font no és lliure
@@ -129,12 +123,7 @@
LlenguaPersonalitzacióMostrar menys
- Més recent
- ExploraActualitzar tot
- Aplicacions instal·lades
- Ordenar i filtrar
- Aplicacions novesEmpremta digitalEl vostre %1$s el programa no és recolzat. Programes recolzats: %2$s.Totes les aplicacions
@@ -165,17 +154,14 @@
%s llicènciaCap proxyEl nexe va copiar a portapapers
- ObjectiuLlicènciaTemaNul username formatExecutaLlumNexes
- Animacions de llistaMidaAplicacions instal·lades no
- L\'espectacle llista animació en la pàgina majorFusionant %sError de xarxaVersions noves de les aplicacions disponibles
@@ -188,15 +174,11 @@
Cap descripció disponibleMostra una notificació quan les versions noves són disponiblesSalvant detalls…
- Captures de pantallaNo podria trobar qualsevol tals aplicacionsNotifica sobre versions noves d\'aplicacionsMostrar versions més vellesSuggeritSincronitzant
- No teniu cap connexió a Internet
- Permet que la barra d\'aplicacions superior s\'expandeixi i es col·lapsi
- Permet que la barra d\'aplicacions superior s\'expandeixiNo es pot realitzar determinades accions.Actualització automàtica d\'aplicacionsIntenta instal·lar les actualitzacions automàticament
@@ -208,7 +190,6 @@
Neteja els fitxers redundantsHabiliteu el repositoriS\'està esperant per iniciar la instal·lació…
- Reinicieu Droid-ify per veure els canvisInstal·lacióImporta configuració i preferits des de fitxerEnllaçat a un determinat servei de xarxa
@@ -222,4 +203,4 @@
Exporta els repositorisExporta tots els repositoris a un fitxerLliscar la pantalla d\'inici
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml
new file mode 100644
index 00000000..0395c8be
--- /dev/null
+++ b/app/src/main/res/values-ckb/strings.xml
@@ -0,0 +1,8 @@
+
+
+ کردارەکە شکستیهێنا
+ ڕەش
+ تاریک
+ ناونیشان
+ هەمووکات
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index b3e7e46f..07a1d446 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -78,8 +78,6 @@
Licence%s licenceOdkazy
- List Animací
- Zobrazit animaci listu na hlavní stránceSlučování %sNázevChyba sítě
@@ -110,14 +108,10 @@
Propaguje ne-svobodný softwarePoskytuje %sProxy
- Tento zdroj zatím použit. Zapněte jej pro zobrazení aplikací na něm.Nepodepsáno. Nezdařilo se ověřit seznam aplikací. Buďte opatrní při stahování aplikací z nepodepsaných zdrojů.Vyžaduje %s
- Tichá instalace
- Povolit root oprávnění pro tiché instalaceUložitUkládám detaily…
- Snímky obrazovkyHledatSdíletZobrazit více
@@ -137,7 +131,6 @@
Synchronizuji %s…SystémKlikněte pro instalaci.
- CílTémaTémataSleduje nebo hlásí vaší aktivitu
@@ -145,9 +138,7 @@
NeznáméNeznámá chyba.Neznámé: %s
- NepodepsánoNestabilní aktualizace
- NeověřenoAktualizovatAktualizaceOriginální zdrojový kód není svobodný
@@ -163,12 +154,7 @@
JazykPersonalizaceZobrazit méně
- Nejnovější
- ProzkoumatAktualizovat vše
- Instalované aplikace
- Třídit & Filtrovat
- Nové aplikaceAkce se nezdařilaVšechny aplikaceČerná
@@ -194,12 +180,8 @@
hodinInterval čištění APK
- Období pro kontrolu a odstranění stažených souborůPouze na Wi-Fi a při nabíjeníNepodařilo se vykonat některé akce.
- Nejste připojeni k internetu
- Povolení rozšíření horního panelu aplikací
- Povolení rozbalování a sbalování horního panelu aplikacePoužít barevný motiv Material YouMaterial YouOblíbené
@@ -207,7 +189,6 @@
Vynutit vyčištěníRepozitář nedostupnýPovolit repozitář
- Pro zobrazení změn restartujte Droid-ifyČekání na spuštění instalace…InstalaceAutomatická aktualizace aplikací
@@ -221,7 +202,6 @@
Speciální poděkováníPosouvání na domovské stránceUmožnit uživateli posouvat mezi stránkami na domovské stránce
- KopírovatNásledující repozitář nebyl nalezenPort proxy smí být pouze celé čísloImportovat nastavení
@@ -245,4 +225,14 @@
OdinstalovánoNedostatek místaNa zařízení není dostatek místa k instalaci této aplikace. Zkuste uvolnit trochu místa
-
\ No newline at end of file
+ Shizuku není spuštěno
+ Chybějící oprávnění Shizuku
+ Nebylo uděleno oprávnění ke službě Shizuku. Zkontrolujte prosím aplikaci Shizuku
+ Aplikace Shizuku nejspíše není nainstalována
+ Přepnout na výchozí
+ Neznámé (%d)
+ Služba Shizuku není spuštěna. Zkontrolujte prosím aplikaci Shizuku
+ Shizuku není nainstalováno
+ Video
+ Otevřít Shizuku
+
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 55c1b965..ed487b7a 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -14,8 +14,6 @@
AnnullerTilføj repositoryAdresse
- Lad øverste app-linje udvide sig
- Lad øverste app-linje udvide og skjule sigAnti-funktionerUdviklerens e-mailUdviklerens hjemmeside
@@ -24,7 +22,6 @@
ÆndringslogÆndringerAPK-oprydningsinterval
- Periodisk kontrol og fjernelse af hentede filerBekræftelseForbinder…Indeholder ikke-frie medier
@@ -42,10 +39,10 @@
Hentet %sHenterHenter %s…
- Import/Eksport
- Importér Indstillinger
+ Import/eksport
+ Importér indstillingerImportér indstillinger og favoritter fra fil
- Eksportér Indstillinger
+ Eksportér indstillingerFavoritterUgyldigt filformat.Fingeraftryk
@@ -63,8 +60,8 @@
Kunne ikke forbinde til serverIgnorer alle nye versionerDin %1$s (API-version %2$d) understøttes ikke. %3$s
- Maksimal API-version er %d.
- Minimum API-version er %d.
+ Maks. API-version er %d.
+ Min. API-version er %d.Manglende funktioner.Denne version er ældre end den, der er installeret på din enhed. Afinstaller den først.Inkompatibel version
@@ -74,7 +71,7 @@
InstallerInstallationstyperInstallatør
- Shizuku Installatør
+ Shizuku-installatørShizuku kører ikkeShizuku er ikke installeretInstallerer
@@ -83,19 +80,17 @@
Ugyldigt fingeraftryksformatUgyldigt brugernavnsformatKan ikke udføre visse handlinger.
- KopiérStartLicens%s licensLysLink kopieretLinks
- Listeanimationer
- Strygning på Startskærm
+ Strygning på startsideServer kunne ikke levere ny pakke.HTTP-proxyDin %1$s platform understøttes ikke. Understøttede platforme: %2$s.
- Root Installatør
+ Root-installatørMaterial YouBrug Material You-farvetemaFletter %s
@@ -110,7 +105,6 @@
Ingen tilgængelige applikationerIngen installerede applikationerIngen beskrivelse tilgængelig
- Du har ingen internetforbindelseKunne ikke finde sådanne applikationerIngen proxyUnderret om opdateringer
@@ -119,10 +113,10 @@
OKKun kompatibel med %sKun på Wi-Fi
- Kun på Wi-Fi & Opladning
+ Kun på Wi-Fi og opladningÅbn %s?Andet
- Kunne ikke analysere indeksfilen.
+ Kunne ikke fortolke indeksfilen.AdgangskodeManglende adgangskode+%d mere
@@ -136,10 +130,8 @@
Proxyport kan kun være et heltalProxytypeKræver %s
- Genstart Droid-ify for at se ændringerGemGemmer detaljer…
- SkærmbillederIndstillingerDelSigneret med en usikker algoritme
@@ -153,26 +145,20 @@
TemaerSporer eller rapporterer din aktivitetRepositories
- Dette repository er ikke blevet brugt endnu. Slå det til for at se applikationer i den.Følgende repository blev ikke fundetUsigneret. Kunne ikke verificere applikationslisten. Vær forsigtig med at hente applikationer fra usignerede repositories.Repository utilgængeligt
- Stille Installation
- Tillad root for stille installationerVælg et mirrorSOCKS-proxySynkroniser repositoriesSynkroniser repositories automatisk
- MålRepositoryAfinstallerUkendtUkendt fejl.Ukendt: %s
- UsigneretUstabile opdateringerForeslå at installere ustabile versioner
- Ikke verificeretDen oprindelige kildekode er ikke gratisBrugernavnManglende brugernavn
@@ -187,18 +173,13 @@
SprogPersonaliseringVis mindre
- Seneste
- UdforskOpdater alle
- Installerede applikationer
- Sortér & Filtrér
- Nye applikationerOpdateringerDonérEksportér indstillinger og favoritter til filHar ikke-frie komponenterBundet til en bestemt netværkstjeneste
- Tillad at stryge mellem sider på startskærm
+ Tillad at stryge mellem sider på startsideIgnorer denne versionDenne version er signeret med et andet certifikat end den, der er installeret på din enhed. Afinstaller den først.Installeret
@@ -220,26 +201,35 @@
Kompileret til fejlfindingSlet repositoriet?Rediger repository
- Importér Repositories
+ Importér repositoriesImportér alle repositories fra fil
- Eksportér Repositories
+ Eksportér repositoriesEksportér alle repositories til filAktivér repositorietKrediteringerOpdatering
- Vis listeanimation på hovedsidenBaggrundsadgang er nødvendig for at køre baggrundssynkronisering korrekt
- Kræver Baggrundsadgang
- Ældre Installatør
- Session Installatør
+ Kræver baggrundsadgang
+ Ældre installatør
+ SessionsinstallatørSærlige KrediteringerIndeholder potentielt stødende indhold
- *Advarsel* Ignorer signaturverifikation ved APK-installation; for LSPosed- eller avancerede brugere
- Installation Mislykkedes
+ *Advarsel* Ignorer signaturverifikation ved APK-installation. For LSPosed- eller avancerede brugere
+ Installation mislykkedesKunne ikke installere %sAfinstalleret%s blev afinstalleret
- Ignorer Signatur
+ Ignorer signaturUtilstrækkelig pladsEnheden har ikke nok ledig plads til at installere denne applikation. Prøv at frigøre noget plads
-
\ No newline at end of file
+ Shizuku-tjenesten kører ikke. Tjek venligst i Shizuku-appen
+ Shizuku-tilladelse mangler
+ Shizuku-tilladelse er ikke givet. Tjek venligst i Shizuku-appen
+ Shizuku ikke installeret
+ Shizuku ser ikke ud til at være installeret
+ Åbn Shizuku
+ Ukendt (%d)
+ Skift til standard
+ Video
+ Shizuku kører ikke
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 6aa87274..88ab8dcb 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,26 +1,26 @@
- Repository hinzufügen
- Alle Anwendungen
- All deine Anwendungen sind aktuell
+ Paketquelle hinzufügen
+ Alle Apps
+ Alle Apps sind aktuellBereits vorhandenImmerAdresseVorgang fehlgeschlagenSchwarz
- Anwendung
+ AppUnerwünschte MerkmaleEntdeckenAbbrechen
- Diese Anwendung konnte nicht gefunden werden
+ App konnte nicht gefunden werdenFehlerverwaltungÄnderungsprotokollDie Paketquelle kann nicht bearbeitet werden, da sie gerade synchronisiert wird.
- Paketquelle wird abgefragt …
+ Paketquelle wird abgefragt …Kompiliert für die Fehlersuche
- Verbinde …
+ Wird verbunden …Bestätigung
- Konnte %s nicht validieren
+ %s konnte nicht überprüft werdenDunkelEnthält nicht-freie MedienMitwirkende
@@ -37,146 +37,132 @@
Fehlende Funktionen.Deine %1$s-Plattform wird nicht unterstützt. Unterstützte Plattformen: %2$s.Installiert
- Mit dem Gerät inkompatible Anwendungsversionen anzeigen
- Installationstypen
+ Mit diesem Gerät inkompatible App-Versionen anzeigen
+ InstallationsartenInstallierenIntegrität konnte nicht überprüft werden.Ungültige Metadaten.Ungültige Signatur.ÖffnenHell
- Listenanimation auf der Hauptseite anzeigen
- Neue Anwendungsversionen verfügbar
+ Neue Versionen von Apps verfügbarNieNetzwerkfehler
- Über neue Versionen benachrichtigen
+ Update-BenachrichtigungenKeine Beschreibung vorhanden
- Keine derartigen Anwendungen konnten gefunden werden
- Keine installierten Anwendungen
- Nur bei Wi-Fi
- Öffne %s\?
+ Keine derartigen Apps auffindbar
+ Keine installierten Apps
+ Nur mit WLAN
+ %s öffnen?Andere
- Anzahl der Anwendungen
+ Anzahl der AppsOKBerechtigungen+%d mehrEinstellungen
- Verarbeitung %1$s …
- Bewirbt unfreie Software
+ %1$s wird verarbeitet …
+ Bewirbt nicht-freie SoftwareProxyPaketquellenBenötigt %s
- Stumme InstallationSpeichernDetails werden gespeichert …
- BildschirmfotosÜberspringenEmpfohlenSynchronisierung
- Themen
- Ziel
+ DesignsUnbekannt
- Deinstallation
- Unsigniert
+ DeinstallierenAktualisierungVersionVersionen
- Was gibt es Neues
- Warten auf den Downloadbeginn …
- Der Index konnte nicht validiert werden.
- Webseite
+ Neu hinzugefügt
+ Warten auf den Start des Downloads …
+ Der Index konnte nicht überprüft werden.
+ WebsiteÄnderungen
- Autor-E-Mail-Adresse
- Konnte %s nicht herunterladen
- Autor-Webseite
+ E-Mail-Adresse
+ %s konnte nicht heruntergeladen werden
+ WebsiteLöschen
- Zuletzt aktualisiert
+ Kürzlich aktualisiertLizenz
- Konnte %s nicht synchronisieren
+ %s konnte nicht synchronisiert werdenNur kompatibel mit %s%s-LizenzLink kopiert
- Projekt-Website
- Proxy Typ
+ Website des Projekts
+ Proxy-ArtPaketquelleDie Indexdatei konnte nicht geparst werden.Passwort
- Eine Benachrichtigung anzeigen, wenn neue Versionen verfügbar sind
+ Benachrichtigung anzeigen, wenn neue Versionen verfügbar sindBereitgestellt von %sQuellcode nicht mehr verfügbar
- Ungültiges Benutzernamen-Format
+ Ungültiges Format des BenutzernamensKein ProxyPasswort fehltQuellcodePaketquellen synchronisierenPaketquellen automatisch synchronisieren
- Diese Paketquelle wurde noch nicht verwendet. Aktivieren Sie es, um die darin enthaltenen Anwendungen anzuzeigen.Signatur %sEnthält nicht-freie AbhängigkeitenInkompatible VersionSystem
- Thema
+ DesignAlle neuen Versionen ignorierenDiese Version ignorierenGröße
- Aktualisierungen
+ UpdatesBenutzernameVersion %s
- Herunterladen
+ Wird heruntergeladen …Teilen
- Zeige mehr
- Ältere Versionen zeigen
- Ungeprüft
+ Mehr anzeigen
+ Ältere Versionen anzeigenBenutzername fehltPaketquelle bearbeitenUngültiges Dateiformat.
- %s wird heruntergeladen …
+ %s wird heruntergeladen …Inkompatibel mit %sInkompatible VersionenUngültige AdresseUngültiges FingerabdruckformatUngültige Berechtigungen.
- Bewirbt unfreie Netzwerkdienste
+ Bewirbt nicht-freie NetzwerkdiensteUnbekannt: %sUnbekannter Fehler.
- Synchronisierung %s …
- Diese Version ist mit einem anderen Zertifikat signiert, als die auf Deinem Gerät installierte. Deinstalliere diese zuerst.
- Die Paketquelle löschen\?
- Diese Version ist älter als die auf deinem Gerät installierte. Deinstalliere diese zuerst.
+ %s wird synchronisiert …
+ Diese Version ist mit einem anderen Zertifikat signiert als die auf deinem Gerät installierte Version. Deinstalliere diese zuerst.
+ Paketquelle löschen?
+ Diese Version ist älter als diejenige, die auf deinem Gerät installiert ist. Deinstalliere diese zuerst.Deine %1$s (API-Version %2$d) wird nicht unterstützt. %3$sDie minimale API-Version ist %d.
- Nicht signiert. Die Anwendungsliste konnte nicht verifiziert werden. Sei vorsichtig beim Herunterladen von Anwendungen aus nicht signierten Paketquellen.
+ Nicht signiert. Die App-Liste konnte nicht verifiziert werden. Sei beim Herunterladen von Apps aus nicht signierten Paketquellen vorsichtig.Installation von instabilen Versionen vorschlagen
- Instabile Aktualisierungen
- Root-Rechte für stille Installationen zulassen
- Proxy Host
- Tippe um zu installieren.
- Verfolgt oder erfasst deine Aktivitäten
- Proxy Port
- Suche
+ Instabile Updates
+ Proxy-Host
+ Zum Installieren tippen.
+ Verfolgt oder versendet deine Aktivitäten
+ Proxy-Port
+ SuchenSortierreihenfolge
- SOCKS Proxy
- Keine Anwendungen verfügbar
+ SOCKS-Proxy
+ Keine Apps verfügbar
- %d Anwendung hat eine neue Version.
- %d Anwendungen haben eine neue Version.
+ %d App hat eine neue Version.
+ %d Apps haben eine neue Version.Mit einem unsicheren Algorithmus signiertWähle einen Spiegel
- Animationen anzeigenLinks
- Führe %s zusammen
+ %s wird zusammengeführt …NameDer Upstream-Quellcode ist nicht freiSprache
- Personalisierung
+ PersonalisierenWeniger anzeigen
- Neueste
- EntdeckenAlle aktualisieren
- Installierte Anwendungen
- Sortieren und filtern
- Neue AnwendungenTagTage
@@ -185,61 +171,65 @@
StundeStunden
- Nur während des Ladevorgangs und aktiviertem WLAN
+ Nur mit WLAN während des AufladensInstallationsmethode
- Zeitraum zum Prüfen und Entfernen heruntergeladener DateienAPK-BereinigungsintervallRoot-InstallationAlte Installationsmethode
- Sitzungs-Installation
+ SitzungsinstallationShizuku-InstallationBestimmte Aktionen können nicht durchgeführt werden.
- Sie haben keine Internetverbindung
- Erweiterung der oberen Anwendungsleiste zulassen
- Das Erweitern und Reduzieren der oberen Anwendungsleiste erlaubenFavoritenMaterial YouMaterial You-Farbschema verwenden
- Repository unerreichbar
- Aufräumen erzwingen
- Repository aktivieren
+ Paketquelle unerreichbar
+ Bereinigung erzwingen
+ Paketquelle aktivierenEntfernt doppelte Dateien
- Installation
- Starten Sie Droid-ify neu, um die Änderungen zu sehen
- Warten auf den Beginn der Installation …
+ Wird installiert …
+ Warten auf den Start der Installation …Apps automatisch aktualisieren
- Versuche, Updates automatisch zu installieren
- Hat nicht-freie Komponenten
+ Updates möglichst automatisch installieren
+ Enthält nicht-freie KomponentenServer konnte kein neues Datenpaket liefern.Shizuku läuft nichtEnthält für den Arbeitsplatz unangemessene InhalteVerbindung zum Server nicht möglichShizuku ist nicht installiertWischgesten
- Dem Benutzer erlauben, auf dem Startbildschirm zwischen den Seiten zu wischen
+ Durch Wischen nach links/rechts zwischen Seiten navigierenBesonderer Dank
- KopierenProxy-Port muss eine natürliche Zahl sein
- Folgende Repos konnten nicht gefunden werden
+ Folgende Paketquelle konnten nicht gefunden werdenEinstellungen importierenImportieren/Exportieren
- Importiere Einstellung und Favoriten von Datei
+ Einstellungen und Favoriten aus Datei importierenEinstellungen exportieren
- Alle Repositories in eine Datei exportieren
- Importiere eine Sammlung
+ Paketquellen in eine Datei exportieren
+ Paketquellen importierenEinstellungen und Favoriten in eine Datei exportieren
- Repositories exportieren
- Alle Repositories aus einer Datei importieren
+ Paketquellen exportieren
+ Paketquellen aus einer Datei importierenLink kann nicht geöffnet werdenAn einen bestimmten Netzwerkdienst gebundenSignatur ignorieren
- *Achtung* Signaturüberprüfung bei der Installation der APK ignorieren. Für LSPosed-Benutzer oder Experten.
+ *Achtung* Signaturüberprüfung bei der Installation der APK ignorieren. Für LSPosed-Benutzer oder ExpertenInstallation fehlgeschlagen%s wurde deinstalliert%s konnte nicht installiert werdenDeinstalliertHintergrundzugriff anfordernHintergrundzugriff ist erforderlich, um die Hintergrundsynchronisation ordnungsgemäß durchzuführen
- Nicht genug Speicherplatz
- Es gibt nicht genug Speicherplatz, um diese Anwendung zu installieren. Versuche etwas Platz zu schafffen.
-
\ No newline at end of file
+ Nicht genügend Speicherplatz
+ Nicht genügend Speicherplatz, um diese App zu installieren. Versuche, etwas Platz zu schaffen
+ Shizuku-Erlaubnis fehlt
+ Erlaubnis für den Shizuku-Dienst ist nicht gewährt. Bitte in der Shizuku-App prüfen
+ Shizuku nicht installiert
+ Shizuku scheint nicht installiert zu sein
+ Auf Standard wechseln
+ Shizuku öffnen
+ Shizuku läuft nicht
+ Der Shizuku-Dienst läuft nicht. Bitte in der Shizuku-App prüfen
+ Video
+ Unbekannt (%d)
+
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index acb32265..94f7af70 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -64,8 +64,6 @@
ΦωτεινόΟ σύνδεσμος αντιγράφηκεΣύνδεσμοι
- Κινήσεις Λίστας
- Εμφάνιση κινήσεων λίστας στην αρχική σελίδαΣυγχώνευση %sΌνομαΣφάλμα δικτύου
@@ -107,10 +105,8 @@
ΑποθετήριοΜη υπογεγραμμένο. Αδυναμία επαλήθευσης της λίστας εφαρμογών. Προσέχετε όταν κατεβάζετε εφαρμογές από μη υπογεγραμμένα αποθετήρια.Απαιτεί %s
- Σιωπηλή ΕγκατάστασηΑποθήκευσηΑποθήκευση λεπτομερειών…
- Στιγμιότυπα οθόνηςΑναζήτησηΕπιλέξτε ένα mirrorΚοινοποίηση
@@ -139,11 +135,8 @@
Πρόταση για εγκατάσταση ασταθών εκδόσεωνΕνημέρωσηΕνημερώσεις
- Μη υπογεγραμμένο
- Μη επιβεβαιωμένοΔιαγραφήΠρόσφατα ενημερωμένα
- ΣτόχοςΤι νέο υπάρχειUpstream source code is not freeΌνομα χρήστη
@@ -161,28 +154,20 @@
Αυτή η έκδοση είναι υπογεγραμμένη με ένα διαφορετικό πιστοποιητικό από αυτή που είναι εγκατεστημένη στη συσκευή σας. Απεγκαταστήστε εκείνη πρώτα.Αδυναμία ελέγχου ακεραιότητας.Μη έγκυρη υπογραφή.
- Αυτό το αποθετήριο δεν έχει χρησιμοποιηθεί ακόμα. Χρειάζεται να το ενεργοποιήσετε για να δείτε τις εφαρμογές που παρέχει.Έχει υπογραφεί χρησιμοποιώντας έναν μη ασφαλή αλγόριθμοSOCKS διακομιστής μεσολάβησηςΚαταγράφει ή αναφέρει τη δραστηριότητά σαςΑδυναμία επαλήθευσης δείκτη.
- Επιτρέψτε την άδεια root για σιωπηλή εγκατάστασηAmoledΕξατομίκευσηΓλώσσα
- Πρόσφατα
- Ταξινόμηση & Φιλτράρισμα
- Εγκατεστημένες εφαρμογέςΠρόγραμμα ΕγκατάστασηςΠαλιό πρόγραμμα ΕγκατάστασηςΠρόγραμμα Εκατάστασης ΣυνεδρίαςΠρόγραμμα Εγκατάστασης RootΠρόγραμμα Εγκατάστασης ShizukuΕμφάνιση Λιγότερων
- ΕξερεύνησηΕνημέρωση όλων
- Νέες εφαρμογές
- Period to check and remove downloaded filesAPK cleanup intervalΗμέρα
@@ -194,9 +179,6 @@
Μόνο σε Wi-Fi και ΦόρτισηΔεν είναι δυνατή η εκτέλεση ορισμένων ενεργειών.
- Δεν έχετε σύνδεση στο διαδίκτυο
- Να επιτρέπεται η Επέκταση της Γραμμής Κορυφαίων Εφαρμογών
- Να επιτρέπεται η επέκταση και σύμπτυξη της επάνω γραμμής εφαρμογώνΧρησιμοποιήστε material you με θέμα το χρώμα σαςMaterial YouΑγαπημένα
@@ -204,7 +186,6 @@
Αναγκαστική εκκαθάρισηΚαθαρίζει τα περιττά αρχείαΕνεργοποιήστε το αποθετήριο
- Επανεκκινήστε το Droid-ify για να δείτε αλλαγέςΕγκατάστασηΑναμονή για έναρξη εγκατάστασης…Αυτόματη ενημέρωση εφαρμογών
@@ -218,7 +199,6 @@
Το Shizuku δεν είναι εγκατεστημένοΣύρσιμο Αρχικής ΟθόνηςΕπιτρέψτε στον χρήστη να συρθεί μεταξύ σελίδων στην αρχική οθόνη
- ΑντιγραφήΤο παρακάτω αποθετήριο δεν βρέθηκεΗ θύρα Proxy μπορεί να είναι μόνο ΑκέραιοςΕισαγωγή Ρυθμίσεων
@@ -240,4 +220,16 @@
Το %s απεγκαταστάθηκεΑγνόησή ΥπογραφήςΑγνοήστε την επαλήθευση υπογραφής κατά την εγκατάσταση apk, για χρήστες με LSP ή προχωρημένους χρήστες
-
\ No newline at end of file
+ Η άδεια λειτουργίας της υπηρεσίας Shizuku δεν έχει παραχωρηθεί. Ελέγξτε την εφαρμογή Shizuku
+ Το Shizuku δεν έχει εγκατασταθεί
+ Άνοιγμα Shizuku
+ Άγνωστο (%d)
+ Βίντεο
+ Μετάβαση στην Προεπιλογή
+ Ανεπαρκής Χώρος
+ Το Shizuku δεν φαίνεται να είναι εγκατεστημένο
+ Δεν είναι σε λειτουργία το Shizuku
+ Η υπηρεσία Shizuku δεν λειτουργεί. Ελέγξτε την εφαρμογή Shizuku
+ Λείπει η άδεια Shizuku
+ Δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή για την εγκατάσταση αυτής της εφαρμογής. Προσπαθήστε να ελευθερώσετε και να καθαρίσετε λίγο χώρο
+
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index a2ac0979..64e84b0b 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -29,14 +29,12 @@
Via %1$s (API-versio %2$d) ne estas subtenata. %3$sNur sur Wi-FiPasvorto
- NesubskribitaIntervalo de purigado de APKNesubskribita. Ne eblis kontroli la aplikliston. Atentu elŝutante aplikaĵojn el nesubskribitaj deponejoj.Enhavas enhavon ne taŭgan por laboroElekti spegulonHavas neliberajn komponantojnPromocias ne-liberajn retservojn
- Montri listanimacion sur la ĉefpaĝoSinkroniganta %s…FavoratojSpuras aŭ raportas vian agadon
@@ -49,11 +47,9 @@
Atendante komenci elŝuton…Provi instali ĝisdatigojn aŭtomateElŝutanta
- EsploriMontri sciigon kiam novaj versioj estas disponeblaSugestitaPermesoj
- Ordigi ⳤ FiltriĈu malfermi %s\?Indekso ne povis esti validigita.Novaj versioj de aplikaĵoj disponeblaj
@@ -70,7 +66,6 @@
InstalanteVia %1$s platformo ne estas subtenata. Subtenataj platformoj: %2$s.Deponejo neatingebla
- Rekomenci Droid-ify por vidi ŝanĝojnUzantnomo mankasKonektanta…Ĝisdatigi
@@ -83,7 +78,6 @@
Pasvorto mankasPriskriboMaterial You
- CeloAtendante komenci instaladon…InstalitaNomo
@@ -94,7 +88,6 @@
Versio %sHelaĈiuj aplikaĵoj
- Instalitaj aplikaĵojProkura havenoPostulas %sForigi
@@ -112,10 +105,7 @@
Ligilo kopiitaPrilaboranta %1$s…Shizuku Instalilo
- Novaj aplikaĵoj
- KopiiMalinstali
- Vi ne havas interretan konektonPreterpasiElŝutis %sNe povas redakti deponejon ĉar ĝi nun sinkronigas.
@@ -125,7 +115,6 @@
ReteraroLicencoAŭtomate ĝisdatigi aplikaĵoj
- EkrankopiojLastatempe ĝisdatigitaJam ekzistasAŭtora retejo
@@ -133,12 +122,10 @@
Redakti deponejonOrdo de ordigoIgnori ĉi tiun version
- NekontrolitaHTTP prokuriloAplikaĵoĈiamAdreso
- Silenta InstaloNeniu priskribo disponeblaNevalida fingrospura formatoKonservanta detalojn…
@@ -163,7 +150,6 @@
SerĉiNekonata eraro.Haŭtoj
- Enlistigi AnimaciojNevalida dosierformato.%d aplikaĵo havas novan version.
@@ -176,15 +162,12 @@
Projekto retejoDonaciAldoni deponejo
- Permesi al Supra Aplika Breto EtendiNe eblis validigi %sEsploriMontri MalpliNeniamNe povis trovi tiajn aplikaĵojnLa minimuma API-versio estas %d.
- Permesi al supra aplika breto etendi kaj maletendi
- Periodo por kontroli kaj forigi elŝutitajn dosierojnAgordojNevalida adresoLa kontraŭflua fontkodo ne estas libera
@@ -193,7 +176,6 @@
Kontrolanta deponejon…VersiojLa maksimuma API-versio estas %d.
- Ĉi tiu deponejo ankoraŭ ne estis uzata. Ŝaltu ĝin por vidi la aplikaĵojn en ĝi.Ne eblis analizi la indeksan dosieron.InstaliSistemo
@@ -215,10 +197,8 @@
Ne eblis kontroli integrecon.Ne eblis trovi tiun aplikaĵonProkurilo
- Plej lastaKreditojDeponejoj
- Permesi radikan permeson por silenta instaloKompilita por sencimigadoNekonata: %sImporti Agordojn
@@ -240,4 +220,4 @@
Ligita al certa retservoPostuli fonan alironFona aliro estas bezonata por ĝuste fari fonan sinkronigon
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9c76e075..cc8b34b0 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -74,8 +74,6 @@
ClaroEnlace copiadoEnlaces
- Animaciones de la lista
- Mostrar la animación de la lista en la página principalUniendo %sNombreError de red
@@ -112,14 +110,10 @@
Actualizado recientementeRepositoriosRepositorio
- Este repositorio no se ha utilizado todavía. Actívalo para ver las aplicaciones que contiene.Sin firmar. No se ha podido verificar la lista de aplicaciones. Ten cuidado al descargar aplicaciones de repositorios no firmados.Requiere %s
- Instalación silenciosa
- Conceder permiso root para las instalaciones silenciosasGuardarGuardando detalles…
- Capturas de pantallaBuscarSelecciona un espejoCompartir
@@ -140,7 +134,6 @@
Sincronizando %s…SistemaPulse para instalar.
- ObjetivoTemaTemasRastrea o informa de tu actividad
@@ -148,10 +141,8 @@
DesconocidoError desconocido.Desconocido: %s
- No firmadoActualizaciones inestablesSugerir la instalación de versiones inestables
- No verificadoActualizarActualizacionesEl código fuente no es libre
@@ -172,19 +163,13 @@
IdiomaPersonalizaciónMostrar menos
- Lo más reciente
- Explorar
- Aplicaciones instaladas
- Ordenar y filtrarActualizar todo
- Nuevas aplicacionesInstalador rootInstaladorInstalador de sesiónInstalador heredadoInstalador de ShizukuIntervalo de limpieza de APKs
- Periodo para comprobar y eliminar los archivos descargadosDíaDías
@@ -197,9 +182,6 @@
Solo en Wi-Fi y cargandoNo se pueden realizar ciertas acciones.
- No hay conexión a internet
- Permitir que la barra superior de la aplicación se expanda
- Permitir que la barra superior de la aplicación se expanda y se contraigaUtiliza el tema de color Material YouMaterial YouFavoritas
@@ -208,7 +190,6 @@
Limpiar archivos redundantesHabilitar el repositorioInstalando
- Reinicia Droid-ify para ver los cambiosEsperando para iniciar la instalación…Actualizar automáticamente las aplicacionesIntentar instalar actualizaciones automáticamente
@@ -221,7 +202,6 @@
Gracias aDeslizamiento por la pantalla de inicioPermitir al usuario pasar de una página a otra en la pantalla de inicio
- CopiarNo pudimos encontrar el siguiente repositorioEl puerto del proxy sólo puede ser un número enteroImportar configuración
@@ -245,4 +225,14 @@
DesinstaladaEspacio insuficienteNo hay suficiente espacio libre en el dispositivo para instalar esta aplicación. Intente liberar algo de espacio
-
\ No newline at end of file
+ No se permitió el permiso del servicio de Shizuku. Por favor revisa la app de Shizuku
+ Shizuku no está ejecutando
+ El servicio de Shizuku no está corriendo. Por favor revisa la app de Shizuku
+ Falta permiso de Shizuku
+ Shizuku no está instalado
+ Al parecer Shizuku no está instalado
+ Abrir Shizuku
+ Cambiar a Predeterminado
+ Video
+ Desconocido (%d)
+
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000..a8592564
--- /dev/null
+++ b/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,235 @@
+
+
+ Linki ei saa avada
+ Ürita värskendusi automaatselt paigaldada
+ Lisa hoidla
+ Aadress
+ Kõik rakendused
+ Juba olemas
+ Alati
+ Must
+ Anti-omadused
+ Rakendus
+ Autori e-post
+ Autori veebileht
+ Uuenda rakendusi automaatselt
+ Avasta
+ Veajälgija
+ Tühista
+ Hoidlat ei saa redigeerida, kuna seda sünkroonitakse praegu.
+ Muudatuste logi
+ Muudatused
+ Hoidla kontrollimine…
+ APK puhastamise intervall
+ Kinnitus
+ Sisaldab mittevaba meediat
+ %s allalaadimine nurjus
+ %s sünkroonimine nurjus
+ Tänud
+ Tume
+ Kustuta
+ Kirjeldus
+ Üksikasjad
+ Anneta
+ Allalaadimine
+ %s laeti alla
+ Redigeeri hoidlat
+ Shizuku ei tööta
+ Shizuku teenus ei tööta. Palun kontrolli Shizuku rakendust
+ Shizuku luba puudub
+ Shizuku pole paigaldatud
+ Impordi/ekspordi
+ Impordi seaded
+ Impordi seaded ja lemmikud failist
+ Ekspordi seaded
+ Impordi kõik hoidlad failist
+ Ekspordi hoidlad
+ Ekspordi kõik hoidlad faili
+ Luba hoidla
+ Lemmikud
+ Sõrmejälg
+ Sundpuhastus
+ Puhastab üleliigsed failid
+ Sisaldab reklaami
+ Omab mittevabu sõltuvusi
+ Omab mittevabu komponente
+ Omab turvaauke
+ Seotud teatud võrguteenusega
+ Avakuval nipsamine
+ Luba kasutajal avakuval nipsates lehti vahetada
+
+ tund
+ tundi
+
+ Serveriga ei õnnestunud ühendust luua
+ HTTP puhverserver
+ Suurim API versioon on %d.
+ Puuduvad funktsioonid.
+ See versioon on vanem kui seadmesse paigaldatud versioon. Esmalt eemalda see.
+ Ühildumatu versioon
+ Toiming nurjus
+ Kõik rakendused on ajakohased
+
+ päev
+ päeva
+
+ Seda rakendust ei leitud
+ Shizuku teenusele pole luba antud. Palun kontrolli Shizuku rakendust
+ Kompileeritud silumiseks
+ %s valideerimine nurjus
+ Ühendamine…
+ Serveril ei õnnestunud uut paketti pakkuda.
+ Ühildumatud versioonid
+ Kas kustutada hoidla?
+ Impordi hoidlad
+ %s allalaadimine…
+ Sinu %1$s (API versioon %2$d) ei ole toetatud. %3$s
+ Paistab, et Shizuku pole paigaldatud
+ Ekspordi seaded ja lemmikud faili
+ Kehtetu failivorming.
+ Väikseim API versioon on %d.
+ Sinu %1$s platvormi ei toetata. Toetatud platvormid: %2$s.
+ Eira kõiki uusi versioone
+ Eira seda versiooni
+ Vigane serveri vastus.
+ See versioon on allkirjastatud erineva sertifikaadiga kui seadmesse paigaldatu. Esmalt eemalda see.
+ Eemaldatud
+ Terviklikkust ei saanud kontrollida.
+ Vigane aadress
+ Vigased metaandmed.
+ Vigased load.
+ Vigane allkiri.
+ Teatud toiminguid ei saa teha.
+ Käivita
+ Litsents
+ %s litsents
+ Hele
+ Kasuta Material You värviskeemi
+ Ühendatakse %s
+ Nimi
+ Saadaval on rakenduste uued versioonid
+
+ %d uuendus saadaval.
+ %d uuendust saadaval.
+
+ Saadaolevaid rakendusi pole
+ Puhverserverita
+ Teavita uuendustest
+ Kuva märguanne, kui uued versioonid on saadaval
+ Rakenduste arv
+ OK
+ Ühildub ainult %s
+ Ainult WiFi võrgus
+ Kas avada %s?
+ Muud
+ Parool
+ Load
+ Projekti veebileht
+ Reklaamib mittevabu võrguteenuseid
+ Pakub %s
+ Puhverserveri masin
+ Puhverserveri tüüp
+ Hoidla
+ Järgnevat hoidlat ei leitud
+ Hoidla on kättesaamatu
+ Nõuab %s
+ Küsi taustal töötamise luba
+ Taustal sünkroonimise õnnestumiseks tuleb lubada taustal töötamine
+ Salvesta
+ Üksikasjade salvestamine…
+ Seaded
+ Jaga
+ Näita rohkem
+ Allkiri %s
+ Allkirjastatud kasutades ebaturvalist algoritmi
+ Jäta vahele
+ Eriline tänu
+ Soovitatud
+ Sünkrooni hoidlad
+ %s sünkroonimine…
+ Süsteem
+ Puuduta paigaldamiseks.
+ Jälgib või teatab sinu tegevusest
+ Eira allkirja
+ Paigaldatud rakendusi pole
+ Võrgu viga
+ Lingid
+ Mitte kunagi
+ %s paigaldamine nurjus
+ %s eemaldati
+ Vigane sõrmejäljevorming
+ Vigane kasutajanime vorming
+ Link kopeeriti
+ Material You
+ Ava Shizuku
+ Selliseid rakendusi ei leitud
+ Hiljuti värskendatud
+ Kirjeldus puudub
+ Ainult WiFi võrgus laadimise ajal
+ +%d veel
+ Reklaamib mittevaba tarkvara
+ Puhverserveri port saab olla ainult täisarv
+ Kuva vanemad versioonid
+ Teemad
+ Indeksfaili ei saanud sõeluda.
+ Puhverserveri port
+ Hoidlad
+ Parool puudub
+ Puhverserver
+ Sorteerimisjärjekord
+ Allkirjata. Rakenduste loendit ei saanud kinnitada. Ole ettevaatlik rakenduste allalaadimisel allkirjastamata hoidlatest.
+ Suurus
+ Lähtekood pole enam saadaval
+ Lülitu vaikeseadele
+ Sünkroonimine
+ Eemalda
+ Tundmatu viga.
+ Paku ebastabiilsete versioonide paigaldamist
+ Tundmatu
+ Tundmatu: %s
+ Ebastabiilsed uuendused
+ %1$s töötlemine…
+ Otsi
+ Vali peegel
+ SOCKS puhverserver
+ Lähtekood
+ Sünkrooni hoidlad automaatselt
+ Teema
+ Kuva seadmega mitteühilduvaid rakenduste versioone
+ Ei ühildu rakendusega %s
+ Paigalda
+ Paigalduse tüübid
+ Paigaldaja
+ Ruumi napib
+ Vana paigaldaja
+ Seansi paigaldaja
+ Shizuku paigaldaja
+ Root-paigaldaja
+ Shizuku ei tööta
+ Shizuku pole paigaldatud
+ Paigaldatud
+ Paigaldamine
+ Paigaldamine nurjus
+ *Hoiatus* LSPosed-kasutajate või edasijõudnud kasutajate puhul eira APK paigaldamisel allkirja kontrollimist
+ Uuendus
+ Algne lähtekood ei ole vaba
+ Kasutajanimi
+ Kasutajanimi puudub
+ Indeksit ei saadud kinnitada.
+ Versioon
+ Versioon %s
+ Versioonid
+ Paigaldamise alustamise ootel…
+ Mis on uut
+ Veebileht
+ Uuenda kõik
+ Video
+ Tundmatu (%d)
+ Näita vähem
+ Kohandamine
+ Sisaldab NSFW sisu
+ Seadmes pole selle rakenduse paigaldamiseks piisavalt vaba ruumi. Proovi ruumi vabastada
+ Allalaadimise alustamise ootel…
+ Keel
+ Uuendused
+
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 703828da..a9c20919 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -50,7 +50,6 @@
فراداده نادرست.دسترسیهای نادرست.پیوندها
- نمایش لیست انیمیشن در صفحهاصلیادغام %sنامخطای شبکه
@@ -63,19 +62,16 @@
دیگرفایل ایندکس قابل تحلیل نیست.باز کردن %s ؟
- این مخزن هنوز استفاده نشده. فعالش کنید تا کارههای داخلش را ببینید.ناشناسپاک کردنمنتظر شروع بارگیری…نسخههاوقفه پاکسازی APK
- دوره بررسی و پاک سازی داده های دریافت شدهدارای حفرههای امنیتیپاسخ نادرست از مرکز.نسخههای ناسازگارناسازگاری با %sامضای نادرست.
- لیست انیمیشنهاهیچ کارهای فراهم نیستهیچ کارهای نصب نیستتعداد کارهها
@@ -85,7 +81,6 @@
%d+ بیشترتنظیماتدرحالپردازش %1$s …
- اجازه دسترسی روت برای نصب بدونپرسشامضاء %sبا الگوریتم ناامن امضاء شدهحجم
@@ -103,10 +98,7 @@
زبانشخصیسازینمایش کمتر
- آخرین
- اکتشافبهروزرسانی همه
- ترتیب و فیلترنصاب روتنصابنصاب قدیمی
@@ -126,8 +118,6 @@
مخازنمخزننیازمند %s
- نصب بدونپرسش
- اسکرینشاتهاجستجواز کجا دریافت کنمهمرسانی
@@ -135,15 +125,12 @@
درحالذخیره جزییات…نمایش بیشترنمایش نسخههای قدیمی
- هدفپوستهپوستههارهگیری یا گزارش فعالیت شماخطای ناشناخته.ناشناخته: %s
- امضاءنشدهبهروزرسانی های ناپایدار
- تایید نشدهنامکاربریایندکس قابل تایید شدن نیست.چه خبر
@@ -188,20 +175,14 @@
پیشنهاد نصب نسخههای آزمایشیکد منبع دیگر موجود نیستدر حال بهروزرسانی %s …
- کارههای نصب شدهبهروزرسانی ها
- کارههای جدیدنسخهنسخه %s
- شما هیچ اتصال اینترنتی نداریدقادر به انجام برخی اقدامات خاص نیست.
- به نوار بالای کاره اجازه دهید تا گسترش یابد
- به نوار بالای کاره اجازه دهید تا گسترده و فشرده شودMaterial Youاز پوسته رنگی material you استفاده کنیدمخزن را فعال کنیدپاکسازی اجباری
- برای مشاهده تغییرات، Droid-ify را مجددا راه اندازی کنیدموارد دلخواهمخزن قابل دسترسی نیستبهروز رسانی خودکار کارهها
@@ -230,7 +211,6 @@
سرور در فراهم کردن بسته اطلاعات جدید ناموفق بوداتصال به سرور ناموفق بودحرکات صفحه اصلی
- کپیتشکر ویژهنیازمند دسترسی پسزمینهبرای همگامسازی در پسزمینه، دسترسی پسزمینه لازم است
@@ -241,4 +221,16 @@
هنگام نصب APK ، برای کاربران Lsposed یا کاربران پیشرفته ، تأیید امضا نادیده گرفته شودنصب %s ناموفق بودفضای کافی برای نصب این برنامه روی دستگاه وجود ندارد. سعی کنید مقداری فضا خالی کنید.
-
\ No newline at end of file
+ هدف: اندروید %s
+ دسترسی شیزوکو داده نشده
+ خدمت شیزوکو اجرا نمیشود. لطفا برنامه شیزوکو را بررسی کنید
+ شیزوکو اجرا نمیشود
+ مجوز خدمت شیزوکو داده نشده. لطفا برنامه شیزوکو را بررسی کنید
+ شیزوکو نصب نشده
+ به نظر میرسد شیزوکو نصب نشده
+ فضای ناکافی
+ بازکردن شیزوکو
+ جابهجایی به عادی
+ ویدیو
+ ناشناخته (%d)
+
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index e37c7f79..942a1faa 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -72,8 +72,6 @@
VaaleaLinkki kopioituLinkit
- Luettelon animaatiot
- Näytä luettelon animaatio pääsivullaYhdistetään %sNimiVerkkovirhe
@@ -95,11 +93,8 @@
OhjelmavarastotOhjelmavarastoVaatii %s
- Hiljainen asennus
- Salli pääkäyttäjän oikeudet hiljaisiin asennuksiinTallennaTallennetaan tietoja…
- KuvakaappauksetVain Wi-Fi verkossaAvaa %s\?Muut
@@ -127,9 +122,7 @@
TuntematonTuntematon virhe.Tuntematon: %s
- AllekirjoittamatonEpävakaat päivitykset
- VahvistamatonAlkuperäinen lähdekoodi ei ole vapaaVerkkosivustoMitä uutta
@@ -151,13 +144,11 @@
Synkronoidaan %s…TeematTeema
- KohdeNapauta asentaaksesi.JärjestelmäPäivitysPäivityksetEdistää ei-vapaita ohjelmia
- Tätä ohjelmavarastoa ei ole vielä käytetty. Ota se käyttöön nähdäksesi siinä olevat sovellukset.VälityspalvelinAllekirjoittamaton. Sovellusluetteloa ei voitu tarkistaa. Ole varovainen ladatessasi sovelluksia allekirjoittamattomista arkistoista.Versio %s
@@ -171,19 +162,13 @@
MukauttaminenKieliNäytä vähemmän
- Uusimmat
- TutustuPäivitä kaikki
- Asennetut sovellukset
- Uudet sovellukset
- Lajittele ja suodataAsentajaVanha asentajaSessioasentajaRoot-asentajaShizuku-asentajaAPK:n puhdistusväli
- Aika ladattujen tiedostojen tarkistamiseen ja poistamiseenPäiväPäivää
@@ -194,9 +179,6 @@
Vain Wi-Fi verkossa latauksessa ollessaTiettyjä toimia ei voida suorittaa.
- Salli yläosan sovelluspalkin laajeneminen
- Salli yläosan sovelluspalkin laajentua ja tiivistyä
- Ei internet yhteyttäSuosikitMaterial YouKäytä Material You -väriteemaa
@@ -205,7 +187,6 @@
Puhdistaa tarpeettomat tiedostotOhjelmavarasto ei ole tavoitettavissaAsentaa
- Käynnistä Droid-ify uudelleen nähdäksesi muutoksetOdotetaan asennuksen aloittamista…Päivitä sovelluksia automaattisestiYritä asentaa päivitykset automaattisesti
@@ -215,7 +196,6 @@
Shizuku ei ole käynnissäPalvelimeen ei saatu yhteyttäPalvelin ei pystynyt toimittamaan uutta pakettia.
- KopioiVälityspalvelimen portti voi olla vain kokonaislukuSalli käyttäjän pyyhkäistä sivujen välillä aloitusnäytössäSeuraavaa ohjelmavarastoa ei löytynyt
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 3d6add8f..d8a0e214 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -61,7 +61,6 @@
Code sourceTailleIgnorer
- Captures d’écranChercherSélectionnez un miroirPartager
@@ -81,7 +80,6 @@
Site internetMettre à jourMises à jour
- Non vérifiéInconnu : %sErreur inconnue.Ajouter un dépôt
@@ -98,7 +96,6 @@
DésinstallerImpossible de valider %sSystème
- CibleMot de passe manquantCréditsThèmes
@@ -116,7 +113,6 @@
Fonctionnalités manquantes.Cette version est plus ancienne que celle qui est installée sur votre appareil. Désinstallez-la d’abord.Afficher une notification quand de nouvelles versions sont disponibles
- Ce dépôt n’a pas encore été utilisé. Activez-le pour voir les applications qu’il contient.Aucune application installéeNon signé. Impossible de vérifier la liste d’applis. Soyez prudents lorsque vous téléchargez des applis de dépôts non signés.Dépend d’applications qui ne sont pas libres
@@ -143,8 +139,6 @@
Adresse du proxyPort du proxyType de proxy
- Installation silencieuse
- Autoriser la permission de l’utilisateur root pour les installations silencieusesAfficher les versions plus anciennesSignature %sSigné avec un algorithme qui n’est pas sécurisé
@@ -152,7 +146,6 @@
Synchroniser les dépôts automatiquementSynchronisation en coursSynchronisation de %s en cours…
- Non-signéMises à jour instablesLe code source n’est pas entièrement libreNom d’utilisateur
@@ -161,30 +154,22 @@
Votre %1$s (API version %2$d) n’est pas pris en charge. %3$sImpossible de vérifier l’intégrité.Format d’empreinte digitale non valide
- Animations de listesTraitement de %1$s…Impossible d’analyser le fichier d’index.Fusionner %s
- Afficher l’animation de la liste sur la page principaleOrdre de triRequiert %sSuggérer l’installation de versions instablesLanguePersonnalisationAfficher moins
- Le plus récent
- Trier et filtrer
- Nouvelles applications
- ExplorerTout mettre à jour
- Applications installéesInstallateur de sessionInstallateur héritéInstallateurInstallateur racineInstallateur ShizukuIntervalle de nettoyage des APK
- Période de vérification et de suppression des fichiers téléchargésJourJours
@@ -197,9 +182,6 @@
Uniquement sur Wi-Fi et chargeImpossible d’effectuer certaines actions.
- Vous n’avez pas de connexion internet
- Autoriser l\'expansion et la réduction de la barre supérieure de l\'appli
- Autoriser l\'expansion de la barre supérieure de l\'appliUtiliser le thème couleur Material YouMaterial YouFavoris
@@ -208,7 +190,6 @@
Nettoyer les fichiers redondantsActiver le dépôtInstallation
- Redémarrez Droid-ify pour voir les changementsEn attente du démarrage de l\'installation…Mise à jour automatique des applisEssayez d\'installer les mises à jour automatiquement
@@ -221,7 +202,6 @@
Crédits spéciauxBalayage de l\'écran d\'accueilPermettre à l\'utilisateur de passer d\'une page à l\'autre dans l\'écran d\'accueil
- CopierLe dépôt suivant n\'a pas été trouvéLe port proxy ne peut être qu\'un entierImporter les paramètres
@@ -245,4 +225,14 @@
*Attention* Ignorer la vérification de la signature lors de l\'installation de l\'APK, pour les utilisateurs de LSPosed ou les utilisateurs avancésEspace insuffisantIl n\'y a pas assez d\'espace libre sur l\'appareil pour installer cette application. Essayez de libérer de l\'espace
-
\ No newline at end of file
+ Le service Shizuku n\'est pas démarré. Merci de le vérifier dans l\'appli Shizuku
+ Shizuku Non Démarré
+ Permission Shizuku Manquante
+ La permission du service Shizuku n\'est pas accordée. Merci de la vérifier via l\'appli Shizuku
+ Shizuku Non Installé
+ Shizuku ne semble pas être installé
+ Ouvrir Shizuku
+ Vidéo
+ Inconnu (%d)
+ Rétablir par défaut
+
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 04af4dfa..8f29c8f1 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -13,7 +13,6 @@
CambiosComprobando o repositorio…APK cleanup interval
- Period to check and remove downloaded filesCompilado para a depuraciónConfirmaciónConectando…
@@ -38,8 +37,6 @@
ClaroA ligazón copiouse no portapapeisLigazóns
- Lista de animacións
- Mostra a animación da lista na páxina principalFusionando %sNomeErro na rede
@@ -74,9 +71,7 @@
Actualizado recentementeRepositoriosRepositorio
- Este repositorio aínda non se utilizou. Accéndeo para ver as aplicacións nel.Require %s
- Capturas de pantallaProcurarSeleccione un espelloCompartir
@@ -91,7 +86,6 @@
Sincronizar repositorios automaticamenteSincronizaciónSistema
- ObxectivoTemaTemasRastrexa ou informa da túa actividade
@@ -100,7 +94,6 @@
Erro descoñecido.Descoñecido: %sActualizacións inestables
- Sen verificarActualizarActualizaciónsO código fonte non é ceibe
@@ -114,12 +107,7 @@
LinguaPersonalizaciónMostrar menos
- Derradeiro
- ExploraActualiza todo
- Aplicacións instaladas
- Ordear e filtrar
- Novas aplicaciónsTodas as aplicaciónsNegroXa existe
@@ -178,8 +166,6 @@
Só con wifiSó con wifi e cargaProxy
- Instalación silenciosa
- Permitir permiso de root para instalacións silenciosasSen asinar. Non se puido verificar a lista de solicitudes. Teña coidado ao descargar aplicacións desde repositorios sen asinar.GardarOrde de clasificación
@@ -189,14 +175,10 @@
Mostrar versións antigasCódigo fontePreme para instalar.
- Sen asinarSuxire instalar versións inestablesNon se puido validar o índice.VersiónNon se poden realizar determinadas accións.
- Non tes conexión a internet
- Permitir ca barra das aplicacións superior se amplíe
- Permitir cas barras das aplicacións superior se amplíe e contraigaMaterial YouUsalo material que coloree o temaFavoritas
@@ -205,7 +187,6 @@
Forzala limpezaActivalo repositorioInstalando
- Reinicia Droid-ify para velos cambiosAgardando para iniciala instalación…Actualizacións automática das aplicaciónsTenta instalar actualizacións automaticamente
@@ -213,4 +194,4 @@
Importación/exportaciónImportalos axustes e favoritos dende un fixeiroNon se pode abrir a ligazón
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index f53908b4..7e4833cd 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -62,10 +62,7 @@
अनुचित संस्करणकेवल वाई-फ़ाई पर%s को खोले\?
- इस रिपॉजिटरी का अभी तक उपयोग नहीं किया गया है। इसमें एप्लिकेशन देखने के लिए इसे चालू करें।सहेजें
- साइलेंट इंस्टाल के लिए रूट अनुमति दें
- स्क्रीनशॉटब्यौरा सहेजा जा रहा है…छोड़ेंसिंक्रनाइज़ किए जा रहे
@@ -80,7 +77,6 @@
पर्सनलाइजेशनभाषाकम दिखाएं
- नए एप्लीकेशंसइंस्टालरलीगेसी इंस्टालरसत्र इंस्टॉलर
@@ -97,8 +93,6 @@
%s लाइसेंसहल्कीलिंक कॉपी किया गया
- एनिमेशन की सूची दिखाए
- मुख्य पृष्ठ पर एनीमेशन की सूची दिखाएं%s . को मर्ज कर रहा हैनामनेटवर्क त्रुटि
@@ -150,13 +144,11 @@
सुझावसिंक रिपॉजिटरीरिपोजिटरी स्वचालित रूप से सिंक्रनाइज़ करें
- लक्ष्यथीमस्थापना रद्द करेंअनजानअज्ञात त्रुटि।अज्ञात: %s
- अहस्ताक्षरितअस्थिर संस्करण स्थापित करने का सुझाव देंअपडेटउपयोगकर्ता नाम
@@ -165,10 +157,7 @@
डाउनलोड शुरू होने की प्रतीक्षा की जा रही है…नया क्या हैवेबसाइट
- नवीनतम
- इंस्टॉल किए गए एप्लिकेशनसभी अपडेट करें
- एक्सप्लोर करेंकोई इंस्टॉल किए गए एप्लिकेशंनस नहींगलत पताअमान्य फ़िंगरप्रिंट प्रारूप
@@ -177,13 +166,9 @@
अन्यअहस्ताक्षरित। आवेदन सूची का सत्यापन नहीं किया जा सका। अहस्ताक्षरित रिपॉजिटरी से एप्लिकेशन डाउनलोड करने में सावधानी बरतें।%s . द्वारा प्रदान किया गया
- साइलेंट इंस्टालआपकी गतिविधि को ट्रैक या रिपोर्ट करता हैअनुक्रमणिका सत्यापित नहीं की जा सकी।
- असत्यापित
- छाँटें और फ़िल्टर करेंएपीके सफाई अंतराल
- डाउनलोड की गई फ़ाइलों को जांचने और निकालने की अवधिकेवल वाई-फ़ाई व च्राजिंग परदिन
@@ -194,9 +179,6 @@
घंटेकुछ क्रियाएं करने में असमर्थ।
- आपका इंटरनैट कनेक्शन चालू नहीं है
- टॉप ऐप बार को विस्तृत होने दें
- टॉप ऐप बार को विस्तृत और संक्षिप्त होने देंपसंदीदाजबरी साफ करोअनावश्यक फाइलों को साफ करता है
@@ -207,7 +189,6 @@
ऐप्स को ऑटो अपडेट करेंअपडेटस को स्वचालित रूप से इंस्टॉल करने का प्रयास करेंरिपॉजिटरी को सक्षम करें
- बदलाव देखने के लिए Droid-ify को रीस्टार्ट करेंइंस्टॉल कर रहा हैगैर-मुक्त घटक हैंसर्वर नया पैकेट प्रदान करने में विफल रहा।
@@ -218,7 +199,6 @@
विशेष श्रेयहोम स्क्रीन स्वाइपिंगउपयोगकर्ता को होम स्क्रीन में पृष्ठों के बीच स्वाइप करने की अनुमति दें
- कापी करेंप्रॉक्सी पोर्ट केवल पूर्णांक हो सकता हैनिम्नलिखित रिपॉजिटरी नहीं मिलीआयात सेटिंग्स
@@ -240,4 +220,9 @@
LSPosed उपयोगकर्ताओं या उन्नत उपयोगकर्ताओं के लिए एपीके इंस्टॉल करते समय हस्ताक्षर सत्यापन को अनदेखा करेंअनइंस्टॉल किया गया%s इंस्टॉल करने में विफल
-
\ No newline at end of file
+ अज्ञात (%d)
+ अपर्याप्त जगह
+ इस एप्लिकेशन को इंस्टॉल करने के लिए डिवाइस पर पर्याप्त खाली जगह नहीं है। कुछ जगह खाली करने का प्रयास करें
+ डिफ़ॉल्ट पर स्विच करें
+ वीडियो
+
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index c2cf29a7..fb893082 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -27,16 +27,13 @@
ZaporkaPostavkePromovira mrežne usluge koje nisu besplatne
- Još niste koristili ovaj repozitorij. Omogućite ga kako biste vidjeli aplikacije koje sadrži.Prikaži starije inačiceNije potpisano. Nemoguće potvrditi liste aplikacija. Budite oprezni prilikom preuzimanja aplikacija s nepotpisanih repozitorija.SOCKS proxy
- Omogućite root dozvole kako bi neometana instalacija funkcioniralaPrati i prijavljuje Vašu aktivnostNepoznato: %sPrikaži višePotpis %s
- NepotpisanoPotpisano nesigurnosnim algoritmomVeličinaPreskoči
@@ -68,7 +65,6 @@
PromjeneProvjeravam repozitorij…APK interval čišćenja
- Razdoblje za provjeru i uklanjanje preuzetih datotekaStvoreno za ispravljanje pogrešakaPovezujem…Sadrži medije koji nisu besplatni
@@ -108,8 +104,6 @@
Neispravan potpis.Neispravan oblik korisničkog imenaPokreni
- Animacije popisa
- Prikaži animacije popisa na početnoj straniciStapanje %sNazivMrežna greška
@@ -140,10 +134,8 @@
RepozitorijiRepozitorijZahtijeva %s
- Neometana instalacijaSpremiSpremam detalje…
- Snimke zaslonaTražiOdaberite poslužiteljPodijeli
@@ -155,13 +147,11 @@
SinkroniziramSistemKliknite kako biste instalirali.
- CiljTemaDeinstalirajNepoznatoNepoznata greška.Nestabilna ažuriranja
- NepotvrđenoAžurirajAžuriranjaGlavni izvorni kod nije besplatan
@@ -170,13 +160,8 @@
Što je NovoJezikPrikaži manje
- Najnovije
- OtkrijAžuriraj sve
- Instalirane aplikacije
- Sortiraj i filtrirajSve Vaše aplikacije su ažurne
- Nove aplikacijeRadnja neuspjelaSve aplikacijeOtkrij
@@ -197,9 +182,6 @@
HTTP proxyNikadNije moguće izvršiti određene radnje.
- Nemate internetsku vezu
- Dozvoli rasklapanje i sklapanje gornje trake aplikacije
- Dozvoli rasklapanje gornje trake aplikacijeInstaliranjeMaterial YouUpotrijebite Material You temu boja
@@ -210,7 +192,6 @@
Repozitorij je nedostupanAutomatsko ažuriranje aplikacijaPokušajte automatski instalirati ažuriranja
- Ponovo pokrenite droid-ify da biste vidjeli promjeneČekajući da započnete instalaciju …Sadrži komponente koje nisu besplatneNije bilo moguće spojiti se s poslužiteljem
@@ -218,7 +199,6 @@
Prevlačenje početnim zaslonomSadrži sadržaj koji nije siguran za radShizuku nije pokrenut
- KopirajProxy port može biti samo cijeli brojDopušta korisniku da prelazi između stranica na početnom zaslonuSljedeći repozitorij nije pronađen
@@ -241,4 +221,4 @@
Deinstalirano%s je deinstaliranIgnoriraj potpis
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index a19dcf1d..21656f1d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -1,25 +1,21 @@
- Művelet sikertelen
+ Sikertelen műveletTároló hozzáadásaCímÖsszes alkalmazásFeketeKöszönet
- Adományozás
+ TámogatásTelepítési típusok
- Listaanimációk
- %d alkalmazásnak új verziója van.
- %d alkalmazásnak új verziója van.
+ %d alkalmazás új verziója elérhető.
+ %d alkalmazás új verziója elérhető.BeállításokNemrég frissített
- Néma telepítés
- Engedélyezze a rendszergazdai jogosultságot a néma telepítés érdekébenMegosztásMéret
- CélTémákFrissítésekVerzió
@@ -30,10 +26,10 @@
MindigElőnytelen funkciókAlkalmazás
- Az alkalmazás nem található
- Szerző e-mail-címe
- Szerző weboldala
- Elérhető
+ Nem található alkalmazás
+ E-mail szerzője
+ Weboldal szerzője
+ BöngészésHibakövetőMégseA tároló most nem szerkeszthető, mert épp szinkronizál.
@@ -41,10 +37,10 @@
VáltozásokHibakereséshez fordítvaMegerősítés
- Nem szabad médiát tartalmaz
- Nem tölthető le: %s
- Nem szinkronizálható: %s
- Nem ellenőrizhető: %s
+ Nem-szabad médiát tartalmaz
+ %s nem tölthető le
+ %s Nem szinkronizálható
+ %s Nem ellenőrizhetőSötétTörlésBiztos, hogy törli a tárolót\?
@@ -55,77 +51,76 @@
Tároló szerkesztéseUjjlenyomatReklámot tartalmaz
- Nem szabad függőségei vannak
+ Nem-szabad elemei vannakBiztonsági sérülékenységei vannakÉrvénytelen kiszolgálóválasz.HTTP proxyÖsszes új verzió mellőzéseEzen verzió mellőzéseA következő verzió nem támogatott: %1$s (API verzió: %2$d). %3$s
- A maximális API verzió: %d.
- A minimális API verzió: %d.
+ %d a maximális API verzió.
+ %d a minimális API verzió.Hiányzó funkciók.Nem kompatibilis verzióNem kompatibilis verziókAz eszközzel nem kompatibilis alkalmazásverziók megjelenítése
- Nem kompatibilis ezzel: %s
+ %s-al nem kompatibilisTelepítésTelepítve
- Az épségének ellenőrzése sikertelen.
+ Integritás ellenőrzése sikertelen.Érvénytelen cím
- Érvénytelen ujjlenyomat-formátum
+ Érvénytelen ujjlenyomat formátumÉrvénytelen metaadatok.Érvénytelen engedélyek.Érvénytelen aláírás.
- Érvénytelen felhasználónév-formátum
+ Érvénytelen felhasználónév formátumIndítás
- Licenc
- %s licenc
+ Licensz
+ %s licenszVilágosHivatkozás másolvaHivatkozások
- Egyesítés: %s
+ %s egyesítéseNévHálózati hibaSoha
- Új alkalmazásverziók érhetők el
- Nem érhetők el alkalmazások
+ Applikációk új verziói érhetőek el
+ Nincs elérhető alkalmazásNincsenek telepített alkalmazásokNem érhető el leírás
- Nem találhatók ilyen alkalmazások
+ Nem találhatóak ilyen alkalmazásokNincs proxyÉrtesítés a frissítésekről
- Értesítés megjelenítése, ha új verziók érhetők el
+ Értesítés megjelenítése új verzió eseténAlkalmazások számaOK
- Csak ezzel kompatibilis: %s
- Csak Wi-Fin
+ Csak a %s-al kompatibilis
+ Csak Wi-Fi-n%s megnyitása\?Egyéb
- Az indexfájl nem értelmezhető.
+ Az indexfájl nem elemezhető.Jelszó
- Hiányzik a jelszó
+ Hiányzó jelszóEngedélyek
- +%d további
- Projekt weboldala
- Nem szabad hálózati szolgáltatásokat támogat
- Nem szabad szoftvereket támogat
- Szállító: %s
+ További +%d
+ Projekt weboldal
+ Nem-szabad hálózati szolgáltatásokat népszerűsít
+ Nem szabad szoftvereket népszerűsít
+ %s által biztosítvaProxyProxy kiszolgálóProxy portProxy típusTárolókTároló
- Szükséges: %s
+ %s szükségesMentés
- KépernyőképekKeresés
- Válasszon egy tükröt
+ Válasszon egy címetTovábbiak megjelenítéseRégebbi verziók megjelenítése
- Aláírás: %s
- Nem biztonságos algoritmussal aláírva
+ %s aláírás
+ Nem biztonságos algoritmussal került aláírásraKihagyásSOCKS proxyRendezési sorrend
@@ -142,20 +137,17 @@
EltávolításIsmeretlenIsmeretlen hiba.
- Ismeretlen: %s
- Nem aláírt
- Nem stabil frissítések
- Nem stabil verziófrissítések javaslata
- Nem ellenőrzött
+ %s ismeretlen
+ Instabil frissítések
+ Instabil verziók telepítésének javaslataFrissítésAz upstream forráskód nem szabadFelhasználónév
- Hiányzik a felhasználónév
+ Hiányzó felhasználónévAz index nem ellenőrizhető.
- Verzió: %s
+ %s verzióVerziókWeboldal
- Listaanimációk megjelenítése a főoldalonÉrvénytelen fájlformátum.TestreszabásKapcsolódás…
@@ -168,23 +160,16 @@
Ez a verzió a jelenleg az eszközére telepített verziójától eltérő tanúsítvánnyal rendelkezik. Előbb távolítsa el azt.%1$s feldolgozása…%s szinkronizálása…
- Ez a tároló még nem volt használva. Kapcsolja be, hogy megtekintse a benne lévő alkalmazásokat.Nincs aláírva. Nem sikerült ellenőrizni az alkalmazáslistát. Legyen óvatos amikor nem aláírt tárolókból tölt le alkalmazásokat.Kevesebb megjelenítése
- Rendezés és szűrés
- Csak Wi-Fin és töltés közben
- Felfedezés
+ Csak Wi-Fi-n és töltés közbenÖsszes frissítése
- Telepített alkalmazások
- Új alkalmazások
- A telepítő
- Hagyományos telepítő
- Munkamenet-alapú telepítő
- Rendszergazdai telepítő
+ Telepítő
+ Régi típusú telepítő
+ Munkamenet alapú telepítő
+ Root telepítőShizuku telepítő
- Legújabb
- APK takarítás időköze
- Letöltött fájlok ellenőrzésének és törlésének időköze
+ Időközi APK eltávolításóraóra
@@ -193,37 +178,32 @@
napnap
- Felső alkalmazássáv kibontása
- Bizonyos műveletek végrehajtása sikertelen.
- Felső alkalmazássáv kibontása és összecsukása
- Nincs internet-hozzáférés
+ Bizonyos műveleteket nem lehet végrehajtani.Próbálja automatikusan telepíteni a frissítéseket
- Telepítés…
- Indítsa újra a Droid-ify-t a változások megtekintéséhez
+ Telepítés alattVárakozás a telepítés megkezdésére …Kedvencek
- Eltakarítja a redundáns fájlokat
+ Eltakarítja a fölösleges fájlokatKényszerített takarításMaterial You
- A tároló elérhetetlen
+ A tároló nem elérhetőAlkalmazások automatikus frissítéseA tároló engedélyezése
- A Material You színtéma használata
- Nem szabad összetevői vannak
+ A Material You színséma használata
+ Nem-szabad összetevői vannakKezdőképernyő lapozása
- Érzékeny tartalmat tartalmaz
+ Érzékeny tartalmat foglal magábanA Shizuku nem futNem sikerült kapcsolódni a kiszolgálóhozA kiszolgáló nem tudott új csomagot biztosítani.
- MásolásA proxy portja csak egész szám lehetEngedélyezés, hogy a felhasználó lapozzon a kezdőképernyő lapjai köztA következő tároló nem találhatóKülön köszönetA Shizuku nincs telepítve
- Bizonyos hálózati szolgáltatáshoz kapcsolódik
+ Bizonyos hálózati szolgáltatáshoz van kötveA hivatkozás nem nyitható meg
- Importálás/exportálás
+ Importálás/ExportálásBeállítások importálásaBeállítások és kedvencek importálása fájlbólBeállítások exportálása
@@ -232,12 +212,24 @@
Az összes tároló importálása fájlbólTárolók exportálásaAz összes tároló fájlba exportálása
- Háttérbeli hozzáférés igénylése
- A háttérszinkronizálás megfelelő futtatásához háttérbeli hozzáférés szükséges
- Aláírás ellenőrzés figyelmen kívül hagyása az apk telepítésekor, LSPosed felhasználók vagy haladó felhasználók számára
- A telepítés meghiúsult
- %s telepítése meghiúsult
- Eltávolított
+ Háttérben futás engedélye
+ A háttérszinkronizálás megfelelő futtatásához háttérbeli hozzáférés engedély szükséges
+ *Figyelem* Aláírás figyelmen kívül hagyása apk telepítéskor, LSposed felhasználóknál vagy tapasztalt felhasználók esetén
+ Sikertelen telepítés
+ %s telepítése sikertelen
+ Eltávolítva%s eltávolításra kerültAláírás figyelmen kívül hagyása
-
\ No newline at end of file
+ Hiányzó Shizuku engedély
+ Shizuku engedélyek nem aktívak. Kérem ellenőrizze a Shizuku appban
+ Úgy tűnik a Shizuku nincs telepítve
+ Shizuku nincs telepítve
+ A Shizuku szolgáltatás nem fut. Kérem ellenőrizze a Shizuku appon belül
+ Nincs elég szabad hely az eszközön az applikáció telepítéséhez. Próbáljon meg területet felszabadítani
+ A Shizuku nem fut
+ Ismeretlen (%d)
+ Nincs elég szabad hely
+ Shizuku megnyitása
+ Alapértelmezettre váltás
+ Videó
+
diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml
index c3477577..378af153 100644
--- a/app/src/main/res/values-ia/strings.xml
+++ b/app/src/main/res/values-ia/strings.xml
@@ -25,17 +25,14 @@
CreditosActualisationesActualisar toto
- Non signateNecun applicationes installateDiscargante
- ExplorarMonstrar un notification quando il ha nove versiones disponibileNove versiones de applicationes disponibileIncogniteRepositorio inaccessibileActualisationInstallate
- Applicationes installateRepositorioSuggerer le installation de versiones instabilePersonalisation
@@ -44,7 +41,6 @@
Recentemente actualisateModificar repositorioIgnorar iste version
- Non verificateLinguaError incognite.Themas
@@ -72,10 +68,8 @@
Nomine de usatorVersion %sVersion
- Nove applicationesTocca pro installar.Versiones
- Le plus recenteLicentia %sSalveguardarUsar le thema de color Material You
@@ -98,14 +92,12 @@
Ha vulnerabilitates de securitateAlteresLigamine copiate
- CopiarParametros de exportationNumero de applicationesError de reteLicentiaExportar tote le repositorios a un fileImportar le repositorios
- Capturas de schermoSito web del autorDetaliosProxy HTTP
@@ -130,7 +122,6 @@
Proxy SOCKSSolmente compatibile con %sOK
- Tu non ha connexion a InternetIgnorarSalvante detalios…Necun proxy
@@ -142,7 +133,6 @@
Solmente in Wi-Fi e carganteInstallanteAdresse non valide
- Ordinar e filtrarNovitatesLancearLe codice fonte non es libere
@@ -180,7 +170,6 @@
Contine componentes non libereLigate a un certe servicio de retePromove servicios de rete non libere
- Monstrar le animation de lista in le pagina principalTracia o signala tu activitateSignatura non valide.Fusionante %s
@@ -189,12 +178,10 @@
Shizuku non es in executionNon poteva synchronisar %sTu platteforma %1$s non es supportate. Platterformas supportate: %2$s.
- Reinitia Droid-ify pro vider le cambiamentosNomine de usator mancanteFunctionalitates mancante.Fortiar le nettageContrasigno mancante
- ScopoSignate con un algorithmo non securPorto de proxyLe servitor falleva in fornir un nove pacchetto.
@@ -204,7 +191,6 @@
Non pote modificar le repositorio proque es synchronisante ora mesme.Le porto proxy solmente pote esser un numero integreOrdinar
- Installation silentioseFormato de impression digital non valideTraciator de defectosContine medias non libere
@@ -212,16 +198,11 @@
Promove le software non libereInstallator ancianCercar
- Animationes de listaPermitter al usator glissar inter paginas in le schermo de initio
- Permitter le expansion del barra de applicationes superiorNon poteva validar %sNon poteva trovar tal applicationesLe version minime de API es %d.
- Permitter le expansion e le collapso del barra de applicationes superior
- Periodo pro verificar e remover le files discargateLe version maxime de API es %d.
- Iste repositorio ancora non es usate. Activa lo pro vider le applicationes que contine.Non poteva analysar le file de indice.Non poteva aperir le ligamineLe sequente repositorio non esseva trovate
@@ -230,7 +211,6 @@
Fornite per %sAdresse de proxyNon poteva verificar le integritate.
- Permitter permission del usator root pro le installationes silencioseCompilate pro le depurationAccesso in secunde plano es requirite pro executar correctemente le synchronisation in secunde planoRequire accesso in secunde plano
@@ -240,4 +220,8 @@
%s ha essite disinstallateIgnorar le signaturaIgnorar le verification de signatura in le installation de apk, pro usatores avantiate o de LSPosed
-
\ No newline at end of file
+ Cambiar al predefinite
+ Video
+ Incognite (%d)
+ Aperir Shizuku
+
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 980b8fc7..77750209 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -58,8 +58,6 @@
LuncurkanLisensiTampilkan versi aplikasi yang tidak kompatibel dengan perangkatmu
- Animasi Daftar
- Tampilkan animasi daftar pada halaman utamaMenggabungkan %sNamaTidak pernah
@@ -96,13 +94,9 @@
Baru-baru ini diperbaruiRepositoriRepositori
- Repositori ini belum digunakan. Aktifkan untuk melihat aplikasi yang tersedia.Tanpa tanda tangan. Tidak bisa memverifikasi daftar aplikasi. Hati-hati saat mengunduh aplikasi dari repositori tanpa tanda tangan.Membutuhkan %s
- Pasang Diam-diam
- Izinkan akses root untuk pemasangan secara diam-diamSimpan
- Tangkapan LayarTanda tangan %sUkuranLewati
@@ -117,10 +111,8 @@
Tidak diketahuiGalat tidak diketahui.Tidak diketahui: %s
- Tanpa tanda tanganPembaruan tidak stabilSarankan memasang versi tidak stabil
- Tidak terverifikasiPembaruanKode sumber upstream tidak bebasNama pengguna
@@ -133,9 +125,6 @@
Tambah repositoriAlamatSelalu
- Terbaru
- Urutan & Filter
- Aplikasi baruTidak bisa menemukan aplikasi tersebutKonfirmasiTidak bisa memvalidasi %s
@@ -165,20 +154,17 @@
Menyinkronkan %s…Sinkron repositori secara otomatisKetuk untuk pasang.
- SasaranCopotTemaTemaMelacak atau melaporkan aktivitas AndaTampilkan Sedikit
- JelajahiVersiVersi %sMenunggu memulai mengunduh…PersonalisasiVersiPerbarui semua
- Aplikasi terpasangHari
@@ -188,11 +174,7 @@
Hanya pada Wi-Fi & Mengisi DayaDikompilasi untuk debuggingTidak bisa melaksanakan tindakan tertentu.
- Kamu tidak memiliki akses internet
- Izinkan Bilah Atas Apl untuk Diperluas
- Izinkan bilah atas aplikasi untuk diperluas dan dikecilkanInterval pembersihan APK
- Interval pengecekan dan penghapusan berkas terunduh%s TerdownloadFavoritMaterial You
@@ -205,7 +187,6 @@
Menunggu untuk memulai pemasangan…Perbarui aplikasi secara otomatisCobalah untuk menginstal pembaruan secara otomatis
- Ulang Droid-ify untuk melihat perubahanMemiliki komponen tidak terbukaServer gagal menyediakan paket baru.Tidak dapat terhubung ke server
@@ -215,7 +196,6 @@
Izinkan pengguna menggeser antar halaman di layar berandaKredit SpesialShizuku tidak terpasang
- SalinPorta proksi harus bilangan bulatRepositori berikut tidak ditemukanImpor Pengaturan
@@ -239,4 +219,14 @@
*Peringatan* Abaikan verifikasi tanda tangan ketika memasang apk, untuk pengguna LSPosed atau pengguna ahliTidak cukup ruang kosong pada perangkat untuk memasang aplikasi ini. Coba bersihkan berkas atau aplikasiRuang Tidak Cukup
-
\ No newline at end of file
+ Shizuku tampaknya tidak terinstal
+ Beralih ke Default
+ Buka Shizuku
+ Izin layanan Shizuku tidak diberikan. Silakan cek di Aplikasi Shizuku
+ Shizuku Tidak Berjalan
+ Layanan Shizuku tidak berjalan. Silakan periksa di Aplikasi Shizuku
+ Izin Shizuku Hilang
+ Shizuku Tidak Terinstal
+ video
+ Tidak diketahui (%d)
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index ed806ea1..53f3c2cb 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -75,8 +75,6 @@
ChiaroLink copiatoCollegamenti
- Elenco animazioni
- Mostra l\'animazione della lista nella pagina principaleUnione di %sNomeErrore di rete
@@ -118,14 +116,10 @@
Aggiornato di recenteRepositoryRepository
- Questo repository non è stato ancora utilizzato. Attivalo per vedere le applicazioni in esso contenute.Senza firma. Impossibile verificare la lista delle applicazioni. È importante stare attenti quando si scaricano le applicazioni dai repository senza firma.Richiede %s
- Installazione silenziosa
- Consenti permesso di Root per abilitare installazioni silenzioseSalvaSalvataggio dei dettagli…
- SchermateCercaSeleziona alternativaCondividi
@@ -146,7 +140,6 @@
Sincronizzazione di %s in corso…SistemaTocca per installare.
- ObiettivoTemaTemiTraccia o riferisce le tue attività
@@ -154,10 +147,8 @@
SconosciutoErrore sconosciuto.Sconosciuto: %s
- Non firmatoAggiornamenti instabiliSuggerisci l\'installazione di versioni instabili
- Non verificatoAggiornaAggiornamentiIl codice sorgente aggiornato non libero
@@ -173,18 +164,12 @@
LinguaPersonalizzazioneAggiorna tutto
- Ordina e filtra
- Ultime novitàMostra meno
- Nuove applicazioni
- Esplora
- Applicazioni installateInstallatoreInstallatore ShizukuInstallatore di sessioneInstallatore legacyInstallatore root
- Periodo per controllare e rimuovere i file scaricatiGiornoGiorni
@@ -198,9 +183,6 @@
Intervallo di pulizia APKSolo su Wi-Fi e in caricaImpossibile eseguire determinate azioni.
- Non hai connessione internet
- Consenti l\'espansione della barra superiore dell\'app
- Consenti alla barra superiore dell\'app di espandersi e comprimersiMaterial YouPreferitiUsa il tema material you
@@ -210,7 +192,6 @@
Abilita il repositoryInstallazioneIn attesa di avviare l\'installazione…
- Riavvia Droid-ify per vedere le modificheAggiornamento automatico delle appProva a installare gli aggiornamenti automaticamenteHa componenti non liberi
@@ -227,7 +208,6 @@
Esporta repositoryImportare tutti i repository da fileShizuku non è in esecuzione
- CopiaLa porta proxy può essere solo un numero interoLa seguente repository non è stata trovataMenzione Speciale
@@ -246,4 +226,14 @@
*Attenzione* Ignora la verifica della firma durante l\'installazione dell\'apk, per gli utenti LSPosed o per gli utenti avanzatiLo spazio libero sul dispositivo non è sufficiente per installare questa applicazione. Prova a liberare un po\' di spazioSpazio insufficiente
-
\ No newline at end of file
+ Video
+ Shizuku non in esecuzione
+ Il servizio di Shizuku non è in esecuzione. Controlla nell\'app Shizuku
+ Shizuku non installato
+ L\'autorizzazione al servizio Shizuku non è stata concessa. Controlla nell\'app Shizuku
+ Permesso Shizuku mancante
+ Shizuku non sembra essere installato
+ Apri Shizuku
+ Passa al predefinito
+ Sconosciuto (%d)
+
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index ed01b2ff..27af49ce 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -1,9 +1,8 @@
- הצג רשימת אנימציית בעמוד הראשיכתובות
- אנטי-תכונות
- בטל
+ תכונות-לא-רצויות
+ ביטולכבר קייםתמידשחור
@@ -11,13 +10,12 @@
לא ניתן היה למצוא את היישום הזהדואר אלקטרוני של היוצרעיין
- עוקב אחר באגים
+ מעקב באגיםלא ניתן לערוך את המאגר מכיוון שהוא מסתנכרן כעת.יומן שינוייםשינוייםבודק מאגר…
- APK cleanup interval
- Period to check and remove downloaded files
+ מרווח ניקוי APKאישוריםלא ניתן היה להוריד את %sלא ניתן היה לסנכרן את %s
@@ -32,7 +30,7 @@
תיאורפרטיםתרום
- מוריד %s
+ %s ירדמורידערוך מאגרמכיל פרצות אבטחה
@@ -43,7 +41,7 @@
גרסת ה-API המינימלית היא %d.תכונות חסרות.פלטפורמת %1$s שלך אינה נתמכת. פלטפורמות נתמכות: %2$s.
- התקן
+ התקנהמתקין הפעלההותקןמטא נתונים לא חוקיים.
@@ -54,22 +52,20 @@
רשיון%s רשיוןמואר
- הקישור הועתק ללוח
+ הקישור הועתקקישורים
- רשימת אנימציותממזג %sהיי, זמינות גרסאות חדשות של יישומים
- %d לאפליקציה יש גרסה חדשה.
- %d לאפליקציות יש גרסאות חדשות.
- %d לאפליקציה יש גרסה חדשה.
- %d לאפליקציות יש גרסאות חדשות.
+ לאפליקציה %d יש גרסה חדשה.
+ %d אפליקציות עם גרסאות חדשות.
+ %d אפליקציות עם גרסאות חדשות.
- אין אפליקציות זמינות
+ עדיין אין אפליקציות זמינותאין יישומים מותקנים
- אין תיאור זמין
- לא הצלחתי למצוא אפליקציות כאלה
- אין פרוקסי
+ לא נמצא תיאור זמין
+ לא הצלחנו למצוא אפליקציות כאלה
+ ללא פרוקסיהתראה על עידכוניםהצג התראה כאשר גרסאות חדשות זמינותמספר אפליקציות
@@ -108,29 +104,23 @@
מסנכרן את %s…מערכתהקש כדי להתקין.
- יעד
- ערכת נושא
- ערכות נושא
+ עיצוב
+ עיצוביםעוקב או מדווח על הפעילות שלךלא ידוע
- לא מאומת
- קוד המקור המלא אינו חינמי
+ קוד המקור המלא אינו חופשישם משתמששם משתמש חסרשפה
- עייןעדכן הכל
- אפליקציות מותקנות
- מיון וסינון
- יישומים חדשים
- פעולה נכשל
+ פעולה נכשלההוסף מאגרכל האפליקציותכל האפליקציות שלך מעודכנותאתר היוצרמכיל קוד שאינו חופשילא ניתן היה לאמת את %s
- אפל
+ כההפורמט קובץ לא חוקי.הידור עבור ניפוי באגיםמתחבר…
@@ -139,7 +129,7 @@
טביעת אצבעתלוי בתוספים לא חופשייםתגובת שרת לא חוקית.
- מכיל פרסום
+ מכיל פרסומותגרסה זו ישנה יותר מזו המותקנת במכשיר שלך. הסר את החדשה קודם.שעה
@@ -165,24 +155,19 @@
הצג גירסאות ישנותגירסאשגיאת רשת
- לעולם לא
+ אף פעםהגדרותפרוקסיעודכן לאחרונה
- עדיין לא נעשה שימוש במאגר זה. הפעל אותו כדי להציג את היישומים שבו.הרשאותמארח פרוקסי
- צילומי מסך
- אפשר הרשאת רוט עבור התקנות שקטותשמור
- התקנה שקטה (רוט)חתום באמצעות אלגוריתם. לא בטוחשתףהצג יותרחיפושבחר מראהחתימה %s
- לא חתוםהצע להתקין גרסאות לא יציבותעידכוניםגרסה %s
@@ -198,43 +183,37 @@
ממתין לתחילת ההורדה…התאמה אישיתהצג פחות
- הכי מאוחר
- אפשר לסרגל האפליקציות העליון להתרחב
- אפשר לסרגל האפליקציות העליון להתרחב ולהתמוטט
- אין לך חיבור לאינטרנטלא ניתן לבצע פעולות מסוימות.התקנה
- חומר אתה
- השתמש בחומר אתה נושא צבע
- הפעל מחדש את Droid-iim כדי לראות שינויים
+ Material You
+ השתמש בעיצוב צבע של- material youמחכה להתחיל בהתקנה …מועדפיםמנקה קבצים מיותריםאפשר את המאגר
- כוח לנקות
+ כפה ניקוימאגר בלתי ניתן להשגה
- אפליקציות לעדכון אוטומטי
- נסה להתקין עדכונים באופן אוטומטי
- בעל רכיבים לא חופשיים
+ עידכון אפליקציות אוטומטי
+ ננסה להתקין עדכונים באופן אוטומטי
+ מכיל רכיבים לא חופשייםשיזוקו לא פועל
- Shizuku לא מותקן
+ שיזוקו לא הותקןהמאגר לא נמצאההתקנה של %s הוסרהההתקנה נכשלהההתקנה נכשלה %sהוסר
- העתקהתעלם מהחתימה*אזהרה* התעלמות מאימות חתימה בעת התקנת apk, נוצרה עבור משתמשים עם LSPosed או משתמשים מתקדמיםייצוא מאגריםהשרת לא הצליח לספק חבילה חדשה.לא ניתן להתחבר לשרת
- קשור לשירות רשת מסוים
+ מקושר לשירות רשת מסויםאפשר למשתמש להחליק בין דפים במסך הביתקרדיטים מיוחדיםמכיל תוכן שאינו בטוחייצא את כל המאגרים לקובץ
- החלקת מסך הבית
+ החלקה על מסך הביתיציאת פרוקסי יכולה להיות רק מספר שלםלא ניתן לפתוח קישורייבוא/ייצוא
@@ -248,4 +227,14 @@
אין מספיק מקום פנוי במכשיר להתקנת יישום זה. נסה לפנות קצת מקוםנדרשת גישת רקע כדי להפעיל את סנכרון הרקע כראוידרוש גישה ברקע
-
\ No newline at end of file
+ וידיאו
+ Shizuku לא פועל
+ שירות Shizuku אינו פועל. אנא בדוק באפליקציית Shizuku
+ חסר הרשאת שימוש ב- Shizuku
+ לא ניתנה הרשאה לשירות Shizuku. אנא בדוק באפליקציית Shizuku
+ Shizuku לא מותקן
+ נראה כי Shizuku לא מותקן
+ פתח את שיזוקו
+ עבור לברירת מחדל
+ לא ידוע (%d)
+
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 9255f8dc..b2a0d217 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -84,8 +84,6 @@
ライトリンクがコピーされましたリンク
- リストのアニメーション
- メインページでリストをアニメーションする%d 個のアプリに新しいバージョンがあります。
@@ -117,10 +115,8 @@
最近の更新リポジトリ%s が必要
- サイレントインストール保存詳細を保存しています…
- スクリーンショット検索ミラーを選択共有
@@ -142,17 +138,14 @@
%s を同期中…システムタップしてインストール
- ターゲットテーマテーマあなたのアクティビティを追跡または報告しますアンインストール不明なエラーです。不明: %s
- 署名なし不安定なアップデート不安定なバージョンのインストールを提案する
- 未検証アップデートアップデートアップストリームのソースコードは不自由です
@@ -168,14 +161,9 @@
言語個人用設定表示を減らす
- 最新
- 探索すべてアップデート
- インストールされているアプリ
- 新しいアプリ探索APK の自動クリーンアップ間隔
- ダウンロード済みファイルの確認と削除をする間隔機能が不足しています。現在同期中のため、リポジトリを編集できません。クレジット
@@ -187,13 +175,7 @@
プロキシホストプロキシポートプロキシタイプ
- このリポジトリはまだ使用されていません。アプリケーションを表示するには、オンにしてください。
- サイレントインストールのための root 権限を許可する
- 並べ替えとフィルター
- トップアプリバーの拡張を許可する
- トップアプリバーの拡大・縮小を可能にする特定のアクションを実行できません。
- インターネット接続がありませんアプリの自動更新アップデートを自動的にインストールしますインストール中
@@ -205,14 +187,12 @@
強制的にクリーンアップ冗長ファイルをクリーンアップするMaterial You カラーテーマを使用する
- Droid-ify を再起動して変更を確認する不自由なコンポーネントを含むホーム画面のスワイプコンテンツには安全ではないものが含まれていますShizuku が動作していませんサーバーに接続できませんでしたサーバーから新しいパケットが提供されませんでした。
- コピープロキシポートは整数のみですホーム画面でページをスワイプして移動する指定されたリポジトリは見つかりませんでした
@@ -237,4 +217,4 @@
リンクを開けませんバックグラウンドのアクセスが必要ですバックグラウンドでの使用を可能にするには、バックグランドのアクセスを許可する必要があります
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 419b7747..21fcced6 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -17,7 +17,6 @@
ಬದಲಾವಣೆಗಳ ಟಿಪ್ಪಣಿಬದಲಾವಣೆಗಳುAPK cleanup interval
- Period to check and remove downloaded filesಡೀಬಗ್ ಮಾಡಲು ಸಂಕಲಿಸಲಾಗಿದೆದೃಢೀಕರಣಮುಕ್ತವಲ್ಲದ ಮಾಧ್ಯಮವನ್ನು ಒಳಗೊಂಡಿದೆ
@@ -68,8 +67,6 @@
%s ಪರವಾನಗಿಬೆಳಕುಲಿಂಕ್ಗಳು
- ಅನಿಮೇಷನ್ ಗಳ ಪಟ್ಟಿ
- ಮುಖ್ಯ ಪುಟದಲ್ಲಿ ಅನಿಮೇಷನ್ ಪಟ್ಟಿ ತೋರಿಸಿಹೆಸರುನೆಟ್ವರ್ಕ್ ದೋಷಎಂದಿಗೂ
@@ -118,13 +115,9 @@
ಭಂಡಾರ%s ಅಗತ್ಯವಿದೆಹುಡುಕಿ
- ಈ ಭಂಡಾರವನ್ನು ಇನ್ನೂ ಬಳಸಲಾಗಿಲ್ಲ. ಅದರಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಅದನ್ನು ಆನ್ ಮಾಡಿ.ಸಹಿ ಮಾಡಿಲ್ಲ. ಅಪ್ಲಿಕೇಶನ್ ಪಟ್ಟಿಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಸಹಿ ಮಾಡದ ರೆಪೊಸಿಟರಿಗಳಿಂದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡುವಾಗ ಜಾಗರೂಕರಾಗಿರಿ.
- ಸೈಲೆಂಟ್ ಇನ್ಸ್ಟಾಲ್
- ನಿಶ್ಯಬ್ದ ಸ್ಥಾಪನೆಗಳಿಗೆ ರೂಟ್ ಅನುಮತಿಯನ್ನು ಅನುಮತಿಸಿಉಳಿಸಿವಿವರಗಳನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ…
- ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳುಹಳೆಯ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸಿಕನ್ನಡಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿಹಂಚಿಕೊಳ್ಳಿ
@@ -140,7 +133,6 @@
ಮೂಲ ಕೋಡ್ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ%s ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…ವ್ಯವಸ್ಥೆ
- ಗುರಿಥೀಮ್ಥೀಮ್ಗಳುಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ.
@@ -152,8 +144,6 @@
ಅಸ್ಥಿರ ನವೀಕರಣಗಳುಅಜ್ಞಾತ ದೋಷ.ಅಜ್ಞಾತ: %s
- ಸಹಿ ಮಾಡಿಲ್ಲ
- ಪರಿಶೀಲಿಸಲಾಗಿಲ್ಲನವೀಕರಿಸಿನವೀಕರಣಗಳುಆವೃತ್ತಿ
@@ -163,8 +153,6 @@
ಕಡಿಮೆ ತೋರಿಸುಆವೃತ್ತಿಗಳುಡೌನ್ಲೋಡ್ ಪ್ರಾರಂಭಿಸಲು ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ…
- ಇತ್ತೀಚಿನ
- ಅನ್ವೇಷಿಸಿಎಲ್ಲವನ್ನು ಆಧುನೀಕರಿಸುವೈ-ಪೈ ನಲ್ಲಿ ಮಾತ್ರತೆರೆ %s\?
@@ -182,21 +170,15 @@
ಕೆಲವು ಕ್ರಿಯೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.ಇತರೆಇಂಡೆಕ್ಸ್ ಫೈಲ್ ಅನ್ನು ಪಾರ್ಸ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.
- ನೀವು ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿಲ್ಲ%s ಗೆ ಮಾತ್ರ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತದೆ
- ಉನ್ನತ ಅಪ್ಲಿಕೇಶನ್ ಬಾರ್ ಅನ್ನು ವಿಸ್ತರಿಸಲು ಮತ್ತು ಕುಗ್ಗಿಸಲು ಅನುಮತಿಸಿವೈ-ಪೈ ಮತ್ತು ಚಾರ್ಜಿಂಗ್ ನಲ್ಲಿ ಮಾತ್ರಸೂಚಿಸಲಾಗಿದೆರೆಪೊಸಿಟರಿಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿರೆಪೊಸಿಟರಿಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಿಂಕ್ ಮಾಡಿ
- ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಬಾರ್ ಅನ್ನು ವಿಸ್ತರಿಸಲು ಅನುಮತಿಸಿಹೊಸತೇನಿದೆಜಾಲತಾಣಭಾಷೆವೈಯಕ್ತೀಕರಣ
- ಸ್ಥಾಪಿಸಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳು
- ವಿಂಗಡಿಸಿ ಮತ್ತು ಫಿಲ್ಟರ್ ಮಾಡಿ
- ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ಗಳುಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನವೀಕರಿಸಿನವೀಕರಣಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ಥಾಪಿಸಲು ಪ್ರಯತ್ನಿಸಿಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ
@@ -208,5 +190,4 @@
ವಸ್ತು ನೀವುವಸ್ತು ನೀವು ಬಣ್ಣದ ಥೀಮ್ ಬಳಸಿರೆಪೊಸಿಟರಿಯನ್ನು ತಲುಪಲಾಗುವುದಿಲ್ಲ
- ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಲು Droid-ify ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 6300e57a..8886a40c 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -32,7 +32,6 @@
잘못된 서명입니다.잘못된 주소잘못된 지문 형식
- 메인 페이지에 목록 애니메이션 표시프록시 없음새 버전을 사용할 수 있을 때 알림 표시업데이트 알림
@@ -57,7 +56,6 @@
루트 설치 관리자잘못된 사용자 이름 형식Material You 색상 테마 사용
- 인터넷에 연결되어 있지 않습니다새로운 버전의 애플리케이션 사용 가능가능한 설명이 없습니다지원하는 애플리케이션을 찾지 못했습니다.
@@ -70,9 +68,6 @@
애플리케이션 정보기부%s 앱을 다운로드했습니다.
- 상단 앱 바 확장 허용
- 상단 앱 바 확장 및 축소 허용
- 다운로드한 파일을 확인하고 제거할 시간 간격디버깅용으로 컴파일됨연결 중…비자유 미디어 포함
@@ -115,7 +110,6 @@
라이트링크를 복사했습니다.연결
- 애니메이션 나열설치 중%s와만 호환 가능Wi-Fi에서만
@@ -125,18 +119,16 @@
제안저장소 자동 동기화동기화 중
- 설치하려면 탭하세요.
+ 설치하려면 여기를 누르세요.테마테마활동을 추적하거나 보고합니다알 수 없는 오류가 발생했습니다.알 수 없음: %s
- 서명되지 않은불안정한 버전 업데이트설치 시작 대기 중…개인화모두 업데이트
- 설치된 애플리케이션공유이전 버전 표시정렬 순서
@@ -144,31 +136,24 @@
버전 %s버전간단히 보기
- 정렬 및 필터
- 새로운 애플리케이션확인Wi-Fi 및 충전 중일 때만저장
- 스크린샷검색미러 선택서명 %s
- 자동 설치를 위해 루트 권한을 허용합니다.세부 정보 저장 중…크기
- 표적불안정한 버전의 업데이트 설치 제안업데이트업데이트업스트림 소스 코드는 무료가 아닙니다사용자 이름
- 미확인사용자 이름이 비어 있습니다.색인을 검증하지 못했습니다.버전언어신청 수
- 이 저장소는 아직 사용한 적이 없습니다. 저장소에서 제공하는 애플리케이션을 확인하려면 이 저장소를 켜세요.저장소더 보기SOCKS 프록시
@@ -188,7 +173,6 @@
%s 필요%1$s 처리 중…비자유 소프트웨어 홍보
- 최신%s를 여시겠습니까\?다른비밀번호 누락
@@ -197,13 +181,10 @@
서명되지 않았습니다. 애플리케이션 목록을 확인하지 못했습니다. 서명되지 않은 저장소에서 애플리케이션을 다운로드할 때는 주의하세요.저장소 동기화시스템
- 탐색색인 파일 구문을 분석하지 못했습니다.비밀번호권한+%d개 더
- Droid-ify를 다시 시작하여 변경 사항 확인
- 자동 설치설정안전하지 않은 알고리즘을 사용하여 서명됨자유롭지 않은 구성 요소를 포함하고 있습니다
@@ -212,7 +193,6 @@
Shizuku가 실행 중이 아님서버에 연결하지 못했습니다.서버에서 새 패킷을 가져오지 못했습니다.
- 복사프록시 포트에는 숫자만 입력할 수 있습니다.홈 화면에서 스와이프하여 페이지 전환다음 저장소를 찾지 못했습니다.
@@ -231,4 +211,22 @@
링크를 열 수 없습니다백그라운드 액세스 필요백그라운드 동기화를 제대로 실행하려면 백그라운드 액세스가 필요합니다
-
\ No newline at end of file
+ 알 수 없음 (%d)
+ 제거됨
+ Shizuku 서비스 권한이 허용되어 있지 않습니다. Shizuku 앱에서 확인해 보세요.
+ %s 앱을 제거했습니다.
+ %s 앱을 설치하지 못했습니다.
+ Shizkuku가 실행 중이 아님
+ Shizuku 서비스가 실행 중이 아닙니다. Shizuku 앱에서 확인해 보세요.
+ Shizuku 권한 필요
+ Shizuku가 설치되어 있지 않음
+ Shizuku가 설치되어 있지 않은 것 같습니다.
+ 설치 실패
+ 저장 공간 부족
+ 이 애플리케이션을 설치할 저장 공간이 부족합니다.
+ Shizuku 열기
+ 기본 설치 관리자로 전환
+ 서명 무시
+ 서명 검증을 무시하고 APK 파일을 설치합니다. LSPosed 사용자 및 고급 사용자용 기능입니다.
+ 동영상
+
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 80e474bf..6bdd518a 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -24,13 +24,8 @@
IšsaugotiRodyti senesnes versijasPirminis kodas
- NepasirašytaVersijos
- NaujausiaAtnaujinti viską
- Įdiegtos programėlės
- Rūšiavimas ir filtravimas
- Naujos programėlėsRodyti daugiauPasirašyta naudojant nesaugų algoritmąDalintis
@@ -52,7 +47,6 @@
Nežinoma: %sNestabilūs atnaujinimaiSiūlyti įdiegti nestabilias versijas
- NepatvirtintaAtnaujintiTrūksta vartotojo vardoIndekso patvirtinti nepavyko.
@@ -76,7 +70,6 @@
Nepavyko išanalizuoti indekso failo.Apdorojama %1$s…Projekto svetainė
- Ekrano nuotraukosVisadaKlaidų sekiklisPatvirtinimas
@@ -92,8 +85,6 @@
LeidimaiNustatymaiNeseniai atnaujinta
- Tylusis diegimas
- Suteikti šakninį leidimą tyliajam diegimuiAtsisiųsta %sAtidaryti %s\?Slaptažodis
@@ -137,8 +128,6 @@
%s licencijaŠviesiNuorodos
- Sąrašo animacijos
- Rodyti sąrašo animaciją pagrindiniame puslapyjeSujungiama %sPavadinimasTinklo klaida
@@ -159,12 +148,10 @@
Automatiškai sinchronizuoti repozitorijasBakstelėkite, kad įdiegtumėte.Repozitorijos
- Ši repozitorija dar nebuvo naudojama. Įjunkite ją, kad peržiūrėtumėte joje esančias programėles.Reikalauja %sParengta derinimuiPadėkosTuri ne „libre“ medijos
- Period to check and remove downloaded filesRedaguoti repozitorijąPirštų atspaudaiTuri ne „libre“ priklausomybių
@@ -192,18 +179,12 @@
Skatina ne „libre“ programinę įrangąPasirinkite alternatyvų šaltinįSOCKS įgaliotasis serveris
- TikslasPradinis pirminis kodas nėra visiškai „libre“
- NaršytiĮgaliotojo serverio tipasNepavyko atlikti tam tikrų veiksmų.
- Neturite interneto ryšio
- Leisti viršutinei programėlių juostai išsiskleisti
- Leisti viršutinei programėlių juostai išsiskleisti ir susiskleistiAutomatinis programų atnaujinimasPabandykite automatiškai įdiegti naujinimusDiegimas
- Iš naujo paleiskite Droid-ify, kad pamatytumėte pakeitimusLaukiama, kol bus pradėtas diegimas…MėgstamiausiSaugykla nepasiekiama
@@ -224,7 +205,6 @@
Serveriui nepavyko pateikti naujo paketo.Nepavyko prisijungti prie serverioSpecialūs kreditai
- KopijuotiNegalima atidaryti nuorodosImportuoti/eksportuotiImportuoti nustatymus
@@ -235,4 +215,4 @@
Importuoti visas saugyklas iš failoEksportuoti saugyklasEksportuoti visas saugyklas į failą
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 2e0ba256..4ef5e010 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -1,7 +1,7 @@
- Šī versija ir parakstīta ar citu sertifikātu, nevis jūsu ierīcē instalēto. Vispirms atinstalējiet to.
- Instalēšanas veidi
+ Šī versija ir parakstīta ar citu sertifikātu nekā tā, kas uzstādīta jūsu ierīcē. Vispirms noņemiet to.
+ Uzstādīšanas veidiRādīt paziņojumu, kad ir pieejamas jaunas versijasNederīga adreseNederīgs pirkstu nospiedumu formāts
@@ -13,32 +13,29 @@
MeklētNepieciešams %sParādīt vairāk
- Šis repozitorijs vēl nav izmantota. Ieslēdziet to, lai skatītu tajā esošās lietojumprogrammas.
- Atļaut root atļauju klusai instalēšanaiSaglabāt
- EkrānuzņēmumiParakstīts, izmantojot nedrošu algoritmuParaksts %sIndeksu nevarēja apstiprināt.Pievienot repozitorijuAdrese
- Visas aplikācijas
- Visas jūsu aplikācijas ir atjauninātas
+ Visas lietotnes
+ Visas lietotnes ir atjauninātasJau eksistēVienmērMelns
- Pretīpašības
- Aplikācija
- Nevarēja atrast šo aplikāciju
- Autora e-pasts
- Autora vietne
+ Nevēlamas, privātuma aizskarošas funkcijas
+ Lietotne
+ Šo lietotni nevarēja atrast
+ Izstrādāja e-pasts
+ Izstrādāja vietneIzpētītKļūdu izsekotājsAtceltIzmaiņu žurnālsIzmaiņas
- Notiek repozitorija pārbaude…
- Sastādīts atkļūdošanai
+ Notiek repozitorijas pārbaude…
+ Kompilēts priekš atkļūdošanas mērķiemApstiprinājumsNotiek savienojuma izveide…Satur nebrīvus medijus
@@ -75,15 +72,15 @@
Jūsu %1$s platforma netiek atbalstīta. Atbalstītās platformas: %2$s.Nesaderīga versijaNesaderīgas versijas
- Rādīt aplikācijas versijas, kas nav saderīgas ar ierīci
+ Rādīt lietotnes versijas, kas nav saderīgas ar ierīciNesaderīgs ar %s
- Instalēt
- Instalētājs
- Mantotais instalētājs
- Sesijas instalētājs
- Sakņu instalētājs
- Shizuku instalētājs
- Instalēts
+ Uzstādīt
+ Uzstādītājs
+ Vecā uzstādīšanas metode
+ Sesijas uzstādīšana
+ Ar root piekļuves tiesībām uzstādīšana
+ Izmantojot Shizuku uzstādīšana
+ UzstādītsNevarēja pārbaudīt integritāti.Nederīgi metadati.Nederīgas atļaujas.
@@ -95,28 +92,26 @@
GaismaSaite ir kopēta starpliktuvēSaites
- Animāciju saraksts
- Rādīt saraksta animāciju galvenajā lapāVārdsNekad
- Pieejamas jaunas aplikācijas versijas
+ Pieejamas jaunas lietotnes versijas
- %d aplikācijām ir jaunas versijas.
- %d aplikācijai ir jauna versija.
- %d aplikācijām ir jaunas versijas.
+ %d lietotnēm ir jauna versija.
+ %d lietotnei ir jauna versija.
+ %d lietotnēm ir jauna versija.
- Nav pieejamu aplikāciju
- Nav instalētas aplikācijas
- Nevarēja atrast nevienu šādu aplikāciju
+ Nav pieejama neviena lietotne
+ Nav uzstādīta neviena lietotne
+ Nevarēja atrast nevienu šādu lietotniNav starpniekserveraPaziņot par jaunām aplikāciju versijām
- Aplikāciju skaits
+ Lietotņu skaitsLabiSaderīgs tikai ar %sTikai 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.ParoleTrūkst parolesAtļaujas
@@ -131,10 +126,9 @@
Starpniekservera saimniekdatorsStarpniekservera portsStarpniekservera veids
- Repozitorijas
+ RepozitorijiRepozitorijs
- Neparakstīts. Nevarēja pārbaudīt lietojumprogrammu sarakstu. Esiet piesardzīgs, lejupielādējot lietojumprogrammas no neparakstītām repozitorijiem.
- Klusā instalēšana
+ Neparakstīts. Nevarēja pārbaudīt lietotnes sarakstu. Esiet piesardzīgi, lejupielādējot lietotnes no neparakstītiem repozitorijiem.Notiek informācijas saglabāšana…Izvēlieties spoguliDalīties
@@ -151,19 +145,16 @@
SinhronizēNotiek %s sinhronizēšana…Sistēma
- Pieskarieties, lai instalētu.
- Mērķis
+ Pieskarieties, lai uzstādītu.TēmaTēmasIzseko vai ziņo par jūsu aktivitātēm
- Atinstalēt
+ NoņemtNezināmsNezināma kļūda.Nezināms: %s
- NeparakstītsNestabili atjauninājumi
- Ieteikt instalēt nestabilas versijas
- Nepārbaudīts
+ Ieteikt uzstādīt nestabilas versijasAtjauninātAtjauninājumiAugšējā avota kods nav bezmaksas
@@ -178,49 +169,70 @@
ValodaPersonalizēšanaRādīt mazāk
- Jaunākais
- IzpētītAtjaunināt visu
- Instalētās aplikācijas
- Kārtot & filtrēt
- Jaunas aplikācijasDarbība neizdevāsNevar rediģēt repozitoriju, jo tas pašlaik tiek sinhronizēts.
- APK cleanup interval
+ APK dzēšanas intervālsNevarēja lejupielādēt %s
- Period to check and remove downloaded filesVai dzēst repozitoriju\?Sīkāka informācija
- Šī versija ir vecāka par jūsu ierīcē instalēto. Vispirms atinstalējiet to.
- Nederīgs faila formāts.
+ Šī 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 datnes formāts.Ir reklāmasHTTP starpniekserverisIgnorēt visas jaunās versijas
- Ļaujiet paplašināties augšējā lietotņu joslāNespēj veikt noteiktas darbības.
- Ļaujiet augšējā lietotņu joslā paplašināties un sabrukt
- Jums nav interneta savienojumaAutomātiski atjaunināt lietotnes
- Mēģiniet automātiski instalēt atjauninājumus
- Instalēšana
- Restartējiet Droid-ify, lai redzētu izmaiņas
- Gaida instalēšanas sākšanu…
- Izlase
+ Mēģiniet automātiski uzstādīt atjauninājumus
+ Uzstādīšana
+ Gaida uzstādīšanas sākšanu…
+ IecienītākieIespējot repozitorijuPiespiedu tīrīšanaMateriāls Tu
- Notīra liekos failus
+ Notīra liekās datnesIzmantojiet materiāls tu krāsu motīvuRepozitorijs nav sasniedzamsIr nesaturošas sastāvdaļasNevar 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
-
\ No newline at end of file
+ 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
+ Trūkst Shizuku atļauja
+ Shizuku pakalpojuma atļauja nav piešķirta. Lūdzu, pārbaudiet Shizuku lietotnē
+ Shizuku nav uzstādīts
+ Laikam, ka Shizuku nav uzstādīts
+ Nepietiek uzglabāšanas vietas
+ Jūsu ierīcē nav pietiekami daudz brīvas vietas, lai uzstādītu šo lietotni. Mēģiniet atbrīvot vietu
+ Shizuku nav uzstādīts
+ Uzstādīšana neizdevās
+ Neizdevās uzstādīt %s
+ Noņemts
+ %s noņemts
+ *Uzmanību* Ignorēt paraksta verifikāciju, uzstādot APK, LSPosed vai pieredzējušiem lietotājiem
+ Sākuma ekrāna vilkšana
+ Saistīts ar noteiktu tīkla pakalpojumu
+ Serveris nevarēja nodrošināt jaunu paketi.
+ Nevarēja izveidot savienojumu ar serveri
+ Sekojošais repozitorijs netika atrasts
+ Shizuku nav palaists
+ Atvērt Shizuku
+ Starpniekservera ports var būt tikai vesels skaitlis
+ Nepieciešama fona piekļuve
+ Ir nepieciešama fona piekļuves atļauja, lai fona sinhronizācija darbotos korekti
+ Īpašs paldies
+ Izmantot noklusējuma uzstādītāju
+ Ignorēt parakstu
+ Satur darba vietai nepiemērotu saturu
+ Video
+ Nezināms (%d)
+
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 2bec10ba..220ed90f 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -21,7 +21,6 @@
റെപ്പോസിറ്റോറി ചേർക്കുകഎല്ലാ ആപ്പ്ലിക്കേഷനുകളുംനിങ്ങളുടെ എല്ലാ അപ്പ്ലിക്കേഷനുകളും പുതിയവ ആണ്
- പുതിയ അപ്പ്ലിക്കേഷനുകൾആപ്പുകൾ സ്വയമേവ അപ്ഡേറ്റ് ചെയ്യുകബഗ് ട്രാക്കർചേഞ്ച്ലോഗ്
@@ -86,11 +85,8 @@
ശേഖരം എഡിറ്റ് ചെയ്യുകസുരക്ഷാ പാളിച്ചകൾ ഉണ്ട്അസാധുവായ സെർവർ പ്രതികരണം.
- ടോപ്പ് ആപ്പ് ബാർ വികസിപ്പിക്കാൻ അനുവദിക്കുക
- മുകളിലെ ആപ്പ് ബാർ വികസിപ്പിക്കാനും ചുരുക്കാനും അനുവദിക്കുകരചയിതാവിന്റെ ഇമെയിൽരചയിതാവിന്റെ വെബ്സൈറ്റ്
- Period to check and remove downloaded files%s ഡൗൺലോഡ് ചെയ്യാനായില്ലഅപ്ഡേറ്റുകൾ സ്വയമേവ ഇൻസ്റ്റാൾ ചെയ്യാൻ ശ്രമിക്കുക%s ഡൗൺലോഡ് ചെയ്യുന്നു…
@@ -100,7 +96,6 @@
പാസ്വേഡ് കാണുന്നില്ലഅനുമതികൾ%s ആവശ്യമാണ്
- മാറ്റങ്ങൾ കാണുന്നതിന് Droid-ify പുനരാരംഭിക്കുകസോക്സ് പ്രോക്സിഅടുക്കൽ ക്രമംസിസ്റ്റം
@@ -108,9 +103,7 @@
നിങ്ങളുടെ പ്രവർത്തനം ട്രാക്ക് ചെയ്യുകയോ റിപ്പോർട്ടുചെയ്യുകയോ ചെയ്യുന്നുഅജ്ഞാത പിശക്.അജ്ഞാതം: %s
- ഒപ്പിടാത്തത്ഇൻസ്റ്റാളേഷൻ ആരംഭിക്കാൻ കാത്തിരിക്കുന്നു…
- ആരായുകഎല്ലാം അപ്ഡേറ്റ് ചെയ്യുകശരിരക്ഷിക്കും
@@ -123,9 +116,7 @@
വെബ്സൈറ്റ്വ്യക്തിഗതമാക്കൽലിങ്കുകൾ
- ലിസ്റ്റ് ആനിമേഷനുകൾലിങ്ക് ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി
- പ്രധാന പേജിൽ ലിസ്റ്റ് ആനിമേഷൻ കാണിക്കുക%d അപ്ലിക്കേഷനും ഒരു പുതിയ പതിപ്പ് ഉണ്ട്.%d അപ്ലിക്കേഷനും പുതിയ പതിപ്പുകൾ ഉണ്ട്.
@@ -137,15 +128,11 @@
പുതിയ പതിപ്പുകൾ ലഭ്യമാകുമ്പോൾ ഒരു അറിയിപ്പ് കാണിക്കുകവൈഫൈയിലും ചാർജിംഗിലും മാത്രംഅടുത്തിടെ അപ്ഡേറ്റ് ചെയ്തത്
- ഈ ശേഖരം ഇതുവരെ ഉപയോഗിച്ചിട്ടില്ല. ഇതിലെ ആപ്ലിക്കേഷനുകൾ കാണുന്നതിന് അത് ഓണാക്കുക.പങ്കിടുകറിപ്പോസിറ്ററികൾ സ്വയമേവ സമന്വയിപ്പിക്കുകഒപ്പിടാത്തത്. ആപ്ലിക്കേഷൻ ലിസ്റ്റ് പരിശോധിക്കാൻ കഴിഞ്ഞില്ല. ഒപ്പിടാത്ത റിപ്പോസിറ്ററികളിൽ നിന്ന് ആപ്ലിക്കേഷനുകൾ ഡൗൺലോഡ് ചെയ്യുന്നത് ശ്രദ്ധിക്കുക.അജ്ഞാതം
- നിശബ്ദ ഇൻസ്റ്റാളേഷൻ
- ലക്ഷ്യംഅസ്ഥിരമായ പതിപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ നിർദ്ദേശിക്കുക
- നിശബ്ദ ഇൻസ്റ്റാളുകൾക്ക് റൂട്ട് അനുമതി അനുവദിക്കുകകൂടുതൽ കാണിക്കുകവിശദാംശങ്ങൾ സംരക്ഷിക്കുന്നു…തിരയുക
@@ -167,14 +154,11 @@
പതിപ്പ് %sപതിപ്പുകൾഭാഷ
- ഇൻസ്റ്റാൾ ചെയ്ത ആപ്ലിക്കേഷനുകൾ
- അടുക്കുക & ഫിൽട്ടർ ചെയ്യുക%s ലൈസൻസ്ഭാരംകുറഞ്ഞമറ്റേതായസൂചിക ഫയൽ പാഴ്സുചെയ്യാൻ കഴിഞ്ഞില്ല.+%d കൂടുതൽ
- സ്ക്രീൻഷോട്ടുകൾഡൗൺലോഡ് ആരംഭിക്കാൻ കാത്തിരിക്കുന്നു…പുതിയതെന്താണ്വലിപ്പം
@@ -196,7 +180,6 @@
സംഭരണിയാണ്ശേഖരം ലഭ്യമല്ലകുറവ് കാണിക്കുക
- ഏറ്റവും പുതിയ%s തുറക്കുന്നു\?%s ലയിപ്പിക്കുന്നുപേര്
@@ -204,9 +187,7 @@
ഒരിക്കലുംലഭ്യമായ അപ്ലിക്കേഷനുകളുടെ പുതിയ പതിപ്പുകൾവിവരണം ലഭ്യമല്ല
- നിങ്ങൾക്ക് ഇന്റർനെറ്റ് കണക്ഷനില്ലഅത്തരം അപ്ലിക്കേഷനുകൾ കണ്ടെത്താൻ കഴിഞ്ഞില്ലഅപ്ലിക്കേഷനുകളുടെ എണ്ണംപാസ്വേഡ്
- പരിശോധിച്ചുറപ്പിച്ചിട്ടില്ല
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 0830ca9a..19185de8 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -4,8 +4,6 @@
Tambah repositoriAlamatSemua aplikasi anda adalah terkini
- Benarkan Bar Apl Dikembangkan
- Benarkan Bar Apl Dikembangkan dan TurunTelah wujudSelaluHitam
@@ -69,15 +67,12 @@
Alamat tidak sahFormat cap jari tidak sahMetadata tidak sah.
- SalinLancarkanLesen%s lesenCerahPautan disalinPautan
- Senaraikan Animasi
- Tunjukkan animasi senarai pada halaman utamaMaterial YouGuna tema warna material youMenggabungkan %s
@@ -88,7 +83,6 @@
Tiada aplikasi tersediaTiada aplikasi yang dipasangTiada deskripsi tersedia
- Anda tiada sambungan internetTidak dapat mencari sebarang aplikasi sedemikianTiada proksiMaklumkan untuk kemas kini
@@ -114,13 +108,9 @@
RepositoriRepositoriSimpan
- Tangkapan skrinKongsiSaizKredit Istimewa
- Aplikasi yang dipasang
- Isi & Tapis
- Aplikasi baharuMengandungi tidak selamat untuk kandungan kerjaSemua aplikasiAnti-ciri
@@ -128,7 +118,6 @@
Tidak boleh membuka pautanLog perubahanMenyemak repositori…
- Tempoh untuk menyemak dan mengalih keluar fail yang dimuat turunMenyambungkan…Gagal muat turun %sTidak dapat mengedit repositori kerana ia sedang disegerakkan sekarang.
@@ -170,14 +159,10 @@
Hanya pada Wi-FiMempromosikan perkhidmatan rangkaian bukan percumaMempromosikan perisian bukan percuma
- Repositori ini belum digunakan lagi. Buka untuk melihat aplikasi di dalamnya.Repositori berikut tidak ditemuiTidak ditandatangani. Tidak dapat mengesahkan senarai permohonan. Berhati-hati memuat turun aplikasi dari repositori yang tidak ditandatangani.Repositori tidak dapat dicapaiMemerlukan %s
- Mulakan semula Droid-ify untuk melihat perubahan
- Pasang Senyap
- Benarkan kebenaran root untuk pemasangan senyapMenyimpan butiran…AturanTUnjukkan lagi
@@ -199,7 +184,6 @@
Menyegerakan %s…SIstemKetik untuk memasang.
- SasaranTemaMenjejaki atau melaporkan aktiviti andaBahasa
@@ -208,9 +192,7 @@
Ralat tidak diketahui.Kemas kini yang tidak stabilTidak diketahui: %s
- Tidak ditandatanganiCadangkan memasang versi yang tidak stabil
- Tidak disahkanKemas kiniKemas kiniKod sumber huluan tidak percuma
@@ -226,7 +208,5 @@
Laman webPemperibadianTunjukkan Kurang
- Terbaharu
- TerokaKemaskini semua
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index ab8c3d83..5c7b3cf9 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -35,8 +35,6 @@
Ugyldig brukernavnsformat%s-lisensLenke kopiert
- Listeanimasjoner
- Vis liste animasjon på hovedsidenNye versjoner av programmer tilgjengeligIngen programmer tilgjengeligIngen programmer installert
@@ -61,9 +59,6 @@
PakkebrønnKrever %sUsignert. Kunne ikke bekrefte programlisten. Vær forsiktig med å laste ned programmer fra usignerte pakkebrønner.
- Stille installasjon
- Tillat rot-tilganger for stille installasjoner
- SkjermavbildningerSøkVelg et speilDel
@@ -78,15 +73,12 @@
SynkronisererSynkroniserer %s…System
- MålSynkroniser pakkebrønner automatiskDrakterSporer eller rapporterer din aktivitetUkjent feil.Ukjent: %s
- UsignertForeslå installasjon av ustabile versjoner
- UbekreftetBrukernavnKildekoden oppstrøms er ikke helt friNettside
@@ -166,15 +158,11 @@
Kildekoden er ikke lenger tilgjengeligOppgraderingerSeneste
- Denne pakkebrønnen har ikke blitt brukt enda. Skru den på for å vise programmene i den.OppgraderingSpråkPersonaliseringVis mindre
- Sorter og filtrer
- UtforskOpprenskningsintervall
- Period to check and remove downloaded filesDagDager
@@ -189,14 +177,8 @@
Rot-tilgangShizukuKun på Wi-Fi og når innplugget
- NyesteOppdater alle
- Installerte
- Nye
- Tillat utvidelse av toppfelt
- Du mangler tilkobling til InternettNoen av handlingene kunne ikke utføres.
- Tillat toppfeltet å utvide og folde seg sammenBruk «materiell deig»-fargedraktMaterial YouFavoritter
@@ -208,17 +190,15 @@
Installer nye versjoner av programmer automatiskVenter på å starte installasjon …Installerer
- Start Droid-ify på ny for å ta i bruk endringeneHar ufrie komponenterHjemmeskjermsdragningInneholder sensurerbart innholdShizuku kjører ikkeKunne ikke koble til tjenerTjeneren kunne ikke tilby ny pakke.
- KopierMellomtjenerport må være et heltallTillat bruker å dra mellom sider på hjemmeskjermenFølgende pakkebrønner ble funnetSpesiell takk tilShizuku er ikke installert
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 7c72d4e3..2dc8298c 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -15,7 +15,6 @@
Gecompileerd voor foutopsporingBevestigingBijwerken
- Niet geverifieerdGebruikersnaamDe upstream-broncode is niet vrijWachten op download…
@@ -36,15 +35,14 @@
Installatie van instabiele versies voorstellenDe index kon niet worden gevalideerd.Onbekend: %s
- Niet ondertekendInstabiele updates
- Foutenregistratie (bug tracker)
- Verbinden maken…
+ Bugtracker
+ Verbinden…Bevat niet-vrije mediaKan %s niet downloadenKan %s niet synchroniserenKan %s niet valideren
- Dankbetuigingen
+ CreditsDonkerVerwijderenOpslagplaats verwijderen\?
@@ -81,8 +79,7 @@
Licentie%s-licentieLicht
- Koppeling gekopieerd
- Animaties weergegeven
+ Link gekopieerd%s samenvoegenNooitNieuwe versies van apps beschikbaar
@@ -109,10 +106,8 @@
OpslagplaatsenOpslagplaatsVereist %s
- Root-rechten verlenen voor stille installatiesOpslaanDetails opslaan…
- SchermopnamenDelenMeer tonenHandtekening %s
@@ -127,7 +122,6 @@
%s synchroniseren…SysteemTik om te installeren.
- DoelVolgt of rapporteert jouw activiteitVerwijderenOnbekend
@@ -135,7 +129,6 @@
TaalPersonalisatieMinder tonen
- Geïnstalleerde applicatiesDonerenOpslagplaats bewerkenOngeldig bestandstype.
@@ -146,7 +139,6 @@
%d app heeft een nieuwe versie.%d apps hebben nieuwe versies.
- Lijstanimatie weergeven op de hoofdpaginaKan dergelijke applicaties niet vinden+%d meerInstellingen
@@ -156,7 +148,6 @@
Netwerkfout%s openen\?Proxy-poort
- Stille installatieGeleverd door %sBevordert niet-vrije softwareProxy
@@ -164,15 +155,10 @@
OverslaanNiet ondertekend. Kan de app-lijst niet verifiëren. Wees voorzichtig met het installeren van apps van niet ondertekende opslagplaatsen.Thema\'s
- Verkennen
- Sorteren & filterenZoekenOpslagplaatsen automatisch synchroniserenThema
- Nieuwste
- Nieuwe appsAlles bijwerken
- Deze opslagplaats is nog niet gebruikt. Schakel het in om de applicaties erin te bekijken.Ongeldig gebruikersnaamformaatKies een mirror%s downloaden…
@@ -183,7 +169,6 @@
Verouderde installatieSessie-installatieAPK-opschoningsinterval
- Periode om gedownloade bestanden te controleren en te verwijderenUurUren
@@ -192,14 +177,10 @@
DagDagen
- Geen internetverbindingAlleen bij Wi-Fi & OpladenKan bepaalde acties niet uitvoeren.
- Uitbreiding van topbalk toestaan
- Toestaan dat de topbalk kan uitbreiden en inklappenApps automatisch bijwerkenInstalleren
- Start Droid-ify opnieuw om de wijzigingen te zienFavorietenMaterial YouMaterial You kleurenthema gebruiken
@@ -212,7 +193,6 @@
Server heeft geen nieuw pakket geleverd.Kan geen verbinding maken met serverBevat niet-vrije onderdelen
- KopiërenProxy-poort moet een getal zijnAlle opslagplaatsen exporteren naar bestandAchtergrondtoegang is vereist om achtergrondsynchronisatie uit te voeren
@@ -222,8 +202,8 @@
De volgende opslagplaats is niet gevondenLaat de gebruiker vegen tussen pagina\'s in het startschermStartscherm vegen
- Kan koppeling niet openen
- Import/export
+ Kan link niet openen
+ Importeren/ExporterenInstellingen importerenInstellingen en favorieten importeren vanuit bestandInstellingen exporteren
@@ -242,9 +222,14 @@
Installatie misluktOnvoldoende ruimteEr is niet genoeg vrije ruimte op het apparaat om deze applicatie te installeren. Probeer wat ruimte vrij te maken
- De Shizuku-service is niet actief. Controleer a.u.b. de Shizuku-app
+ De Shizuku-service is niet actief. Controleer de Shizuku-appShizuku is niet actiefShizuku-toestemming ontbreektToestemming Shizuku-service is niet verleend. Controleer a.u.b. de Shizuku-appShizuku niet geïnstalleerd
+ Shizuku openen
+ Overschakelen naar standaard
+ Video
+ Het lijkt erop dat Shizuku niet is geïnstalleerd
+ Onbekend (%d)
diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml
index 4dfc6ca6..6a40173b 100644
--- a/app/src/main/res/values-nn/strings.xml
+++ b/app/src/main/res/values-nn/strings.xml
@@ -51,7 +51,6 @@
LjosLenkja skriven av til utklippstavlaLenkjer
- ListerørslerFlettar %sSambandsmistakAldri
@@ -82,10 +81,7 @@
SamlingOpphav ikkje stadfesta. Kunne ikkje stadfeste applista. Ver varsam med å hente appar ifrå samlingar med ustadfesta opphav.Hugs
- Tyst innlegging
- Gje rot-tilgjenge for tyste innleggingarHugsar småting…
- SkjermbileteSøkVis meirVis eldre utgåver
@@ -96,29 +92,24 @@
SOCKS-mellomtenarOrdningsrekkjefylgdKjeldekode
- Ikkje stadfestaKjeldekoden er ikkje lenger tilgjengelegSynkroniser samlingarSynkronisererSynkroniserer %s…SystemTrykk for å leggja inn.
- MålUtsjånadUtsjånadarSlettUkjendUkjend mistak.Ukjend: %s
- Opphav ikkje stadfestaUstø oppdateringarGje framlegg om å leggja inn ustø oppdateringarOppstraumskjeldekoden er ikkje friTilrådtLat samlingar synkronisera av seg sjølvSporar eller seier ifrå om kva du gjer
- Innlagde appar
- NyasteVis mindreSkriftmålNytt
@@ -128,7 +119,6 @@
UtgåverStell tilOppdater alle
- Sjå omkringGjerda mislukkastSvartUtgjevar e-post
@@ -146,8 +136,6 @@
UtgreiingHentarHentar %s …
- Nye appar
- Skil ut & Sil utBrukarnamnNettstadSaknar brukarnamn
@@ -157,7 +145,6 @@
BrigdeloggBrigdeKompilert for lysking
- Slett henta appinnleggingsfiler etter ei viss stundKunne ikkje synkronisera %sKunne ikkje hente %sHar tryggleikshòl
@@ -174,7 +161,6 @@
Vis apputgåver som ikkje høver i einingaHøver ikkje med %sLegg inn
- Vis listerørsler på hovudsidaNamnIngen appar er tilgjengelegeInga utgreiing tilgjengeleg
@@ -189,14 +175,10 @@
Passord%s-opphavsstadfestingMellomtenar
- Denne samlinga har ikkje vorte nytta endå. Slå ho på for å visa hennar appar.Opphav stadfesta ved bruk av ein utrygg algoritmeAlle appane dine er av nyaste utgåveKunne ikkje stadfeste indeksen.Kan ikkje gjere somme gjerder.
- Du har inkje internettsamband
- Lat applinja få utvide seg
- Lat den øvste applinja få utvide og minke segLikarReins noSlett uturvande filer
@@ -204,7 +186,6 @@
Slå på samlingaNytt «Material You»-letarMaterial You
- Byrje om Droid-ify for å sjå brigdeLegg innVentar på å leggja inn …Oppdater appane sjølvverkande
@@ -214,4 +195,4 @@
Shizuku er ikkje lagt innHar vakse innhaldGreidde ikkje å binda saman med tenaren
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
index ceda63d3..247ef438 100644
--- a/app/src/main/res/values-or/strings.xml
+++ b/app/src/main/res/values-or/strings.xml
@@ -14,8 +14,6 @@
+%d ଅଧିକପ୍ରକ୍ସି ପୋର୍ଟସଂଗ୍ରହାଳୟ ଗୁଡ଼ିକ
- ନୀରବ ସଂସ୍ଥାପନ ପାଇଁ Root ଅନୁମତି ଦିଅନ୍ତୁ
- ସ୍କ୍ରିନସଟ୍ପଠାନ୍ତୁପୁରାତନ ସଂସ୍କରଣଗୁଡିକ ଦେଖାନ୍ତୁଏକ ଅସୁରକ୍ଷିତ ଆଲଗୋରିଦମ ବ୍ୟବହାର କରି ଦସ୍ତଖତ
@@ -29,11 +27,7 @@
ସଂସ୍କରଣୱେବସାଇଟ୍କମ୍ ଦେଖନ୍ତୁ
- ଅନୁସନ୍ଧାନ କରନ୍ତୁସମସ୍ତଙ୍କର ଅଦ୍ୟତନ କରନ୍ତୁ
- ସଂସ୍ଥାପିତ ପ୍ରୟୋଗଗୁଡ଼ିକ
- ଫିଲ୍ଟର୍ ଏବଂ କ୍ରମ ବାଛନ୍ତୁ
- ନୂତନ ପ୍ରୟୋଗଗୁଡ଼ିକବିବରଣୀକାର୍ଯ୍ୟ ବିଫଳ ହେଲାସଂଗ୍ରହାଳୟ ଯୋଡନ୍ତୁ
@@ -52,7 +46,6 @@
ପରିବର୍ତ୍ତନAPK କ୍ଲିନଅପ ଅନ୍ତରାଳସଂଗ୍ରହାଳୟ ଯାଞ୍ଚ୍ ହେଉଛି…
- ଆହରଣ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଯାଞ୍ଚ ଏବଂ ଅପସାରଣ କରିବା ପାଇଁ ଅବଧିଅଣ-ମୁକ୍ତ ମିଡିଆ ଧାରଣ କରେବର୍ଣ୍ଣନାତ୍ରୁଟି ନିବାରଣ ପାଇଁ ସଂକଳିତ
@@ -116,9 +109,7 @@
ଆରମ୍ଭ କରନ୍ତୁଅବୈଧ ଉପଯୋଗକର୍ତ୍ତା ନାମ ଫର୍ମାଟ୍ଲାଇସେନ୍ସ
- ମୁଖ୍ୟ ପୃଷ୍ଠାରେ ତାଲିକା ଆନିମେସନ୍ ଦେଖାନ୍ତୁ%s ଲାଇସେନ୍ସ
- ଆନିମେସନ୍ ତାଲିକା କରସଂଯୋଗ ଗୁଡ଼ିକନେଟୱର୍କ ତ୍ରୁଟିକେବେନାହିଁ
@@ -147,23 +138,19 @@
ପ୍ରୋଜେକ୍ଟ ୱେବସାଇଟ୍ଅଣ-ମୁକ୍ତ ନେଟୱାର୍କ ସେବାକୁ ପ୍ରୋତ୍ସାହିତ କରେଅଣ ମୁକ୍ତ ସଫ୍ଟୱେର୍ କୁ ପ୍ରୋତ୍ସାହିତ କରେ
- ଯାଞ୍ଚ ହୋଇନାହିଁପ୍ରକ୍ସି ହୋଷ୍ଟ%s ଦ୍ଵାରା ପ୍ରଦାନ କରାଯାଇଛିପ୍ରକ୍ସିପ୍ରକ୍ସି ପ୍ରକାର
- ଏହି ସଂଗ୍ରହାଳୟ ଏପର୍ଯ୍ୟନ୍ତ ବ୍ୟବହୃତ ହୋଇନାହିଁ । ଏଥିରେ ଥିବା ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଏହାକୁ On କରନ୍ତୁ ।ଦସ୍ତଖତ ନାହି । ଆବେଦନ ତାଲିକା ଯାଞ୍ଚ ହୋଇପାରିଲା ନାହିଁ । ସାକ୍ଷରିତ ହୋଇନଥିବା ସଂଗ୍ରହାଳୟରୁ ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଡାଉନଲୋଡ୍ କରିଲାବେଳେ ସାବଧାନ ରୁହନ୍ତୁ।ସଞ୍ଚୟ କରନ୍ତୁସଂଗ୍ରହାଳୟ%s ଦରକାର ଅଟେ
- ନୀରବ ସଂସ୍ଥାପନବିବରଣୀ ଗୁଡ଼ିକ ସଞ୍ଚିତ ହେଉଛି…ସନ୍ଧାନ କରନ୍ତୁଏକ mirror ଚୟନ କରନ୍ତୁଅସ୍ଥିର ସଂସ୍କରଣ ସଂସ୍ଥାପନ କରିବାକୁ ପରାମର୍ଶ ଦିଅନ୍ତୁଅଧିକ ଦେଖାନ୍ତୁ
- ଦସ୍ତଖତ ନାହିଦସ୍ତଖତ %sଆକାରଉତ୍ସ କୋଡ୍
@@ -174,7 +161,6 @@
ସଂଗ୍ରହାଳୟଗୁଡିକ ସିଙ୍କ କରନ୍ତୁସିଙ୍କ୍ ହେଉଛିସଂସ୍ଥାପନ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ ।
- ଲକ୍ଷ୍ୟସଂଗ୍ରହାଳୟଗୁଡ଼ିକ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ସିଙ୍କ କରନ୍ତୁସିଷ୍ଟମ୍ଅଜ୍ଞାତ ତ୍ରୁଟି ।
@@ -192,11 +178,7 @@
ନୂତନ କଣ ଅଛିଭାଷାବ୍ୟକ୍ତିଗତକରଣ
- ସର୍ବଶେଷକିଛି କାର୍ଯ୍ୟଗୁଡିକ କରିବାକୁ ଅସମର୍ଥ ।
- ଆପଣଙ୍କର ଇଣ୍ଟରନେଟ୍ ସଂଯୋଗ ନାହିଁ
- ଟପ୍ ଆପ୍ ବାର୍ କୁ ବିସ୍ତାର କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ
- ଟପ୍ ଆପ୍ ବାର୍ କୁ ବିସ୍ତାର ଏବଂ ସଙ୍କୁଚିତ ହେବାକୁ ଅନୁମତି ଦିଅନ୍ତୁMaterial You ରଙ୍ଗ ବ୍ୟବହାର କରନ୍ତୁMaterial Youଅନାବଶ୍ୟକ ଫାଇଲଗୁଡିକ ସଫା କରନ୍ତୁ
@@ -207,7 +189,6 @@
ଅଟୋ ଅପଡେଟ୍ ଆପ୍ସସ୍ୱୟଂଚାଳିତ ଭାବରେ ଆପ୍ ଗୁଡିକ ସଂସ୍ଥାପନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁସଂସ୍ଥାପନ କରୁଅଛି
- ପରିବର୍ତ୍ତନଗୁଡିକ ଦେଖିବାକୁ Droid-ify ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁସ୍ଥାପନ ଆରମ୍ଭ କରିବାକୁ ଅପେକ୍ଷା…ଅଣ ମୁକ୍ତ ଉପାଦାନଗୁଡ଼ିକ ଅଛିସର୍ଭର ନୂତନ ପ୍ୟାକେଟ ପ୍ରଦାନ କରିବାରେ ବିଫଳ ହୋଇଛି ।
@@ -218,7 +199,6 @@
ହୋମ ସ୍କ୍ରିନରେ ପୃଷ୍ଠାଗୁଡ଼ିକ ମଧ୍ୟରେ ଚାଳକକୁ ସ୍ୱାଇପ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁବିଶେଷ କ୍ରେଡିଟ୍Shizuku ସ୍ଥାପିତ ହୋଇନାହିଁ
- ନକଲ କରନ୍ତୁପ୍ରକ୍ସି ପୋର୍ଟ କେବଳ ଗୋଟିଏ ପୂର୍ଣ୍ଣସଂଖ୍ୟା ହୋଇପାରେନିମ୍ନଲିଖିତ ସଂଗ୍ରହାଳୟ ମିଳିଲା ନାହିଁସେଟିଂସମୂହ ଇମ୍ପୋର୍ଟ୍ କରନ୍ତୁ
@@ -242,4 +222,4 @@
ଅନ୍-ଇନଷ୍ଟଲ୍ ହୋଇ ଯାଇଛି%s ଇନସ୍ଟଲ କରିବାରେ ଅସଫଳଏହି ଆପ୍ଲିକସନ୍ କୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ଫୋନ୍ ରେ ଯଥ୍ୟେଷ୍ଟ ଜାଗା ନାହି।କିଛି ଜାଗା ସଫା କରି ଚେଷ୍ଟା କରନ୍ତୁ।
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 217bbb8c..1f89c597 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -33,7 +33,6 @@
ਬਦਲਾਅਰਿਪੋਜ਼ਟਰੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…APK ਕਲੀਨਅੱਪ ਅੰਤਰਾਲ
- ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਮਿਆਦਡੀਬੱਗਿੰਗ ਲਈ ਕੰਪਾਇਲ ਕੀਤਾਜੁੜ ਰਿਹਾ ਹੈ…ਗੈਰ-ਮੁਕਤ ਮੀਡੀਆ ਸ਼ਾਮਲ
@@ -85,8 +84,6 @@
ਸਫ਼ੈਦਲਿੰਕ ਕਾਪੀ ਹੋਇਆਲਿੰਕ
- ਐਨੀਮੇਸ਼ਨਾਂ ਦੀ ਸੂਚੀ ਵਿਖਾਓ
- ਮੁੱਖ ਪੰਨੇ \'ਤੇ ਸੂਚੀ ਐਨੀਮੇਸ਼ਨ ਦਿਖਾਓ%s ਨੂੰ ਮਿਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈਨਾਮਨੈੱਟਵਰਕ ਤਰੁੱਟੀ
@@ -126,12 +123,9 @@
ਰਿਪੋਜ਼ਟਰੀਆਂਰਿਪੋਜ਼ਟਰੀ%s ਦੀ ਲੋੜ ਹੈ
- ਮੂਕ ਇੰਸਟਾਲਵੇਰਵੇ ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ…ਸੁਰੱਖਿਅਤ ਕਰੋ
- ਸਕਰੀਨਸ਼ਾਟਖੋਜ
- ਮੂਕ ਇੰਸਟਾਲ ਲਈ ਰੂਟ ਅਨੁਮਤੀ ਦਿਓਇੱਕ ਮਿਰਰ ਚੁਣੋਸ਼ੇਅਰ ਕਰੋਹੋਰ ਦਿਖਾਓ
@@ -150,21 +144,17 @@
ਸਿੰਕ ਹੋ ਰਿਹਾ ਹੈ%s ਨੂੰ ਸਿੰਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।
- ਟੀਚਾਥੀਮਥੀਮਅਣਇੰਸਟਾਲ ਕਰੋਅਗਿਆਤਅਗਿਆਤ ਤਰੁੱਟੀ।ਅਗਿਆਤ: %s
- ਬਿਨਾਂ-ਦਸਤਖਤ
- ਅਸਪਸ਼ਟਅੱਪਡੇਟਅੱਪਡੇਟਾਂਅੱਪਸਟ੍ਰੀਮ ਸਰੋਤ ਕੋਡ ਮੁਫ਼ਤ ਨਹੀਂ ਹੈਵਰਤੋਂਕਾਰ ਦਾ ਨਾਮਵਰਤੋਂਕਾਰ ਨਾਮ ਗੁੰਮ ਹੈ
- ਨਵੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂਸੰਸਕਰਣਸੰਸਕਰਣ %sਸੰਸਕਰਣਾਂ
@@ -173,10 +163,7 @@
ਭਾਸ਼ਾਵਿਅਕਤੀਗਤਕਰਨਥੋੜਾ ਦਿਖਾਓ
- ਨਵੀਨਤਮ
- ਪੜਚੋਲ ਕਰੋਸਭ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ
- ਕ੍ਰਮਬੱਧ ਅਤੇ ਫਿਲਟਰ ਕਰੋਕਾਰਜ ਅਸਫਲਰਿਪੋਜ਼ਟਰੀ ਸ਼ਾਮਿਲ ਕਰੋਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਅੱਪਡੇਟ ਹਨ
@@ -191,12 +178,7 @@
ਪੜਚੋਲਹਾਲ ਹੀ ਵਿੱਚ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆਪ੍ਰੌਕਸੀ ਦੀ ਕਿਸਮ
- ਇਹ ਰਿਪੋਜ਼ਟਰੀ ਅਜੇ ਤੱਕ ਵਰਤੀ ਨਹੀਂ ਗਈ ਹੈ। ਇਸ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਇਸਨੂੰ ਚਾਲੂ ਕਰੋ।
- ਇੰਸਟਾਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂਇਹ ਸੰਸਕਰਣ ਤੁਹਾਡੀ ਡਿਵਾਈਸ \'ਤੇ ਇੰਸਟਾਲ ਕੀਤੇ ਗਏ ਸਰਟੀਫਿਕੇਟ ਨਾਲੋਂ ਵੱਖਰੇ ਪ੍ਰਮਾਣ ਪੱਤਰ ਨਾਲ ਹਸਤਾਖਰਿਤ ਕੀਤਾ ਗਿਆ ਹੈ। ਪਹਿਲਾਂ ਇਸਨੂੰ ਅਣਇੰਸਟਾਲ ਕਰੋ।
- ਤੁਹਾਡਾ ਇੰਟਰਨੈੱਟ ਕੁਨੈਕਸ਼ਨ ਜੁੜਿਆ ਹੋਇਆ ਨਹੀਂ ਹੈ
- ਸਿਖਰ ਐਪ ਬਾਰ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਦਿਓ
- ਸਿਖਰ ਦੀ ਐਪ ਬਾਰ ਨੂੰ ਫੈਲਾਉਣ ਅਤੇ ਸਮੇਟਣ ਦਿਓMaterial YouMaterial you ਰੰਗ ਥੀਮ ਦੀ ਵਰਤੋਂ ਕਰੋਮਨਪਸੰਦ
@@ -205,7 +187,6 @@
ਬੇਲੋੜੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਸਾਫ਼ ਕਰਦਾ ਹੈਐਪਸ ਨੂੰ ਆਟੋ ਅੱਪਡੇਟ ਕਰੋਇੰਸਟਾਲ ਕਰ ਰਿਹਾ ਹੈ
- ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ Droid-ify ਨੂੰ ਰੀਸਟਾਰਟ ਕਰੋਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓਅੱਪਡੇਟਾਂ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋਇੰਸਟਾਲੇਸ਼ਨ ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…
@@ -218,7 +199,6 @@
ਵਿਸ਼ੇਸ਼ ਕ੍ਰੈਡਿਟਹੋਮ ਸਕ੍ਰੀਨ ਸਵਾਈਪਿੰਗਉਪਭੋਗਤਾ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪੰਨਿਆਂ ਦੇ ਵਿਚਕਾਰ ਸਵਾਈਪ ਕਰਨ ਦਿਓ
- ਕਾਪੀ ਕਰੋਪ੍ਰੌਕਸੀ ਪੋਰਟ ਸਿਰਫ਼ ਪੂਰਨ ਅੰਕ ਹੋ ਸਕਦਾ ਹੈਹੇਠ ਦਿੱਤੀ ਰਿਪੋਜ਼ਟਰੀ ਨਹੀਂ ਮਿਲੀਆਯਾਤ ਸੈਟਿੰਗਾਂ
@@ -240,4 +220,16 @@
ਇੰਸਟਾਲੇਸ਼ਨ ਅਸਫਲ ਰਹੀLSPosed ਉਪਭੋਗਤਾਵਾਂ ਜਾਂ ਉੱਨਤ ਉਪਭੋਗਤਾਵਾਂ ਲਈ, apk ਸਥਾਪਤ ਕਰਨ ਵੇਲੇ ਹਸਤਾਖਰਾਂ ਦੀ ਤਸਦੀਕ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ%s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ
-
\ No newline at end of file
+ Shizuku ਨਹੀਂ ਚਲ ਰਹੀ
+ ਵੀਡੀਓ
+ ਨਾਕਾਫ਼ੀ ਜਗ੍ਹਾ
+ Shizuku ਸੇਵਾ ਨਹੀਂ ਚੱਲ ਰਹੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ Shizuku ਐਪ ਵਿੱਚ ਜਾਂਚ ਕਰੋ
+ ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਡਿਵਾਈਸ \'ਤੇ ਕਾਫ਼ੀ ਖਾਲੀ ਜਗ੍ਹਾ ਨਹੀਂ ਹੈ। ਕੁਝ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ
+ Shizuku ਸੇਵਾ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ Shizuku ਐਪ ਵਿੱਚ ਚੈੱਕ ਕਰੋ
+ Shizuku ਇੰਸਟਾਲ ਨਹੀਂ ਹੋਇਆ ਜਾਪਦਾ
+ Shizuku ਇਜਾਜ਼ਤ ਗੁੰਮ ਹੈ
+ Shizuku ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ
+ Shizuku ਖੋਲ੍ਹੋ
+ ਡਿਫ਼ਾਲਟ \'ਤੇ ਸਵਿਚ ਕਰੋ
+ ਅਗਿਆਤ (%d)
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 56cc47fe..1bcf40d3 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,7 +1,6 @@
Czarny
- TarczaWersjaIndeks nie mógł zostać zatwierdzony.Strona
@@ -9,12 +8,10 @@
Wersja %sBrak nazwy użytkownikaOczekiwanie na rozpoczęcie pobierania…
- NiezweryfikowanyNazwa użytkownikaAktualizacjeSugeruj instalację niestabilnych wersjiNiestabilne aktualizacje
- NieoznaczonyNieznany błąd.OdinstalujŚledzenie lub raportowanie aktywności użytkownika
@@ -30,7 +27,7 @@
Już istniejeNieznanyMotywy
- Stuknij , aby zainstalować.
+ Stuknij, aby zainstalować.Automatyczna synchronizacja repozytoriówSynchronizacjaSynchronizacja %s…
@@ -52,9 +49,7 @@
Typ proxyRepozytoriumOstatnio uaktualnione
- Cicha instalacjaWymaga %s
- Zrzuty ekranuKod źródłowyPorządek sortowaniaProxy SOCKS
@@ -96,7 +91,6 @@
Ta wersja jest starsza niż ta zainstalowana na Twoim urządzeniu. Odinstaluj ją najpierw.Twoja platforma %1$s nie jest obsługiwana. Obsługiwane platformy: %2$s.Jasny
- Animacje listyŁączenie %sBrak dostępnych aplikacjiNie znaleziono pasujących aplikacji
@@ -121,7 +115,6 @@
UruchomLicencjaSkopiowano link
- Włącz animację listy na stronie głównejWedług nazwyBłąd sieciNigdy
@@ -141,7 +134,6 @@
Nie można sprawdzić spójności.Podpis %sUdostępnij
- To repozytorium nie jest jeszcze używane. Musisz je włączyć, aby zobaczyć aplikacje, które udostępnia.OKNieprawidłowe uprawnienia.Niekompatybilne wersje
@@ -156,7 +148,6 @@
%d nowych aktualizacji.%d nowych aktualizacji.
- Zezwól na uprawnienia roota dla cichych instalacjiRepozytoriaNiekompatybilne z %sZainstaluj
@@ -173,19 +164,13 @@
JęzykPersonalizacjaPokaż mniej
- Zainstalowane aplikacje
- Sortowanie i filtrowanie
- Nowe aplikacjeInstalatorNative (starszy)Session (nowszy)ROOTShizuku
- Najnowsza
- PoznajAktualizuj wszystkieInterwał oczyszczania plików apk
- Okres sprawdzania i usuwania pobranych plikówdzieńdni
@@ -200,14 +185,10 @@
godzinNie można wykonać niektórych działań.
- Nie masz połączenia z internetem
- Rozwijalny górny pasek aplikacji
- Zezwalaj na rozwijanie i zwijanie górnego paska aplikacjiMotyw kolorystyczny Material YouSilnik motywu MonetWłącz repozytoriumInstalowanie
- Uruchom Droid-ify ponownie, aby zastosować zmianyOczekiwanie na rozpoczęcie instalacji…UlubioneWymuś oczyszczenie
@@ -224,7 +205,6 @@
Nie udało się połączyć z serweremPrzewijanie ekranu głównegoPozwala użytkownikowi na przesuwanie palcem między stronami na ekranie głównym
- KopiujPort proxy może być tylko liczbą naturalnąNie znaleziono następującego repozytoriumPrzywróć ustawienia
@@ -248,4 +228,14 @@
*Uwaga* Ignorowanie weryfikacji podpisu podczas instalacji apk, dla użytkowników LSPosed lub zaawansowanych użytkownikówZa mało miejscaNie można zainstalować aplikacji z powodu małej ilości miejsca na urządzeniu. Zwolnij trochę miejsca
-
\ No newline at end of file
+ Shizuku nie działa
+ Usługa Shizuku nie działa, sprawdź aplikację Shizuku
+ Brak uprawnienia Shizuku
+ Nie przyznano uprawnienia usługi Shizuku. Sprawdź w aplikacji Shizuku
+ Wygląda na to, że Shizuku nie jest zainstalowane
+ Otwórz Shizuku
+ Przełącz na domyślny
+ Nieznany (%d)
+ Shizuku nie jest zainstalowane
+ Wideo
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 50ba2298..71c6ffed 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -77,8 +77,6 @@
ClaroLink copiadoLinks
- Animação da lista
- Mostrar a animação da lista na página principalIncorporando %sNomeErro da rede
@@ -120,14 +118,10 @@
Atualização recenteRepositóriosRepositório
- Este repositório ainda não foi usado. Ative-o para visualizar os aplicativos nele.Sem assinatura. Não foi possível verificar a lista de aplicativos. Tenha cuidado ao baixar aplicativos de repositórios não assinados.Requer %s
- Instalação Silenciosa
- Permitir acesso root para instalações silenciosasSalvarSalvando detalhes…
- Capturas de telaPesquisarSelecione um mirrorCompartilhar
@@ -148,7 +142,6 @@
Sincronizando %s…Seguir o do sistemaToque para instalar.
- MetaTemaTemasRastreia ou relata sua atividade
@@ -156,10 +149,8 @@
DesconhecidoError desconhecido.Desconhecido: %s
- Sem assinaturaAtualizações instáveisSugerir instalar versões instáveis
- Não verificadoAtualizarAtualizaçõesO código-fonte upstream não é gratuito
@@ -175,19 +166,13 @@
IdiomaPersonalizaçãoMostrar Menos
- Aplicativos instalados
- Mais recentes
- ExplorarAtualizar tudo
- Ordenar e Filtrar
- Novos aplicativosInstaladorInstalador antigoInstalador ShizukuInstalador rootInstalador de sessãoIntervalo de limpeza do APK
- Período para verificar e remover arquivos baixadosDiaDias
@@ -200,9 +185,6 @@
Apenas no Wi-Fi e CarregandoIncapaz de executar certas ações.
- Você não tem conexão com a internet
- Permite que a barra de aplicativos superior seja expandida e recolhida
- Permitir que a Barra Superior de Aplicativos se ExpandaUse o tema de material you coresMaterial YouFavoritos
@@ -211,7 +193,6 @@
Repositório inacessívelAtivar o repositórioInstalando
- Reinicie o Droid-ify para ver as alteraçõesAguardando para iniciar a instalação…Atualizar aplicativos automaticamenteTente instalar atualizações automaticamente
@@ -224,7 +205,6 @@
Contém conteúdo não apropriado para menores de 18 anosShizuku não está em execuçãoImportar configurações e favoritos de um arquivo
- CopiarExportar configuraçõesA Porta Proxy deve ser um inteiroExportar todos os repositórios para um arquivo
@@ -246,4 +226,4 @@
%s foi desinstaladoIgnore a verificação de assinatura ao instalar o apk, para usuários LSPosed ou usuários avançadosIgnorar Assinatura
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 22b211b9..609b0d7f 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -36,7 +36,6 @@
Mostrar versões antigasA sincronizar %s…Tema
- RecentesPretoTodas as aplicaçõesTodas as aplicações estão atualizadas
@@ -72,8 +71,6 @@
ClaroLigação copiadaLigações
- Animação de listas
- Animar lista da página principalNuncaNovas versões disponíveis
@@ -92,17 +89,12 @@
TipoAtualizadas recentementeRepositórios
- Este repositório ainda não foi usado. Ative-o para ver as aplicações existentes.Guardar
- Não assinadaO código fonte principal não é livreVersão %sVersõesÀ espera para descarregar…Site
- Aplicações instaladas
- Ordenar e filtrar
- Novas aplicaçõesAdicionar repositórioRemover este repositório\?Editar repositório
@@ -145,14 +137,11 @@
Palavra-passe em faltaRepositórioRequer %s
- Instalação silenciosaA guardar detalhes…
- Usar root para instalações sem interaçãoSelecione um espelhoPartilharProxy SOCKSSugeridas
- ImagensMostrar maisOrdenaçãoCódigo fonte
@@ -166,7 +155,6 @@
Mostrar menosAssinada com um algoritmo inseguroSincronizar repositórios automaticamente
- DestinoDesinstalarTemasNão foi possível validar o índice.
@@ -174,9 +162,7 @@
Erro desconhecido.Desconhecido: %sAtualizações instáveis
- Não verificadaSugerir instalação de versões instáveis
- ExplorarAtualizar tudoInstalador antigoInstalador
@@ -184,7 +170,6 @@
Instalador ShizukuInstalador da sessãoIntervalo de limpeza de APK
- Período para verificar e remover ficheiros descarregadosDiaDias
@@ -196,10 +181,7 @@
HorasHoras
- Permitir expansão da barra de aplicaçõesNão foi possível executar algumas ações.
- Permitir recolha/expansão da barra superior de aplicações
- Não existe qualquer ligação à InternetUsar tema de cores Material YouMaterial YouFavoritos
@@ -209,7 +191,6 @@
Ativar repositórioÀ espera para começar a instalação…A instalar
- Reinicie Droid-ify para ver as alteraçõesAtualizações automáticasTentar atualizar aplicações automaticamenteTem componentes não livres
@@ -221,7 +202,6 @@
Créditos especiaisDeslize no ecrã principalPermitir deslize para trocar de páginas no ecrã principal
- CopiarApenas pode usar um número inteiro para a porta do proxyNão foi possível encontrar o repositório seguinteImportar definições
@@ -245,4 +225,11 @@
*AVISO* Ignorar verificação de assinatura nas instalações (utilizadores Lposed/avançados)Espaço insuficienteNão existe espaço livre no dispositivo para instalar a aplicação. Experimente libertar algum espaço.
-
\ No newline at end of file
+ Abrir Shizuku
+ O serviço Shizuku não está a ser executado. Verifique se iniciou a aplicação.
+ Shizuku não está em execução
+ Permissão Shizuku não concedida
+ Utilizar predefinição
+ Vídeo
+ Desconhecido (%d)
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index d3a0786e..1f395b8d 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -26,11 +26,8 @@
Nesemnat. Nu se poate verifica lista de aplicații. Ai grijă când descarci aplicații din depozite nesemnate.SalveazăSe salvează detalii…
- Capturi de ecranSemnătură %s
- NesemnatNume de utilizator
- Aplicații noiAplicația %d are o nouă versiune.%d aplicații cu versiuni noi.
@@ -44,8 +41,6 @@
AdresăToate aplicațiileToate aplicațiile tale sunt la zi
- Permiteți extinderea barei superioare a aplicației
- Permiteți ca bara superioară a aplicației să se extindă și să se prăbușeascăExistă dejaNegruFuncții-Anti
@@ -112,8 +107,6 @@
Permisiuni invalide.Link copiat în clipboardLink-uri
- Listă de Animații
- Afișează lista de animații pe pagina principalăMaterial tuFolosește tema de culoare Material YouNume
@@ -122,7 +115,6 @@
Noi versiuni de aplicații disponibileNicio aplicație disponibilăNicio descriere disponibilă
- Nu ai conexiune la internetFără proxyNotifică despre noi versiuni ale aplicațiilorNumăr de aplicații
@@ -147,11 +139,8 @@
Actualizat recentDepoziteDepozit
- Acest depozit nu a fost utilizat încă. Activează-l pentru a vedea aplicațiile din el.Depozit inaccesibilNecesită %s
- Instalare silențioasă
- Acordă permisiunea root pentru instalații silențioaseProxyCautăSelectează o oglindă
@@ -171,7 +160,6 @@
Se sincronizează %s…SistemApasă pentru a instala.
- ȚintăTemăTemeDezinstalează
@@ -180,7 +168,6 @@
Necunoscut: %sActualizări instabileSugerează instalarea de versiuni instabile
- NeverificatActualizeazăActualizăriCodul sursă din amonte nu este gratuit
@@ -195,21 +182,15 @@
SitePersonalizareArată mai puțin
- Ultima
- ExploreazăActualizează tot
- Aplicații instalate
- Sortează și filtreazăÎntotdeaunaExploreazăNu se poate edita depozitul când se sincronizează acum.
- Period to check and remove downloaded filesConfirmațieSe conectează…Nu se poate descărca %sActualizare automată a aplicațiilorSe așteaptă începerea instalării…Încercați să instalați actualizările automat
- Reporniți Droid-ify pentru a vedea modificărileInstalarea
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index aff27851..604ad328 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -75,8 +75,6 @@
СветлаяСсылка скопированаСсылки
- Анимация списков
- Показывать анимацию списка на главной страницеСлияние %sИмяОшибка сети
@@ -119,14 +117,10 @@
Недавно обновлённыеРепозиторииРепозиторий
- Этот репозиторий ещё не использовался. Вам необходимо включить его для просмотра находящиеся в нем приложений.Подпись отсутствует. Невозможно проверить список приложений. Будьте осторожны, загружая приложения из неподписанных репозиториев.Требуется %s
- Тихая установка
- Предоставьте root-права для включения тихой установкиСохранитьСохранение данных…
- Снимки экранаПоискВыберите зеркалоПоделиться
@@ -147,7 +141,6 @@
Синхронизация %s…Как в системеНажмите, чтобы установить.
- ЦелевойТемаТемыОтслеживает и передаёт информацию о вашей активности
@@ -155,10 +148,8 @@
НеизвестноНеизвестная ошибка.Неизвестно: %s
- НеподписанныйНестабильные обновленияПредлагать установить нестабильные версии
- НепроверенныйОбновитьОбновленияВышестоящий исходный код несвободен
@@ -178,14 +169,8 @@
Устаревший установщикУстановщик через RootУстановщик через Shizuku
- Новое
- ОбзорОбновить все
- Установленные приложения
- Сортировать и фильтровать
- Новые приложенияСессионный установщик
- Период удаления скачанных файловИнтервал удаления APKдень
@@ -201,9 +186,6 @@
Только по Wi-Fi и на зарядкеНевозможно выполнить определённые действия.
- Отсутствует подключение к интернету
- Расширение верхней панели
- Верхняя панель приложения будет сворачиваться и разворачиватьсяMaterial YouИспользовать цветовую тему Material YouИзбранное
@@ -211,7 +193,6 @@
Произвести очисткуУдаление лишних файловВключить репозиторий
- Перезапустите Droid-ify для применения измененийУстановкаОжидание начала установки…Автообновление приложений
@@ -225,7 +206,6 @@
Особая благодарностьЖесты на главном экранеРазрешить использование жестов на главном экране
- КопироватьЭти репозитории не были найденыПорт прокси должен быть целым числомИмпорт настроек
@@ -257,4 +237,6 @@
Shizuku, похоже, не установленОткрыть ShizukuИспользовать установщик по умолчанию
+ Неизвестно (%d)
+ Видео
diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml
index 4e320b6a..a70abc5d 100644
--- a/app/src/main/res/values-ryu/strings.xml
+++ b/app/src/main/res/values-ryu/strings.xml
@@ -86,8 +86,6 @@
ライトリンクぬコピーさりやびたんリンク
- リストアニメーション
- メインページっしリストアニメーションすん%d くぬアプリっしみーさるバージョンがいようかのうやいびーん。%d くぬアプリっしみーさるバージョンがいようかのうやいびーん。
@@ -120,10 +118,8 @@
さいきんぬこうしんリポジトリ%s やしがふぃちよう
- サイレントインストールふずんしーょうさいふずんそーいびーん…
- スクリーンショットきんさくミラーしんたくちゅーゆーいん
@@ -145,17 +141,14 @@
%sちゃーきちゅう…システムタップしインストールさびーん。
- ターゲットテーマテーマうんじゅがこうどうちいしきまたーほうくーくさびーんアンインストールふめいうぅいなエラーやいびーん。ふめいうぅい: %s
- しょめいなしふあんていなアップデートふあんていなバージョンぬインストールていあんさびーん
- みきんしょうアップデートアップデートアップストリームぬソースコードーふじゆーいんやいびーん
@@ -171,14 +164,9 @@
ぎんぐくじーるしっていひょうじふぃならすん
- さいしん
- たんさくまじりアップデート
- インストールさりとーるアプリ
- みーさるアプリたんさくAPK ぬじちゃークリーンアップかんかく
- ダウンロードじみファイルぬかくにんとぅさくじょうくなうかんかくちぬーはんたくちくそーいびーん。ちゃーきちゅうなぬでぃリポジトリへんしゅうなやびらん。クレジット
@@ -190,13 +178,7 @@
プロキシホストプロキシポートプロキシタイプ
- くぬリポジトリーなーらささりやびらん。オンなしねー、リポジトリねーんぬアプリかくにんなやびーん。
- サイレントインストールじぬrootきんぎんちーょかする
- ならべいがいとぅフィルター
- トップアプリバーぬかくはべるきょかしーん
- トップアプリバーぬかくだい・しゅくさかのうなさびーんとぅくていぬアクションじっこうなやびらん。
- インターネットしちずくがあいびらんアプリじちゃーっしアップデートすんアップデートじちゃーてぃきんかいインストールするぐとぅさびーんインストール
@@ -208,17 +190,15 @@
ちゅーしちちーがクリーンアップさびーんじょうはべるファイルクリーンアップさびーんMaterial Youぬカラーテーマしーようさびーん
- Droid-ifyさいきぬーんちへんかんかくにんすんふじゆーるなコンポーネントくくまびーんホームやしがみんぬスワイプコンテンツんかえーあんさんやあらんむんがくくまっとーいびーんShizukuがんじゅちゃびらんサーバーなさちどーくなやびらんたんサーバーやみーさるパケットていきょうなやびらんたん。
- コピープロキシポートーせいするうぬみやいびーんホームやしがみんっしページかんスワイプないるぐとぅすんちぎぬリポジトリぬみちかやびらんたんスペシャルクレジットShizukuやしがインストールさりやびらん
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index b1729ce7..d07719ea 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -45,7 +45,6 @@
Neveljaven podpis.ZaženiSvetlo
- Prikaži animacijo seznama na glavni straniNa voljo so nove posodobitveNikoliNapaka omrežja
@@ -66,18 +65,14 @@
ProksiSkladiščaPotrebuje %s
- Tiha namestitevShraniShranjevanje podrobnosti …
- Posnetki zaslonaPreskočiPredlaganoSinhronizacijaTeme
- TarčaNeznanoOdstrani
- NepodpisanPosodobitevRazličicaRazličice
@@ -110,7 +105,6 @@
Izvorna kodaSinhroniziraj skladiščaAvtomatično sinhroniziraj skladišča
- To skladišče še ni bilo uporabljeno. Aktivirajte ga, da vidite aplikacije, ki jih vsebuje.Podpis %sVsebuje neproste odvisnostiNezdružljiva različica
@@ -126,7 +120,6 @@
DeliPokaži večPokaži starelše različice
- NepreverjenoManjka uporabniško imeUredi skladiščeNeveljavna oblika datoteke.
@@ -148,7 +141,6 @@
Ni podpisano. Seznama prijav ni bilo mogoče preveriti. Bodite previdni pri prenašanju aplikacij iz nepodpisanih skladišč.Predlagajte namestitev nestabilnih posodobitevNestabilne posodobitve
- Dovolite korenske pravice za tihe namestitveProksi gostiteljTapnite za namestitev.Sledi ali beleži vašo dejavnost
@@ -165,7 +157,6 @@
Podpisano z nevarnim algoritmomIzberite ogledalo
- Prikaži animacijePovezaveSpajanje %sIme
@@ -173,12 +164,7 @@
JezikPersonalizacijaPokaži manj
- Najnovejše
- RaziščiPosodobi vse
- Nameščene aplikacije
- Razvrsti in filtriraj
- Nove aplikacijeDanDneva
@@ -193,16 +179,12 @@
Samo med polnjenjem in aktiviranim Wi-Fi-jemNamestitveni program
- Časovno obdobje za preverjanje in odstranitev prenesenih datotekInterval čiščenja APK datotekKorenski namestitveni programStari namestitveni programSejni namestitveni programShizuku namestitveni programDoločenih dejanj ni mogoče izvesti.
- Nimate internetne povezave
- Dovoli razširitev zgornje vrstice aplikacij
- Dovoli razširitev in strnitev zgornje vrstice aplikacijPriljubljeneMaterial YouUporabite barvno shemo Material You
@@ -211,8 +193,7 @@
Aktiviraj skladiščeOdstrani podvojene datotekeNameščanje
- Znova zaženite Droid-ify, da vidite spremembeČakanje na začetek namestitve …Samodejno posodobite aplikacijePoskusite samodejno namestiti posodobitve
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index e60bef60..f494add5 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -30,14 +30,12 @@
Ваш %1$s (верзија API-ја %2$d) није подржан. %3$sСамо на Wi-Fi мрежиЛозинка
- НепотписаноИнтервал чишћења APK-аНепотписано. Није могуће проверити листу апликација. Будите пажљиви при преузимању апликација из непотписаних репозиторијума.Садржи садржај који није безбедан за радИзаберите резервни изворИма неслободне компонентеПромовише неслободне мрежне услуге
- Приказује анимацију листе на главној странициСинхронизација %s…ОмиљеноПрати или пријављује вашу активност
@@ -50,11 +48,9 @@
Чека се почетак преузимања…Покушајте да аутоматски инсталирате ажурирањаПреузимање
- ИстражиПриказује обавештење када су нове верзије доступнеПредложеноДозволе
- Сортирај и филтрирајОтворити %s\?Није могуће потврдити индекс.Доступне су нове верзије апликација
@@ -72,7 +68,6 @@
ИнсталирањеВаша платформа %1$s није подржана. Подржане платформе: %2$s.Репозиторијум је недоступан
- Рестартујте Droid-ify да бисте видели променеНедостаје корисничко имеПовезивање…Ажурирање
@@ -85,7 +80,6 @@
Недостаје лозинкаОписMaterial You
- ЦиљЧека се почетак инсталације…ИнсталираноНазив
@@ -96,7 +90,6 @@
Верзија %sСветлаСве апликације
- Инсталиране апликацијеПорт проксијаЗахтева %sИзбриши
@@ -114,10 +107,7 @@
Линк је копиранОбрада %1$s…Програм за инсталацију „Shizuku“
- Нове апликације
- КопирајДеинсталирај
- Немате интернет везуПрескочиПреузета је апликација %sНије могуће изменити репозиторијум, јер се тренутно синхронизује.
@@ -127,7 +117,6 @@
Мрежна грешкаЛиценцаАутоматско ажурирање апликација
- Снимци екранаНедавно ажурираноВећ постојиВеб-сајт аутора
@@ -135,12 +124,10 @@
Измени репозиторијумРедослед сортирањаЗанемари ову верзију
- НеверификованоHTTP проксиАпликацијаУвекАдреса
- Тиха инсталацијаОпис није доступанНеважећи формат отиска прстаЧување детаља…
@@ -165,7 +152,6 @@
ПретрагаНепозната грешка.Теме
- Анимације листеНеважећи формат фајла.%d апликација има нову верзију.
@@ -179,15 +165,12 @@
Веб-сајт пројектаДонацијаДодај репозиторијум
- Дозволи да се горња трака апликације прошириНије могуће потврдити %sИстражиПрикажи мањеНикадаНије могуће пронаћи ниједну такву апликацијуМинимална верзија API-ја је %d.
- Дозволите да се горња трака апликације прошири и скупи
- Период за проверу и уклањање преузетих фајловаПодешавањаНеважећа адресаОригинални изворни кôд није слободан
@@ -196,7 +179,6 @@
Провера репозиторијума…ВерзијеМаксимална верзија API-ја је %d.
- Овај репозиторијум још није коришћен. Укључите га да бисте видели апликације у њему.Није могуће рашчланити фајл индекса.ИнсталирајСистемски
@@ -218,10 +200,8 @@
Није могуће проверити интегритет.Није могуће пронаћи ту апликацијуПрокси
- НајновијеЗаслугеРепозиторијуми
- Дозволите root дозволу за тихе инсталацијеСастављено за отклањање грешакаНепознато: %sУвоз подешавања
@@ -245,4 +225,14 @@
Упозорење: Занемарите верификацију потписа када инсталирате apk, за LSPosed кориснике или напредне корисникеНедовољно меморијеНема довољно слободног меморијског простора на уређају за инсталирање ове апликације. Покушајте да ослободите мало простора
-
\ No newline at end of file
+ Shizuku није покренут
+ Дозвола за услугу Shizuku није дата. Проверите у апликацији Shizuku
+ Shizuku није инсталиран
+ Изгледа да Shizuku није инсталиран
+ Видео снимак
+ Непознато (%d)
+ Услуга Shizuku није покренута. Проверите у апликацији Shizuku
+ Отвори Shizuku
+ Недостаје дозвола за Shizuku
+ Промени на подразумевани
+
diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml
index 8af85f4d..0a276137 100644
--- a/app/src/main/res/values-su/strings.xml
+++ b/app/src/main/res/values-su/strings.xml
@@ -4,7 +4,6 @@
AlamatKabéh aplikasiKabéh aplikasi geus alanyar
- Idin Luhur Bar Aplikasi keur NgaluasEnggeus ayaSalawasnaHideung
@@ -15,7 +14,6 @@
Nyoba masang otomatis panganyarnaTeu bisa Muka LinkParubahan
- Jadwal ngecék jeung ngahapus file download-anKonfirmasiTeu bisa ngadownload %sTeu bisa validasi %s
@@ -44,7 +42,6 @@
%s geus dihapusFormat sidik teu validTeu bisa ngalakukeun aksi tangtu.
- NyalinCaangPaké warna téma material youJaringan error
@@ -70,8 +67,6 @@
Anyar cikénéhTeu katanda. Teu bisa verifikasi daptar aplikasi. Kahadé ngadownload aplikasi tina repositori teu katanda.Ngabutuhkeun Aksés Latar Tukang
- Buka deui Droid-ify keur nempo parobahan
- Idinkeun idin root keur masang jempéSimpenNyimpen jéntréna…Pilih cadangan
@@ -84,9 +79,7 @@
TémaUndeurTeu dipikanyaho: %s
- Teu ditandaSaran panasaran vérsi teu stabil
- Teu diverifikasiAnyarAnyarUsername
@@ -94,12 +87,9 @@
Vérsi %sNungguan ngamimitian pamasangan…Tempo saeutik
- PandeuriAnyarkeun kabéh
- Urutan & FilterTindakan teu warasNgayaan teu aman keur jalanna kontén
- Idinkeun luhur bar aplikasi keur ngaluas jeung nutupAnti fiturAplikasiJalajah
@@ -172,8 +162,6 @@
Lisénsi %sLink disalinLink
- Daptar Animasi
- Témbongkeun daptar animasi di kaca utamaMaterial YouNgahijikeun %sNgaran
@@ -184,7 +172,6 @@
Euweuh aplikasiEuweuh pedaranEuweuh aplikasi nu kapasang
- Anjeun euweuh konéksi internétNomber aplikasiBéjaan mun aya panganyarnaNgan maké Wi-Fi & Dicas
@@ -196,20 +183,16 @@
Ngenalkeun layanan jaringan teu gratisDisadiaan ku %sPort proxy
- Repositori ieu can dipaké. Ngaktifkeun ieu keur nempo eusi aplikasina.Repositori ieu teu kapanggihDisarankeunRepositori teu kahontalNgabutuhkeun %s
- Masang JempéKodeu sumber geus euweuh
- Tangkepan layarKredit KhususSinkron repositoriAksés Latar Tukang dibutuhkeun keur sinkronisasi di latar tukang lancarSinkron repositori otomatisNyingkronkeun %s…
- TargétTéangTandatangan %sSistem
@@ -234,7 +217,4 @@
WebBasaPanampilan
- Jalajah
- Aplikasi nu kapasang
- Aplikasi anyar
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 1915596e..6df89261 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -2,16 +2,13 @@
Osignerad. Det gick inte att verifiera applikationslistan. Var försiktig när du laddar ner applikationer från osignerade arkiv.Kräver %s
- Tyst installationSpara
- SkärmdumparVälj en mirrorSignatur %sKällkodSynkroniserasSynkronisera arkivSynkroniserar %s…
- Sortera & FiltreraSynkronisera arkiv automatisktTryck för att installera.Teman
@@ -21,7 +18,6 @@
VersionPersonaliseringVisa mindre
- SenastInstabila uppdateringarUppdateraVersioner
@@ -36,7 +32,6 @@
LjusLänken har kopieratsLänkar
- ListanimationerOgiltigt fingeravtrycksformatOgiltiga behörigheter.Ogiltig signatur.
@@ -52,7 +47,6 @@
%d applikation har en ny version.%d applikationer med nya versioner.
- Du har ingen internetanslutningIngen proxyEndast kompatibel med %sAntal applikationer
@@ -85,7 +79,6 @@
SorteringsordningArkivArkiv
- Det här arkivet har inte använts ännu. Slå på den för att se applikationerna i den.Åtgärd misslyckadesLägg till arkivAdress
@@ -103,7 +96,6 @@
ÄndringsloggKontrollerar arkivet …APK cleanup interval
- Period to check and remove downloaded filesBekräftelseInnehåller icke-fria mediaKunde inte ladda ner %s
@@ -127,32 +119,23 @@
Inga installerade applikationerEndast på Wi-Fi och laddningLösenord saknas
- Tillåt rotbehörighet för tysta installationerSignerad med en osäker algoritmTemaSpårar eller rapporterar din aktivitet
- OsigneradFöreslå att du installerar instabila versioner
- Ej verifieradVersion %sVäntar på att börja ladda ner…Hemsida
- UtforskaUppdatera alla
- Installerade applikationer
- Nya applikationerBehörigheter+%d tillUppdateringarAlla dina applikationer är uppdaterade
- Låt toppverktygsfältet expandera
- Låt toppverktygsfältet expandera och dras ihopDoneraInstallerareExisterar redanDet går inte att utföra vissa åtgärder.%s licens
- Visa listanimering på huvudsidanOkejÖppna %s\?Sparar detaljer…
@@ -197,7 +180,6 @@
NätverksfelInstalleradSystem
- MålOkändFavoriterRensar upp överflödiga filer
@@ -205,7 +187,6 @@
Tvinga städningAktivera arkivetInstallerar
- Starta om Droid-ify för att se ändringarnaVäntar på att starta installationen…Uppdatera appar automatisktFörsök att installera uppdateringar automatiskt
@@ -218,7 +199,6 @@
Svep på hemskärmenTillåt användare att svepa mellan sidor på hemskärmenSärskilda tack
- KopieraImportera inställningarImport/ExportImportera inställningar och favoriter från fil
@@ -242,4 +222,4 @@
*Varning* Ignorera signaturverifiering när du installerar apk, för LSPosed användare eller avancerade användareOtillräckligt utrymmeDet finns inte tillräckligt med ledigt utrymme på enheten för att installera denna applikation. Försök att rensa lite utrymme
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 5cd74f47..40750a91 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -12,8 +12,6 @@
முகவரிஅனைத்து பயன்பாடுகளும்உங்கள் பயன்பாடுகள் அனைத்தும் புதுப்பித்தவை
- சிறந்த பயன்பாட்டு பட்டியை விரிவாக்க அனுமதிக்கவும்
- டாப் ஆப் பட்டியை விரிவுபடுத்தவும் சரிவதற்கும் அனுமதிக்கவும்ஏற்கனவே உள்ளதுஎப்போதும்கருப்பு
@@ -30,7 +28,6 @@
மாற்றங்கள்களஞ்சியத்தை சரிபார்க்கிறது…APK தூய்மைப்படுத்தும் இடைவெளி
- பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை சரிபார்த்து அகற்ற வேண்டிய காலம்பிழைத்திருத்தத்திற்காக தொகுக்கப்பட்டதுஉறுதிப்படுத்தல்இணைத்தல்…
@@ -84,7 +81,7 @@
HTTP பதிலாள்அனைத்து புதிய பதிப்புகளையும் புறக்கணிக்கவும்இந்த பதிப்பை புறக்கணிக்கவும்
- உங்கள் %1$s (API பதிப்பு %2 $ D) ஆதரிக்கப்படவில்லை. %3$s
+ உங்கள் %1$s (API பதிப்பு %2$d) ஆதரிக்கப்படவில்லை. %3$sமேக்ச் பநிஇ பதிப்பு %d.மின் பநிஇ பதிப்பு %d.காணாமல் போன நற்பொருத்தங்கள்.
@@ -118,15 +115,12 @@
தவறான கையொப்பம்.தவறான பயனர்பெயர் வடிவம்சில செயல்களைச் செய்ய முடியவில்லை.
- நகலெடுஏவுதல்உரிமம்ஒளி%s உரிமம்இணைப்பு நகலெடுக்கப்பட்டதுஇணைப்புகள்
- பட்டியல் அனிமேசன்கள்
- முதன்மையான பக்கத்தில் பட்டியல் அனிமேசனைக் காட்டுபொருள் நீங்கள்நீங்கள் வண்ண கருப்பொருளைப் பயன்படுத்தவும்இணைத்தல் %s
@@ -141,7 +135,6 @@
கிடைக்கக்கூடிய பயன்பாடுகள் இல்லைநிறுவப்பட்ட பயன்பாடுகள் இல்லைஎந்த விளக்கமும் கிடைக்கவில்லை
- உங்களுக்கு இணைய இணைப்பு இல்லைஅத்தகைய பயன்பாடுகளை கண்டுபிடிக்க முடியவில்லைபதிலாள் இல்லைபுதுப்பிப்புகளுக்கு அறிவிக்கவும்
@@ -171,19 +164,14 @@
அண்மைக் காலத்தில் புதுப்பிக்கப்பட்டதுகளஞ்சியங்கள்களஞ்சியம்
- இந்த களஞ்சியம் இன்னும் பயன்படுத்தப்படவில்லை. அதில் உள்ள பயன்பாடுகளைக் காண அதை இயக்கவும்.பின்வரும் களஞ்சியம் கிடைக்கவில்லைகையொப்பமிடாத. பயன்பாட்டு பட்டியலை சரிபார்க்க முடியவில்லை. கையொப்பமிடப்படாத களஞ்சியங்களிலிருந்து விண்ணப்பங்களை பதிவிறக்குவதில் கவனமாக இருங்கள்.களஞ்சியம் அணுக முடியாதது%s தேவைபின்னணி அணுகல் தேவைபின்னணி ஒத்திசைவை சரியாக இயக்க பின்னணி அணுகல் தேவை
- மாற்றங்களைக் காண டிரயோடு-ஐடியை மறுதொடக்கம் செய்யுங்கள்
- அமைதியான நிறுவல்
- அமைதியான நிறுவல்களுக்கு ரூட் இசைவு அனுமதிக்கவும்சேமிவிவரங்களைச் சேமிக்கிறது…
- திரைக்காட்சிகள்தேடல்ஒரு கண்ணாடியைத் தேர்ந்தெடுக்கவும்அமைப்புகள்
@@ -206,7 +194,6 @@
%s ஒத்திசைத்தல்…மண்டலம்நிறுவ தட்டவும்.
- இலக்குகருப்பொருள்கருப்பொருள்கள்உங்கள் செயல்பாட்டைக் கண்காணிக்கிறது அல்லது தெரிவிக்கிறது
@@ -214,12 +201,10 @@
தெரியவில்லைதெரியாத பிழை.தெரியவில்லை: %s
- கையொப்பமிடாதநிலையற்ற புதுப்பிப்புகள்நிலையற்ற பதிப்புகளை நிறுவ பரிந்துரைக்கவும்கையொப்பத்தை புறக்கணிக்கவும்APK ஐ நிறுவும் போது கையொப்ப சரிபார்ப்பை புறக்கணிக்கவும், பயனர்கள் அல்லது மேம்பட்ட பயனர்களுக்கு
- சரிபார்க்கப்படாததுபுதுப்பிப்புபுதுப்பிப்புகள்மேலோடை மூலக் குறியீடு இலவசம் அல்ல
@@ -233,11 +218,6 @@
மொழிதனிப்பயனாக்கம்குறைவாகக் காட்டு
- அண்மைக் கால
- ஆராயுங்கள்அனைத்தையும் புதுப்பிக்கவும்
- நிறுவப்பட்ட பயன்பாடுகள்
- வரிசைப்படுத்துதல் & வடிகட்டி
- புதிய பயன்பாடுகள்வேலை உள்ளடக்கத்திற்கு பாதுகாப்பாக இல்லை
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index bf23a57e..ab65568c 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -13,7 +13,6 @@
Subukang awtomatikong mag-install ng mga updateHindi ma-download ang %sHindi ma-validate ang %s
- Period to check and remove downloaded filesHuwag pansinin ang bersyon na itoMga nawawalang feature.Ang iyong %1$s (bersyon ng API %2$d) ay hindi suportado. %3$s
@@ -28,7 +27,6 @@
Di-wastong format ng fingerprintDi-wastong metadata.Di-wastong lagda.
- Ipakita ang animation ng listahan sa pangunahing pahinaPinagsasama ang %sPangalanWalang magagamit na mga application
@@ -55,7 +53,6 @@
May bagong bersyon ang %d application.%d application na may mga bagong bersyon.
- Wala kang koneksyon sa internetWalang available na paglalarawanHindi mahanap ang anumang ganoong mga applicationWalang proxy
@@ -112,10 +109,7 @@
Error sa networkNakopya ang link sa clipboardMga link
- Listahan ng mga animationHindi magawa ang ilang partikular na pagkilos.
- Payagan ang Nangungunang App Bar na Palawakin
- Payagan ang nangungunang app bar na lumawak at bumagsakMay mga hindi libreng dependenciesMay mga kahinaan sa seguridadHTTP proxy
@@ -144,7 +138,6 @@
Bilang ng mga aplikasyonNagtataguyod ng mga serbisyo na hindi libre sa networkUri ng proxy
- I-restart ang Droid-ify para makita ang mga pagbabagoMagpakita ng higit paNilagdaan gamit ang hindi ligtas na algorithmPag-uuri ng pagkakasunud-sunod
@@ -152,7 +145,6 @@
Sini-sync ang %s…I-tap para i-install.Hindi alam: %s
- Hindi nakapirmaMga hindi matatag na updateNaghihintay upang simulan ang pag-install…Website
@@ -161,15 +153,11 @@
Nangangailangan ng %sNagsi-syncIbahagi
- Tahimik na Pag-installSource codeSistemaTemaMga setting
- Hindi pa nagagamit ang repositoryong ito. I-on ito para tingnan ang mga application sa loob nito.Hindi nakapirma. Hindi ma-verify ang listahan ng aplikasyon. Mag-ingat sa pag-download ng mga application mula sa mga hindi naka-sign na repository.
- Payagan ang pahintulot sa ugat para sa mga tahimik na pag-install
- Mga screenshotHindi maabot ang repositoryMaghanapPumili ng salamin
@@ -180,7 +168,6 @@
Hindi kilalaHindi kilalang error.Magmungkahi ng pag-install ng mga hindi matatag na bersyon
- Hindi na-verifyUpdateMga updateAng upstream source code ay hindi libre
@@ -191,9 +178,7 @@
Bersyon %sMga bersyonMagpakita ng Mas Kaunti
- PinakabagoI-save
- Mga bagong applicationSine-save ang mga detalye…I-sync ang mga repositoryAwtomatikong i-sync ang mga repositoryo
@@ -203,10 +188,6 @@
Mga temaNaghihintay upang simulan ang pag-download…Anong bago
- GalugarinUpdate lahat
- Mga naka-install na application
- Pagbukud-bukurin at SalainIminungkahi
- Pantarget
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 3c178d0f..02b85ee6 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -75,8 +75,6 @@
AçıkBağlantı kopyalandıBağlantılar
- Liste Animasyonu
- Liste canlandırmasını ana sayfada göster%s birleştiriliyorİsimAğ hatası
@@ -117,14 +115,10 @@
Son güncellemeDepolarDepo
- Bu depo henüz kullanılmadı. İçindeki uygulamaları görüntülemek için etkinleştirin.İmzalanmamış. Uygulama listesi doğrulanamadı. İmzalanmamış depolardan uygulama indirirken dikkatli olun.%s gerektirir
- Sessiz Kurulum
- Sessiz kurulumlar için root iznine izin verKaydetAyrıntılar kaydediliyor…
- Ekran görüntüleriAramaBir mirror seçPaylaş
@@ -145,7 +139,6 @@
%s senkronize ediliyor…SistemKurmak için dokunun.
- HedefTemaTemalarEtkinliğinizi takip eder ya da raporlar
@@ -153,10 +146,8 @@
BilinmeyenBilinmeyen hata.Bilinmeyen: %s
- İmzalanmamışKararsız güncellemelerKararsız sürümleri kurmayı öner
- DoğrulanmamışGüncelleGüncellemelerYukarı akış kaynak kodu özgür değil
@@ -172,12 +163,7 @@
DilKişiselleştirmeDaha Az Göster
- En son
- GözatTümünü güncelle
- Sırala ve Filtrele
- Yüklü uygulamalar
- Yeni uygulamalarKurucuEski KurucuOturum Kurucusu
@@ -189,15 +175,11 @@
GünSadece Wi-Fi ve Şarj Olurken
- İndirilen dosyaları kontrol etme ve kaldırma süresiSaatSaatBelirli eylemler gerçekleştirilemiyor.
- İnternet bağlantınız yok
- Üst Uygulama Çubuğunun Genişletilmesine İzin Ver
- Üst uygulama çubuğunun genişletilmesine ve daraltılmasına izin verinMaterial you renk temasını kullanMaterial YouFavoriler
@@ -206,7 +188,6 @@
Gereksiz dosyaları temizlerDepoyu etkinleştirKuruluyor
- Değişiklikleri görmek için Droid-ify\'ı yeniden başlatınKurulumun başlatılması bekleniyor…Uygulamaları otomatik güncelleGüncellemeleri otomatik olarak kurmaya çalış
@@ -216,7 +197,6 @@
Shizuku çalışmıyorSunucuya bağlanılamadıSunucu yeni paketi sağlayamadı.
- KopyalaProxy kapısı (port) sadece tam sayı olabilirKullanıcı ana ekrandayken sayfalar arası kaydırabilmesini sağlarİlgili depo bulunamadı
@@ -241,4 +221,4 @@
%s kaldırıldıİmzayı Yok SayLSPosed kullanıcıları veya ileri düzey kullanıcılar için apk kurulurken imza doğrulamasını yok say
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 2bc15801..8e63411c 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -62,8 +62,6 @@
Ліцензія %sПосилання скопійованоПосилання
- Анімації списків
- Показувати анімації списку на головній сторінціЗлиття %sІм’яПомилка мережі
@@ -91,9 +89,7 @@
Порт проксіТип проксіНещодавно оновлено
- Цей репозиторій ще не використовувався. Увімкніть його, щоб переглянути застосунки у ньому.Потребує %s
- Тихе встановлення%d застосунок має нову версію.%d застосунки мають нову версію.
@@ -101,10 +97,8 @@
%d застосунків мають нову версію.Персоналізація
- Надайте root дозволи для увімкнення тихого встановленняЗберегтиЗбереження даних…
- СкриншотиПошукПоказати старіші версіїПідписаний за допомогою небезпечного алгоритму
@@ -125,10 +119,8 @@
НевідомоНевідома помилка.Невідомо: %s
- Не підписанийНестабільні оновленняПропонувати встановити нестабільні версії
- Не перевіренийОновитиОновленняВихідний код батьківського застосунку не відкритий
@@ -169,16 +161,10 @@
Вихідний код більше не доступнийЯк у системіНатисніть, щоб встановити.
- ЦільовийВерсіяОчікування завантаження…Показати менше
- Останні
- ОглядОновити все
- Встановлені застосунки
- Сортувати та фільтрувати
- Нові застосункиЗастарілий інсталяторІнсталяторRoot інсталятор
@@ -198,11 +184,7 @@
Лише через Wi-Fi під час зарядкиПеріодичність очищення APK
- Період для перевірки та видалення завантажених файлівНеможливо виконати певні дії.
- Дозволити розширення верхньої панелі застосунку
- Дозволити верхній панелі застосунку розгортатися та згортатися
- У вас немає підключення до ІнтернетуMaterial YouВикористовувати кольорову тему Material YouОбране
@@ -212,7 +194,6 @@
Автооновлення застосунківНамагатися встановити оновлення автоматичноВстановлення
- Перезапустіть Droid-ify, щоб побачити зміниУвімкнути репозиторійОчікування початку встановлення…Містить невільні компоненти
@@ -221,7 +202,6 @@
Shizuku не працюєНе вдалося з’єднатися з серверомСервер не зміг надати новий пакунок.
- КопіюватиПорт проксі може бути тільки цілим числомДозволити користувачу перегортати сторінки на головному екрані за допомогою свайпівНаступний репозиторій не знайдено
@@ -256,4 +236,6 @@
Shizuku, здається, не встановленоВідкрити ShizukuПеремкнутися на типовий режим
+ Невідомий (%d)
+ Відео
diff --git a/app/src/main/res/values-v31/dimen.xml b/app/src/main/res/values-v31/dimen.xml
deleted file mode 100644
index 85a5e4b6..00000000
--- a/app/src/main/res/values-v31/dimen.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- @android:dimen/system_app_widget_inner_radius
- @android:dimen/system_app_widget_background_radius
-
\ No newline at end of file
diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml
index c6da967f..b0c93aff 100644
--- a/app/src/main/res/values-v31/styles.xml
+++ b/app/src/main/res/values-v31/styles.xml
@@ -1,5 +1,5 @@
-
+
-
-
-
-
-
-
-
diff --git a/app/src/test/kotlin/com/looker/droidify/network/KtorDownloaderTest.kt b/app/src/test/kotlin/com/looker/droidify/network/KtorDownloaderTest.kt
index 5f56bc5e..1b3a5f99 100644
--- a/app/src/test/kotlin/com/looker/droidify/network/KtorDownloaderTest.kt
+++ b/app/src/test/kotlin/com/looker/droidify/network/KtorDownloaderTest.kt
@@ -16,7 +16,7 @@ import kotlin.test.assertIs
class KtorDownloaderTest {
- private val engine = MockEngine.Companion { request ->
+ private val engine = MockEngine { request ->
when (request.url.host) {
"success.com" -> respondOk("success")
"notfound.com" -> respondError(HttpStatusCode.Companion.NotFound)
diff --git a/build.gradle.kts b/build.gradle.kts
index 6c911422..8b8e63c8 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,6 +1,8 @@
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.kotlin.android) apply false
+ alias(libs.plugins.ksp) apply false
+ alias(libs.plugins.hilt) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.kotlin.parcelize) apply false
alias(libs.plugins.hilt) apply false
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 7ac2ca59..7d780f2c 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,35 +1,37 @@
[versions]
-desugaring = "2.1.4"
-agp = "8.8.0"
+desugaring = "2.1.5"
+agp = "8.9.2"
material = "1.12.0"
-activity = "1.10.0"
+activity = "1.10.1"
app-compat = "1.7.0"
-core = "1.15.0"
-datastore = "1.1.2"
-fragment = "1.8.5"
+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"
-work = "2.10.0"
-coil = "2.7.0"
+ui-automator = "2.3.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.0"
+kotlin = "2.1.20"
coroutines = "1.10.1"
-datetime = "0.6.1"
-serialization = "1.8.0"
-ksp = "2.1.0-1.0.29"
-ktor = "3.0.3"
+datetime = "0.6.2"
+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.11.4"
+junit-jupiter = "5.12.0"
[libraries]
desugaring = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "desugaring" }
@@ -49,7 +51,8 @@ test-rules = { group = "androidx.test", name = "rules", version.ref = "test-rule
test-runner = { group = "androidx.test", name = "runner", version.ref = "test-runner" }
work-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "work" }
work-testing = { group = "androidx.work", name = "work-testing", version.ref = "work" }
-coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "coil" }
+coil-core = { group = "io.coil-kt.coil3", name = "coil", version.ref = "coil" }
+coil-network = { group = "io.coil-kt.coil3", name = "coil-network-ktor3", version.ref = "coil" }
hilt-core = { group = "com.google.dagger", name = "hilt-core", version.ref = "hilt" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-test = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
@@ -94,5 +97,6 @@ room = ["room-runtime", "room-ktx"]
shizuku = ["shizuku-provider", "shizuku-api"]
ktor = ["ktor-core", "ktor-okhttp"]
coroutines = ["coroutines-core", "coroutines-android", "coroutines-guava"]
+coil = ["coil-core", "coil-network"]
test-unit = ["junit-jupiter", "ktor-mock", "coroutines-test", "kotlin-test"]
test-android = ["test-runner", "test-rules", "test-ext", "coroutines-test", "kotlin-test"]
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index cea7a793..37f853b1 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/metadata/en-US/changelogs/650.txt b/metadata/en-US/changelogs/650.txt
new file mode 100644
index 00000000..e4538903
--- /dev/null
+++ b/metadata/en-US/changelogs/650.txt
@@ -0,0 +1,24 @@
+Added:
+- Progress Bar on Sync
+- IronFox Repo
+- Video to Screenshots list
+- Dialog to notify shizuku permission issues
+- Target SDK in Release Item
+
+Fixed:
+- Persistent install notification
+- Donation Link Parsing
+- Updates when signature check skipped
+- Adding repository adds a suffix
+- Screenshots for password protected repo
+
+Changed:
+- Shizuku permission no longer reverts on permission loss
+- Progress Bar animation
+
+Improvements:
+- All-around performance improvement
+- Edit Repository UI
+
+Removed:
+- Unused dependencies