diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea78..a39cab48 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,7 +1,5 @@ --- -name: Bug report -about: Create a report to help us improve -title: '' +name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' @@ -12,6 +10,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,15 +23,17 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] **Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] + +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md index 48d5f81f..e350e371 100644 --- a/.github/ISSUE_TEMPLATE/custom.md +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -1,7 +1,5 @@ --- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' +name: Custom issue template about: Describe this issue template's purpose here. title: '' labels: '' assignees: '' diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7d..5fe926b2 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,7 +1,5 @@ --- -name: Feature request -about: Suggest an idea for this project -title: '' +name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' diff --git a/README.md b/README.md index 6ec82950..1b810bd3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ Material-ify with Droid-ify. Unofficial F-Droid client with Material UI. -This app is an Direct Adaptation/Modification of [Foxy-Droid](https://github.com/kitsunyan/foxy-droid/) +This app is an Direct Adaptation/Modification +of [Foxy-Droid](https://github.com/kitsunyan/foxy-droid/) ### Features @@ -14,14 +15,15 @@ This app is an Direct Adaptation/Modification of [Foxy-Droid](https://github.com * No cards or inappropriate animations * Fast repository syncing * Standard Android components and minimal dependencies - + ### Screenshots ## Building and Installing -Specify your Android SDK path either using the `ANDROID_HOME` environment variable, or by filling out the `sdk.dir` +Specify your Android SDK path either using the `ANDROID_HOME` environment variable, or by filling +out the `sdk.dir` property in `local.properties`. Signing can be done automatically using `keystore.properties` as follows: @@ -33,8 +35,10 @@ key.alias=key-alias key.password=key-password ``` -Run `./gradlew assembleRelease` to build the package, which can be installed using the Android package manager. +Run `./gradlew assembleRelease` to build the package, which can be installed using the Android +package manager. ## License -Droid-ify is available under the terms of the GNU General Public License v3 or later. Copyright © 2020 Iamlooker. +Droid-ify is available under the terms of the GNU General Public License v3 or later. Copyright © +2020 Iamlooker. diff --git a/extra/launcher-make.sh b/extra/launcher-make.sh deleted file mode 100644 index 3cfaff5e..00000000 --- a/extra/launcher-make.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -set -e -cd "`dirname "$0"`" - -dimensions=(mdpi:1 hdpi:1.5 xhdpi:2 xxhdpi:3 xxxhdpi:4) -res='../src/main/res' - -cp 'launcher.svg' 'launcher-foreground.svg' -inkscape --select circle --verb EditDelete --verb=FileSave --verb=FileQuit \ -'launcher-foreground.svg' - -for dimension in ${dimensions[@]}; do - resource="${dimension%:*}" - scale="${dimension#*:}" - mkdir -p "$res/mipmap-$resource" "$res/drawable-$resource" - size="`bc <<< "48 * $scale"`" - inkscape 'launcher.svg' -a 15:15:93:93 -w "$size" -h "$size" \ - -e "$res/mipmap-$resource/ic_launcher.png" - optipng "$res/mipmap-$resource/ic_launcher.png" - size="`bc <<< "108 * $scale"`" - inkscape 'launcher-foreground.svg' -w "$size" -h "$size" \ - -e "$res/drawable-$resource/ic_launcher_foreground.png" - optipng "$res/drawable-$resource/ic_launcher_foreground.png" -done - -rm 'launcher-foreground.svg' diff --git a/extra/launcher.svg b/extra/launcher.svg deleted file mode 100644 index e9f11504..00000000 --- a/extra/launcher.svg +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index 14936841..7d75bc4a 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -5,21 +5,17 @@ import android.app.Application import android.app.job.JobInfo import android.app.job.JobScheduler import android.content.* -import android.content.pm.PackageInfo import com.looker.droidify.content.Cache import com.looker.droidify.content.Preferences import com.looker.droidify.content.ProductPreferences import com.looker.droidify.database.Database -import com.looker.droidify.entity.InstalledItem import com.looker.droidify.index.RepositoryUpdater import com.looker.droidify.network.Downloader import com.looker.droidify.network.PicassoDownloader import com.looker.droidify.service.Connection import com.looker.droidify.service.SyncService -import com.looker.droidify.utility.Utils +import com.looker.droidify.utility.Utils.toInstalledItem import com.looker.droidify.utility.extension.android.Android -import com.looker.droidify.utility.extension.android.singleSignature -import com.looker.droidify.utility.extension.android.versionCodeCompat import com.squareup.picasso.OkHttp3Downloader import com.squareup.picasso.Picasso import java.net.InetSocketAddress @@ -27,10 +23,6 @@ import java.net.Proxy @Suppress("unused") class MainApplication : Application() { - private fun PackageInfo.toInstalledItem(): InstalledItem { - val signatureString = singleSignature?.let(Utils::calculateHash).orEmpty() - return InstalledItem(packageName, versionName.orEmpty(), versionCodeCompat, signatureString) - } override fun onCreate() { super.onCreate() diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt index 7a325323..87f27953 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt @@ -26,6 +26,8 @@ import com.looker.droidify.service.Connection import com.looker.droidify.service.DownloadService import com.looker.droidify.utility.RxUtils import com.looker.droidify.utility.Utils +import com.looker.droidify.utility.Utils.startPackageInstaller +import com.looker.droidify.utility.Utils.startUpdate import com.looker.droidify.utility.extension.android.* import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable @@ -134,7 +136,6 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks { } addOnScrollListener(scrollListener) addItemDecoration(adapter.gridItemDecoration) -// addItemDecoration(DividerItemDecoration(context, adapter::configureDivider)) savedInstanceState?.getParcelable(STATE_ADAPTER) ?.let(adapter::restoreState) layoutManagerState = savedInstanceState?.getParcelable(STATE_LAYOUT_MANAGER) @@ -385,27 +386,7 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks { ProductAdapter.Action.INSTALL, ProductAdapter.Action.UPDATE -> { val installedItem = installed?.installedItem - val productRepository = Product.findSuggested(products, installedItem) { it.first } - val compatibleReleases = productRepository?.first?.selectedReleases.orEmpty() - .filter { installedItem == null || installedItem.signature == it.signature } - val release = if (compatibleReleases.size >= 2) { - compatibleReleases - .filter { it.platforms.contains(Android.primaryPlatform) } - .minByOrNull { it.platforms.size } - ?: compatibleReleases.minByOrNull { it.platforms.size } - ?: compatibleReleases.firstOrNull() - } else { - compatibleReleases.firstOrNull() - } - val binder = downloadConnection.binder - if (productRepository != null && release != null && binder != null) { - binder.enqueue( - packageName, - productRepository.first.name, - productRepository.second, - release - ) - } else Unit + startUpdate(packageName, installedItem, products, downloadConnection) } ProductAdapter.Action.LAUNCH -> { val launcherActivities = installed?.launcherActivities.orEmpty() diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenActivity.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenActivity.kt index 7cbb2beb..2392e440 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenActivity.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenActivity.kt @@ -1,7 +1,6 @@ package com.looker.droidify.screen import android.content.Intent -import android.net.Uri import android.os.Bundle import android.os.Parcel import android.view.ViewGroup @@ -11,11 +10,10 @@ import android.widget.Toolbar import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import com.looker.droidify.R -import com.looker.droidify.content.Cache import com.looker.droidify.content.Preferences import com.looker.droidify.database.CursorOwner import com.looker.droidify.utility.KParcelable -import com.looker.droidify.utility.extension.android.Android +import com.looker.droidify.utility.Utils.startPackageInstaller import com.looker.droidify.utility.extension.resources.getDrawableFromAttr import com.looker.droidify.utility.extension.text.nullIfEmpty @@ -217,11 +215,7 @@ abstract class ScreenActivity : FragmentActivity() { is SpecialIntent.Install -> { val packageName = specialIntent.packageName if (!packageName.isNullOrEmpty()) { - val fragment = currentFragment - if (fragment !is ProductFragment || fragment.packageName != packageName) { - pushFragment(ProductFragment(packageName)) - } - specialIntent.cacheFileName?.let(::startPackageInstaller) + specialIntent.cacheFileName?.let { startPackageInstaller(it) } } Unit } @@ -242,20 +236,6 @@ abstract class ScreenActivity : FragmentActivity() { } } - internal fun startPackageInstaller(cacheFileName: String) { - val (uri, flags) = if (Android.sdk(24)) { - Pair(Cache.getReleaseUri(this, cacheFileName), Intent.FLAG_GRANT_READ_URI_PERMISSION) - } else { - Pair(Uri.fromFile(Cache.getReleaseFile(this, cacheFileName)), 0) - } - // TODO Handle deprecation - @Suppress("DEPRECATION") - startActivity( - Intent(Intent.ACTION_INSTALL_PACKAGE) - .setDataAndType(uri, "application/vnd.android.package-archive").setFlags(flags) - ) - } - internal fun navigateProduct(packageName: String) = pushFragment(ProductFragment(packageName)) internal fun navigateRepositories() = pushFragment(RepositoriesFragment()) internal fun navigatePreferences() = pushFragment(SettingsFragment()) diff --git a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt index b59d78b7..faf4454f 100644 --- a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt @@ -19,6 +19,7 @@ import com.looker.droidify.BuildConfig import com.looker.droidify.R import com.looker.droidify.content.Preferences import com.looker.droidify.utility.extension.resources.* +import com.topjohnwu.superuser.Shell import io.reactivex.rxjava3.disposables.Disposable @@ -125,7 +126,7 @@ class SettingsFragment : ScreenFragment() { } } addText( - title = "Droid-ify", + title = getString(R.string.application_name), summary = "v ${BuildConfig.VERSION_NAME}" ) } @@ -181,6 +182,9 @@ class SettingsFragment : ScreenFragment() { preferences[Preferences.Key.ProxyHost]?.setEnabled(enabled) preferences[Preferences.Key.ProxyPort]?.setEnabled(enabled) } + preferences[Preferences.Key.RootPermission]?.setEnabled( + Shell.getCachedShell()?.isRoot ?: Shell.getShell().isRoot + ) if (key == Preferences.Key.Theme) { requireActivity().recreate() } diff --git a/src/main/kotlin/com/looker/droidify/service/DownloadService.kt b/src/main/kotlin/com/looker/droidify/service/DownloadService.kt index 740899d3..06df15ce 100644 --- a/src/main/kotlin/com/looker/droidify/service/DownloadService.kt +++ b/src/main/kotlin/com/looker/droidify/service/DownloadService.kt @@ -14,6 +14,7 @@ import com.looker.droidify.Common import com.looker.droidify.MainActivity import com.looker.droidify.R import com.looker.droidify.content.Cache +import com.looker.droidify.content.Preferences import com.looker.droidify.entity.Release import com.looker.droidify.entity.Repository import com.looker.droidify.network.Downloader @@ -300,9 +301,17 @@ class DownloadService : ConnectionService() { stateSubject.onNext(State.Success(task.packageName, task.name, task.release) { consumed = true }) - if (!consumed) { - showNotificationInstall(task) - } + if (consumed || (Preferences[Preferences.Key.RootPermission])) { + PendingIntent.getBroadcast( + this, + 0, + Intent(this, Receiver::class.java) + .setAction("$ACTION_INSTALL.${task.packageName}") + .putExtra(EXTRA_CACHE_FILE_NAME, task.release.cacheFileName), + PendingIntent.FLAG_UPDATE_CURRENT + ) + .send() + } else showNotificationInstall(task) } private fun validatePackage(task: Task, file: File): ValidationError? { @@ -436,7 +445,7 @@ class DownloadService : ConnectionService() { .observeOn(AndroidSchedulers.mainThread()) .subscribe { result, throwable -> currentTask = null - throwable?.printStackTrace() + throwable.printStackTrace() if (result == null || !result.success) { showNotificationError( task, diff --git a/src/main/kotlin/com/looker/droidify/utility/Utils.kt b/src/main/kotlin/com/looker/droidify/utility/Utils.kt index 769a8c8b..5a11af88 100644 --- a/src/main/kotlin/com/looker/droidify/utility/Utils.kt +++ b/src/main/kotlin/com/looker/droidify/utility/Utils.kt @@ -1,15 +1,31 @@ package com.looker.droidify.utility import android.animation.ValueAnimator +import android.app.Activity import android.content.Context +import android.content.Intent +import android.content.pm.PackageInfo import android.content.pm.Signature import android.graphics.drawable.Drawable +import android.net.Uri import android.provider.Settings +import android.util.Log import com.looker.droidify.R +import com.looker.droidify.content.Cache +import com.looker.droidify.content.Preferences +import com.looker.droidify.entity.InstalledItem +import com.looker.droidify.entity.Product +import com.looker.droidify.entity.Repository +import com.looker.droidify.service.Connection +import com.looker.droidify.service.DownloadService import com.looker.droidify.utility.extension.android.Android +import com.looker.droidify.utility.extension.android.singleSignature +import com.looker.droidify.utility.extension.android.versionCodeCompat import com.looker.droidify.utility.extension.resources.getColorFromAttr import com.looker.droidify.utility.extension.resources.getDrawableCompat import com.looker.droidify.utility.extension.text.hex +import com.topjohnwu.superuser.Shell +import java.io.File import java.security.MessageDigest import java.security.cert.Certificate import java.security.cert.CertificateEncodingException @@ -21,6 +37,11 @@ object Utils { .apply { setTintList(context.getColorFromAttr(tintAttrResId)) } } + fun PackageInfo.toInstalledItem(): InstalledItem { + val signatureString = singleSignature?.let(Utils::calculateHash).orEmpty() + return InstalledItem(packageName, versionName.orEmpty(), versionCodeCompat, signatureString) + } + fun getDefaultApplicationIcons(context: Context): Pair { val progressIcon: Drawable = createDefaultApplicationIcon(context, android.R.attr.textColorSecondary) @@ -78,4 +99,92 @@ object Utils { ) != 0f } } + + internal fun Activity.startPackageInstaller(cacheFileName: String) { + val file = Cache.getReleaseFile(this, cacheFileName) + if (Preferences[Preferences.Key.RootPermission]) { + val commandBuilder = StringBuilder() + val verifyState = getVerifyState() + if (verifyState == "1") commandBuilder.append("settings put global verifier_verify_adb_installs 0 ; ") + commandBuilder.append(getPackageInstallCommand(file)) + commandBuilder.append(" ; settings put global verifier_verify_adb_installs $verifyState") + val result = Shell.su(commandBuilder.toString()).exec() + if (result.isSuccess) Shell.su("${getUtilBoxPath()} rm ${quote(file.absolutePath)}") + } else { + val (uri, flags) = if (Android.sdk(24)) { + Pair( + Cache.getReleaseUri(this, cacheFileName), + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } else { + Pair(Uri.fromFile(file), 0) + } + // TODO Handle deprecation + @Suppress("DEPRECATION") + startActivity( + Intent(Intent.ACTION_INSTALL_PACKAGE) + .setDataAndType(uri, "application/vnd.android.package-archive").setFlags(flags) + ) + } + } + + fun startUpdate( + packageName: String, + installedItem: InstalledItem?, + products: List>, + downloadConnection: Connection + ) { + val productRepository = Product.findSuggested(products, installedItem) { it.first } + val compatibleReleases = productRepository?.first?.selectedReleases.orEmpty() + .filter { installedItem == null || installedItem.signature == it.signature } + val release = if (compatibleReleases.size >= 2) { + compatibleReleases + .filter { it.platforms.contains(Android.primaryPlatform) } + .minByOrNull { it.platforms.size } + ?: compatibleReleases.minByOrNull { it.platforms.size } + ?: compatibleReleases.firstOrNull() + } else { + compatibleReleases.firstOrNull() + } + val binder = downloadConnection.binder + if (productRepository != null && release != null && binder != null) { + binder.enqueue( + packageName, + productRepository.first.name, + productRepository.second, + release + ) + } else Unit + } + + private fun getPackageInstallCommand(cacheFile: File): String = + "cat \"${cacheFile.absolutePath}\" | pm install -t -r -S ${cacheFile.length()}" + + private fun getVerifyState(): String = + Shell.sh("settings get global verifier_verify_adb_installs").exec().out[0] + + private fun quote(string: String) = + "\"${string.replace(Regex("""[\\$"`]""")) { c -> "\\${c.value}" }}\"" + + private fun getUtilBoxPath(): String { + listOf("toybox", "busybox").forEach { + var shellResult = Shell.su("which $it").exec() + if (shellResult.out.isNotEmpty()) { + val utilBoxPath = shellResult.out.joinToString("") + if (utilBoxPath.isNotEmpty()) { + val utilBoxQuoted = quote(utilBoxPath) + shellResult = Shell.su("$utilBoxQuoted --version").exec() + if (shellResult.out.isNotEmpty()) { + val utilBoxVersion = shellResult.out.joinToString("") + Log.i( + this.javaClass.canonicalName, + "Using Utilbox $it : $utilBoxQuoted $utilBoxVersion" + ) + } + return utilBoxQuoted + } + } + } + return "" + } } diff --git a/src/main/res/animator/slide_in.xml b/src/main/res/animator/slide_in.xml index 64eafc62..719d8b08 100644 --- a/src/main/res/animator/slide_in.xml +++ b/src/main/res/animator/slide_in.xml @@ -1,19 +1,18 @@ - + - + - + diff --git a/src/main/res/animator/slide_in_keep.xml b/src/main/res/animator/slide_in_keep.xml index 102b3c5d..6a651267 100644 --- a/src/main/res/animator/slide_in_keep.xml +++ b/src/main/res/animator/slide_in_keep.xml @@ -1,4 +1,3 @@ - + diff --git a/src/main/res/animator/slide_out.xml b/src/main/res/animator/slide_out.xml index e86fac00..5d29ac1b 100644 --- a/src/main/res/animator/slide_out.xml +++ b/src/main/res/animator/slide_out.xml @@ -1,20 +1,19 @@ - + - + - + diff --git a/src/main/res/color/accent_dark.xml b/src/main/res/color/accent_dark.xml index 31a60bae..7e8bc2d9 100644 --- a/src/main/res/color/accent_dark.xml +++ b/src/main/res/color/accent_dark.xml @@ -1,13 +1,8 @@ - + - + - + diff --git a/src/main/res/color/accent_light.xml b/src/main/res/color/accent_light.xml index 64691f94..9d5e3e87 100644 --- a/src/main/res/color/accent_light.xml +++ b/src/main/res/color/accent_light.xml @@ -1,13 +1,8 @@ - + - + - + diff --git a/src/main/res/color/error_dark.xml b/src/main/res/color/error_dark.xml index 854e64bc..1aca1a37 100644 --- a/src/main/res/color/error_dark.xml +++ b/src/main/res/color/error_dark.xml @@ -1,13 +1,8 @@ - + - + - + diff --git a/src/main/res/color/error_light.xml b/src/main/res/color/error_light.xml index 119d4c14..e611e303 100644 --- a/src/main/res/color/error_light.xml +++ b/src/main/res/color/error_light.xml @@ -1,13 +1,8 @@ - + - + - + diff --git a/src/main/res/drawable/background_border.xml b/src/main/res/drawable/background_border.xml index 429f98e5..c22593b4 100644 --- a/src/main/res/drawable/background_border.xml +++ b/src/main/res/drawable/background_border.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/src/main/res/drawable/ic_add.xml b/src/main/res/drawable/ic_add.xml index 7c89f2ff..c6afe5d4 100644 --- a/src/main/res/drawable/ic_add.xml +++ b/src/main/res/drawable/ic_add.xml @@ -1,13 +1,12 @@ - + - + diff --git a/src/main/res/drawable/ic_application_default.xml b/src/main/res/drawable/ic_application_default.xml index a95b8cdd..3c3e8700 100644 --- a/src/main/res/drawable/ic_application_default.xml +++ b/src/main/res/drawable/ic_application_default.xml @@ -1,14 +1,13 @@ - + - - + - diff --git a/src/main/res/drawable/ic_arrow_down.xml b/src/main/res/drawable/ic_arrow_down.xml index 31f2b700..ab7e3eeb 100644 --- a/src/main/res/drawable/ic_arrow_down.xml +++ b/src/main/res/drawable/ic_arrow_down.xml @@ -1,13 +1,12 @@ - + - + diff --git a/src/main/res/drawable/ic_bug_report.xml b/src/main/res/drawable/ic_bug_report.xml index 5eb5a12a..2ea88cb2 100644 --- a/src/main/res/drawable/ic_bug_report.xml +++ b/src/main/res/drawable/ic_bug_report.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_code.xml b/src/main/res/drawable/ic_code.xml index 82ba0158..a9035cc3 100644 --- a/src/main/res/drawable/ic_code.xml +++ b/src/main/res/drawable/ic_code.xml @@ -1,13 +1,12 @@ - + - + diff --git a/src/main/res/drawable/ic_copyright.xml b/src/main/res/drawable/ic_copyright.xml index d329510a..4a2ac25e 100644 --- a/src/main/res/drawable/ic_copyright.xml +++ b/src/main/res/drawable/ic_copyright.xml @@ -1,14 +1,13 @@ - + - - + - + diff --git a/src/main/res/drawable/ic_donate_bitcoin.xml b/src/main/res/drawable/ic_donate_bitcoin.xml index 3d053774..612591a3 100644 --- a/src/main/res/drawable/ic_donate_bitcoin.xml +++ b/src/main/res/drawable/ic_donate_bitcoin.xml @@ -1,14 +1,13 @@ - + - - + - - + - - + - diff --git a/src/main/res/drawable/ic_donate_opencollective.xml b/src/main/res/drawable/ic_donate_opencollective.xml index d0111e34..e5cfd96e 100644 --- a/src/main/res/drawable/ic_donate_opencollective.xml +++ b/src/main/res/drawable/ic_donate_opencollective.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_donate_regular.xml b/src/main/res/drawable/ic_donate_regular.xml index 2faac8ae..196125b2 100644 --- a/src/main/res/drawable/ic_donate_regular.xml +++ b/src/main/res/drawable/ic_donate_regular.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/src/main/res/drawable/ic_edit.xml b/src/main/res/drawable/ic_edit.xml index 34306e6e..f8fb0735 100644 --- a/src/main/res/drawable/ic_edit.xml +++ b/src/main/res/drawable/ic_edit.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_email.xml b/src/main/res/drawable/ic_email.xml index 59ed0659..0a84f2a0 100644 --- a/src/main/res/drawable/ic_email.xml +++ b/src/main/res/drawable/ic_email.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_history.xml b/src/main/res/drawable/ic_history.xml index bebce888..cf61d2ee 100644 --- a/src/main/res/drawable/ic_history.xml +++ b/src/main/res/drawable/ic_history.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_launch.xml b/src/main/res/drawable/ic_launch.xml index d63cd17f..805b48a8 100644 --- a/src/main/res/drawable/ic_launch.xml +++ b/src/main/res/drawable/ic_launch.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_new_releases.xml b/src/main/res/drawable/ic_new_releases.xml index 202f7f52..18acca27 100644 --- a/src/main/res/drawable/ic_new_releases.xml +++ b/src/main/res/drawable/ic_new_releases.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_perm_device_information.xml b/src/main/res/drawable/ic_perm_device_information.xml index 44602b29..d0e66b50 100644 --- a/src/main/res/drawable/ic_perm_device_information.xml +++ b/src/main/res/drawable/ic_perm_device_information.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_person.xml b/src/main/res/drawable/ic_person.xml index c0cfef3b..b37a4c94 100644 --- a/src/main/res/drawable/ic_person.xml +++ b/src/main/res/drawable/ic_person.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_photo_camera.xml b/src/main/res/drawable/ic_photo_camera.xml index d5b432d3..96295404 100644 --- a/src/main/res/drawable/ic_photo_camera.xml +++ b/src/main/res/drawable/ic_photo_camera.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_public.xml b/src/main/res/drawable/ic_public.xml index 52c48af5..9d646660 100644 --- a/src/main/res/drawable/ic_public.xml +++ b/src/main/res/drawable/ic_public.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_save.xml b/src/main/res/drawable/ic_save.xml index baa7f17f..f6a40221 100644 --- a/src/main/res/drawable/ic_save.xml +++ b/src/main/res/drawable/ic_save.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_search.xml b/src/main/res/drawable/ic_search.xml index 72597669..4ee4af87 100644 --- a/src/main/res/drawable/ic_search.xml +++ b/src/main/res/drawable/ic_search.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_sort.xml b/src/main/res/drawable/ic_sort.xml index 98658e6c..1796ef09 100644 --- a/src/main/res/drawable/ic_sort.xml +++ b/src/main/res/drawable/ic_sort.xml @@ -1,13 +1,12 @@ - + - + diff --git a/src/main/res/drawable/ic_sync.xml b/src/main/res/drawable/ic_sync.xml index f75c34b0..9e6f92a7 100644 --- a/src/main/res/drawable/ic_sync.xml +++ b/src/main/res/drawable/ic_sync.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/ic_tune.xml b/src/main/res/drawable/ic_tune.xml index f23007b5..8b81ff99 100644 --- a/src/main/res/drawable/ic_tune.xml +++ b/src/main/res/drawable/ic_tune.xml @@ -1,14 +1,13 @@ - + - diff --git a/src/main/res/drawable/scrollbar_track.xml b/src/main/res/drawable/scrollbar_track.xml index ac74d333..a7e36f02 100644 --- a/src/main/res/drawable/scrollbar_track.xml +++ b/src/main/res/drawable/scrollbar_track.xml @@ -1,9 +1,9 @@ - + + android:color="@null" /> diff --git a/src/main/res/layout/fragment.xml b/src/main/res/layout/fragment.xml index cd92f885..dd8e2819 100644 --- a/src/main/res/layout/fragment.xml +++ b/src/main/res/layout/fragment.xml @@ -31,9 +31,9 @@ android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="0dp" - android:paddingHorizontal="10dp" - android:paddingTop="10dp" android:layout_weight="1" - android:background="?android:attr/colorBackground" /> + android:background="?android:attr/colorBackground" + android:paddingHorizontal="10dp" + android:paddingTop="10dp" /> diff --git a/src/main/res/layout/permissions_item.xml b/src/main/res/layout/permissions_item.xml index c1ee7b72..a94f18d1 100644 --- a/src/main/res/layout/permissions_item.xml +++ b/src/main/res/layout/permissions_item.xml @@ -1,33 +1,32 @@ - - - - - + android:background="?android:attr/selectableItemBackground" + android:orientation="horizontal" + android:paddingStart="16dp" + android:paddingEnd="16dp"> + + + + diff --git a/src/main/res/layout/title_text_item.xml b/src/main/res/layout/title_text_item.xml index b6b04994..3ea1be6f 100644 --- a/src/main/res/layout/title_text_item.xml +++ b/src/main/res/layout/title_text_item.xml @@ -3,8 +3,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingVertical="8dp" - android:paddingHorizontal="16dp"> + android:paddingHorizontal="16dp" + android:paddingVertical="8dp"> - - + + \ No newline at end of file diff --git a/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09bc..c9ad5f98 100644 --- a/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 5a950cf7..655941fb 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -1,160 +1,160 @@ - A ação falhou - Adicionar repositório - Endereço - Todos os aplicativos - Todos os aplicativos estão atualizados - Já existe - Sempre - Amoled - Características indesejadas - Aplicativo - Aplicativo não encontrado - Email do autor - Página do autor - Disponível - Rastreador de erros - Cancelar - Não é possível editar o repositório pois ele está sincronizando no momento. - Lista de mudanças - Mudanças - Checando o repositório - Compilado para depuração - Confirmação - Conectando - Contém mídia não livre - Não foi possível baixar %s - Não foi possível sincronizar %s - Não foi possível validar %s - Escuro - Data de adição - Excluir - Tem certeza que deseja excluir o repositório? - Descrição - Detalhes - Doar - Baixado %s - Baixando - Baixando %s - Editar repositório - Formato de arquivo inválido. - Fingerprint - Contém anúncio - Possui dependências não livres - Possui vulnerabilidades de segurança - Resposta de servidor inválida. - Proxy HTTP - Ignorar todas as atualizações - Ignorar essa atualização - Sua %1$s (Versão da API %2$d) não é suportado. %3$s - A versão máxima da API é %d. - A versão mínima da API é %d. - Funcionalidades que estão faltando. - Esta versão é mais antiga que a instalada no seu dispositivo. + A ação falhou + Adicionar repositório + Endereço + Todos os aplicativos + Todos os aplicativos estão atualizados + Já existe + Sempre + Amoled + Características indesejadas + Aplicativo + Aplicativo não encontrado + Email do autor + Página do autor + Disponível + Rastreador de erros + Cancelar + Não é possível editar o repositório pois ele está sincronizando no momento. + Lista de mudanças + Mudanças + Checando o repositório + Compilado para depuração + Confirmação + Conectando + Contém mídia não livre + Não foi possível baixar %s + Não foi possível sincronizar %s + Não foi possível validar %s + Escuro + Data de adição + Excluir + Tem certeza que deseja excluir o repositório? + Descrição + Detalhes + Doar + Baixado %s + Baixando + Baixando %s + Editar repositório + Formato de arquivo inválido. + Fingerprint + Contém anúncio + Possui dependências não livres + Possui vulnerabilidades de segurança + Resposta de servidor inválida. + Proxy HTTP + Ignorar todas as atualizações + Ignorar essa atualização + Sua %1$s (Versão da API %2$d) não é suportado. %3$s + A versão máxima da API é %d. + A versão mínima da API é %d. + Funcionalidades que estão faltando. + Esta versão é mais antiga que a instalada no seu dispositivo. Desinstale a primeiro. - Sua %1$s plataforma não é suportada. + Sua %1$s plataforma não é suportada. Plataformas suportadas: %2$s. - Esta versão é assinada com um certificado diferente do que está + Esta versão é assinada com um certificado diferente do que está instalado no seu dispositivo. Desinstale-a primeiro. - Versão incompatível - Versões incompatíveis - Mostrar versões de aplicativos incompatíveis com o dispositivo - Incompatível com %s - Instalar - Instalado - Não foi possível verificar a integridade. - Endereço inválido - Formato de fingerprint inválido - Metadado inválido. - Permissão inválido. - Assinatura inválida. - Formato de nome do usuário inválido - Última atualização - Abrir - Licença - Licença %s - Claro - Link copiado para a área de transferência - Links - Incorporando %s - Nome - Erro da rede. - Nunca - Novas atualizações disponíveis - - %d nova atualização. - %d novas atualizações. - - Não há aplicativos disponíveis - Nenhum aplicativo instalado - Nenhuma descrição disponível. - Nenhum aplicativo correspondente encontrado - Sem proxy - Notificar sobre atualizações - Mostrar uma notificação quando atualizações estiverem disponíveis - Número de aplicativos - OK - Somente compatível com %s - Somente no Wi-Fi - Abrir %s? - Outro - Não foi possível analisar o arquivo de índice. - Senha - Falta a senha - Permissões - +%d mais - Configurações - Processando %1$s - Página do projeto - Promove serviços de rede não livres - Promove software não livre - Disponibilizado por %s - Proxy - Servidor de Proxy - Porta de Proxy - Tipo de Proxy - Repositórios - Repositório - Este repositório ainda não foi usado. Você precisa o ativar para visualizar + Versão incompatível + Versões incompatíveis + Mostrar versões de aplicativos incompatíveis com o dispositivo + Incompatível com %s + Instalar + Instalado + Não foi possível verificar a integridade. + Endereço inválido + Formato de fingerprint inválido + Metadado inválido. + Permissão inválido. + Assinatura inválida. + Formato de nome do usuário inválido + Última atualização + Abrir + Licença + Licença %s + Claro + Link copiado para a área de transferência + Links + Incorporando %s + Nome + Erro da rede. + Nunca + Novas atualizações disponíveis + + %d nova atualização. + %d novas atualizações. + + Não há aplicativos disponíveis + Nenhum aplicativo instalado + Nenhuma descrição disponível. + Nenhum aplicativo correspondente encontrado + Sem proxy + Notificar sobre atualizações + Mostrar uma notificação quando atualizações estiverem disponíveis + Número de aplicativos + OK + Somente compatível com %s + Somente no Wi-Fi + Abrir %s? + Outro + Não foi possível analisar o arquivo de índice. + Senha + Falta a senha + Permissões + +%d mais + Configurações + Processando %1$s + Página do projeto + Promove serviços de rede não livres + Promove software não livre + Disponibilizado por %s + Proxy + Servidor de Proxy + Porta de Proxy + Tipo de Proxy + Repositórios + Repositório + Este repositório ainda não foi usado. Você precisa o ativar para visualizar os aplicativos que ele fornece. - Sem assinatura. Não foi possível verificar a lista de aplicativos. Tenha cuidado ao baixar + Sem assinatura. Não foi possível verificar a lista de aplicativos. Tenha cuidado ao baixar aplicativos de repositórios sem assinatura. - Requer %s - Salvar - Salvando detalhes - Capturas de tela - Pesquisar - Selecione um mirror - Mostrar mais - Mostrar versões antigas - Assinatura %s - Assinado usando um algoritmo inseguro - Pular - SOCKS proxy - Ordenar por - Código fonte - Código fonte não está mais disponível - Sugerido - Sincronizar repositórios - Sincronizar repositórios automaticamente - Sincronizando - Sincronizando %s - Sistema - Toque para instalar. - Tema - Rastreia ou relata sua atividade - Desinstalar - Desconhecido - Error desconhecido. - Desconhecido: %s - Sem assinatura - Atualizações instáveis - Sugerir instalar versões instáveis - Não verificado - Atualização - Atualizações + Requer %s + Salvar + Salvando detalhes + Capturas de tela + Pesquisar + Selecione um mirror + Mostrar mais + Mostrar versões antigas + Assinatura %s + Assinado usando um algoritmo inseguro + Pular + SOCKS proxy + Ordenar por + Código fonte + Código fonte não está mais disponível + Sugerido + Sincronizar repositórios + Sincronizar repositórios automaticamente + Sincronizando + Sincronizando %s + Sistema + Toque para instalar. + Tema + Rastreia ou relata sua atividade + Desinstalar + Desconhecido + Error desconhecido. + Desconhecido: %s + Sem assinatura + Atualizações instáveis + Sugerir instalar versões instáveis + Não verificado + Atualização + Atualizações O código fonte original não é livre Nome de usuário Falta o nome de usuário diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index b08938d5..27f0059d 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -1,160 +1,160 @@ - 操作失败 - 添加存储库 - 地址 - 全部应用 - 所有应用都是最新的 - 已经存在 - 总是 - Amoled - 不需要的特征 - 应用 - 应用未找到 - 作者邮箱 - 作者网站 - 可用 - 错误追踪器 - 取消 - 无法编辑存储库,因为它现在正在同步。 - 变更日志 - 变更 - 检查存储库 - 编译调试 - 确认 - 连接中 - 包含非自由媒体 - 无法下载 %s - 无法同步 %s - 无法验证 %s - 暗色 - 添加日期 - 删除 - 您确定要删除此存储库吗? - 描述 - 详情 - 捐助 - 已下载 %s - 下载中 - 正在下载 %s - 编辑存储库 - 文件格式无效。 - 指纹 - 包含广告 - 包含非自由依赖 - 包含安全漏洞 - 服务器响应无效。 - HTTP 代理 - 忽略所有更新 - 忽略此更新 - 您的 %1$s(API 版本 %2$d)不受支持。 %3$s - 最大 API 版本为 %d。 - 最小 API 版本为 %d。 - 缺少的功能。 - 此版本比您设备上安装的版本旧。 + 操作失败 + 添加存储库 + 地址 + 全部应用 + 所有应用都是最新的 + 已经存在 + 总是 + Amoled + 不需要的特征 + 应用 + 应用未找到 + 作者邮箱 + 作者网站 + 可用 + 错误追踪器 + 取消 + 无法编辑存储库,因为它现在正在同步。 + 变更日志 + 变更 + 检查存储库 + 编译调试 + 确认 + 连接中 + 包含非自由媒体 + 无法下载 %s + 无法同步 %s + 无法验证 %s + 暗色 + 添加日期 + 删除 + 您确定要删除此存储库吗? + 描述 + 详情 + 捐助 + 已下载 %s + 下载中 + 正在下载 %s + 编辑存储库 + 文件格式无效。 + 指纹 + 包含广告 + 包含非自由依赖 + 包含安全漏洞 + 服务器响应无效。 + HTTP 代理 + 忽略所有更新 + 忽略此更新 + 您的 %1$s(API 版本 %2$d)不受支持。 %3$s + 最大 API 版本为 %d。 + 最小 API 版本为 %d。 + 缺少的功能。 + 此版本比您设备上安装的版本旧。 请先卸载那个。 - 您的 %1$s 平台不受支持。 + 您的 %1$s 平台不受支持。 支持的平台:%2$s。 - 此版本使用不同的证书签名 + 此版本使用不同的证书签名 之前安装在您设备上的。请先卸载那个。 - 版本不兼容 - 版本不兼容 - 显示与设备不兼容的应用版本 - 与 %s 不兼容 - 安装 - 已安装 - 无法检查完整性。 - 地址无效 - 指纹格式无效 - 元数据无效。 - 权限无效。 - 签名无效。 - 用户名格式无效 - 最近更新 - 启动 - 许可证 - 许可证 %s - 亮色 - 链接已复制到剪贴板 - 链接 - 合并 %s - 名称 - 网络错误. - 从不 - 新的更新可用 - - %d 个更新. - %d 个更新. - - 没有可用的应用 - 没有已安装的应用 - 没有可用的描述。 - 未找到匹配的应用 - 无代理 - 更新通知 - 有可用更新时显示通知 - 应用数量 - 好的 - 仅与 %s 兼容 - 仅连到 Wi-Fi 时 - 打开 %s? - 其他 - 无法解析索引文件。 - 密码 - 缺少密码 - 权限 - +%d 个 - 设置 - 正在处理 %1$s - 项目网站 - 推广非自由网络服务 - 推广非自由软件 - 由 %s 提供 - 代理 - 代理主机 - 代理端口 - 代理类型 - 存储库 - 存储库 - 此存储库尚未使用。您需要启用它才能查看 + 版本不兼容 + 版本不兼容 + 显示与设备不兼容的应用版本 + 与 %s 不兼容 + 安装 + 已安装 + 无法检查完整性。 + 地址无效 + 指纹格式无效 + 元数据无效。 + 权限无效。 + 签名无效。 + 用户名格式无效 + 最近更新 + 启动 + 许可证 + 许可证 %s + 亮色 + 链接已复制到剪贴板 + 链接 + 合并 %s + 名称 + 网络错误. + 从不 + 新的更新可用 + + %d 个更新. + %d 个更新. + + 没有可用的应用 + 没有已安装的应用 + 没有可用的描述。 + 未找到匹配的应用 + 无代理 + 更新通知 + 有可用更新时显示通知 + 应用数量 + 好的 + 仅与 %s 兼容 + 仅连到 Wi-Fi 时 + 打开 %s? + 其他 + 无法解析索引文件。 + 密码 + 缺少密码 + 权限 + +%d 个 + 设置 + 正在处理 %1$s + 项目网站 + 推广非自由网络服务 + 推广非自由软件 + 由 %s 提供 + 代理 + 代理主机 + 代理端口 + 代理类型 + 存储库 + 存储库 + 此存储库尚未使用。您需要启用它才能查看 它提供的应用程序。 - 未签名。无法验证此应用列表。小心下载 + 未签名。无法验证此应用列表。小心下载 来自未签名存储库的应用。 - 需要 %s - 保存 - 保存详情 - 截图 - 搜索 - 选择一个镜像 - 显示更多 - 显示旧版本 - 签名 %s - 使用不安全算法签名 - 跳过 - SOCKS 代理 - 排序顺序 - 源代码 - 源代码不再可用 - 建议 - 同步存储库 - 自动同步存储库 - 同步中 - 同步中 %s - 系统 - 点击安装。 - 主题 - 跟踪或报告您的活动 - 卸载 - 未知 - 未知错误。 - 未知: %s - 未签名 - 不稳定的更新 - 建议安装不稳定的版本 - 未验证 - 更新 - 更新 + 需要 %s + 保存 + 保存详情 + 截图 + 搜索 + 选择一个镜像 + 显示更多 + 显示旧版本 + 签名 %s + 使用不安全算法签名 + 跳过 + SOCKS 代理 + 排序顺序 + 源代码 + 源代码不再可用 + 建议 + 同步存储库 + 自动同步存储库 + 同步中 + 同步中 %s + 系统 + 点击安装。 + 主题 + 跟踪或报告您的活动 + 卸载 + 未知 + 未知错误。 + 未知: %s + 未签名 + 不稳定的更新 + 建议安装不稳定的版本 + 未验证 + 更新 + 更新 上游源代码不是自由的 用户名 缺少用户名 diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml index 08ff293b..36840f88 100644 --- a/src/main/res/values/attrs.xml +++ b/src/main/res/values/attrs.xml @@ -1,8 +1,8 @@ - - - + + + diff --git a/src/main/res/values/ids.xml b/src/main/res/values/ids.xml index 7b322222..97e478ae 100644 --- a/src/main/res/values/ids.xml +++ b/src/main/res/values/ids.xml @@ -1,11 +1,11 @@ - - - - - - + + + + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 7e606502..0b640569 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1,172 +1,172 @@ - Action failed - Add repository - Address - All applications - All applications up to date - Already exists - Always - Amoled - Anti-features - Application - Droid-ify - Application not found - Author email - Author website - Available - Bug tracker - Cancel - Cannot edit repository since it is syncing right now. - Changelog - Changes - Checking repository - Compiled for debugging - Confirmation - Connecting - Contains non-free media - Could not download %s - Could not sync %s - Could not validate %s - Credits - Dark - Date added - Delete - Are you sure you want to delete the repository? - Description - Details - Donate - Downloaded %s - Downloading - Downloading %s - Edit repository - Invalid file format. - Fingerprint - Has advertising - Has non-free dependencies - Has security vulnerabilities - Invalid server response. - HTTP proxy - Ignore all updates - Ignore this update - Your %1$s (API version %2$d) is not supported. %3$s - Maximum API version is %d. - Minimum API version is %d. - Missing features. - This version is older than the one installed on your device. + Action failed + Add repository + Address + All applications + All applications up to date + Already exists + Always + Amoled + Anti-features + Application + Droid-ify + Application not found + Author email + Author website + Available + Bug tracker + Cancel + Cannot edit repository since it is syncing right now. + Changelog + Changes + Checking repository + Compiled for debugging + Confirmation + Connecting + Contains non-free media + Could not download %s + Could not sync %s + Could not validate %s + Credits + Dark + Date added + Delete + Are you sure you want to delete the repository? + Description + Details + Donate + Downloaded %s + Downloading + Downloading %s + Edit repository + Invalid file format. + Fingerprint + Has advertising + Has non-free dependencies + Has security vulnerabilities + Invalid server response. + HTTP proxy + Ignore all updates + Ignore this update + Your %1$s (API version %2$d) is not supported. %3$s + Maximum API version is %d. + Minimum API version is %d. + Missing features. + This version is older than the one installed on your device. Uninstall that first. - Your %1$s platform is not supported. + Your %1$s platform is not supported. Supported platforms: %2$s. - This version is signed with a different certificate than the one + This version is signed with a different certificate than the one installed on your device. Uninstall that first. - Incompatible version - Incompatible versions - Show application versions incompatible with the device - Incompatible with %s - Install + Incompatible version + Incompatible versions + Show application versions incompatible with the device + Incompatible with %s + Install Installation Types - Installed - Could not check integrity. - Invalid address - Invalid fingerprint format - Invalid metadata. - Invalid permissions. - Invalid signature. - Invalid username format - Last update - Launch - License - License %s - Light - Link copied to clipboard - Links - Merging %s - Name - Network error. - Never - New updates available - - %d new update. - %d new updates. - - No applications available - No applications installed - No description available. - No matching applications found - No proxy - Notify about updates - Show a notification when updates are available - Number of applications - OK - Only compatible with %s - Only on Wi-Fi - Open %s? - Other - Could not parse the index file. - Password - Password missing - Permissions - +%d more - Settings - Processing %1$s - Project website - Promotes non-free network services - Promotes non-free software - Provided by %s - Proxy - Proxy host - Proxy port - Proxy type - Repositories - Repository - This repository has not been used yet. You need to enable it to view + Installed + Could not check integrity. + Invalid address + Invalid fingerprint format + Invalid metadata. + Invalid permissions. + Invalid signature. + Invalid username format + Last update + Launch + License + License %s + Light + Link copied to clipboard + Links + Merging %s + Name + Network error. + Never + New updates available + + %d new update. + %d new updates. + + No applications available + No applications installed + No description available. + No matching applications found + No proxy + Notify about updates + Show a notification when updates are available + Number of applications + OK + Only compatible with %s + Only on Wi-Fi + Open %s? + Other + Could not parse the index file. + Password + Password missing + Permissions + +%d more + Settings + Processing %1$s + Project website + Promotes non-free network services + Promotes non-free software + Provided by %s + Proxy + Proxy host + Proxy port + Proxy type + Repositories + Repository + This repository has not been used yet. You need to enable it to view the applications it provides. - Unsigned. Could not verify the application list. Be careful downloading + Unsigned. Could not verify the application list. Be careful downloading applications from unsigned repositories. - Requires %s - Silent Install - Allow Root Permission to enable Silent Install - Save - Saving details - Screenshots - Search - Select a mirror - Show more - Show older versions - Signature %s - Signed using an unsafe algorithm - Skip - SOCKS proxy - Sorting order - Source code - Source code no longer available - Suggested - Sync repositories - Sync repositories automatically - Syncing - Syncing %s - System - Tap to install. - Theme + Requires %s + Silent Install + Allow Root Permission to enable Silent Install + Save + Saving details + Screenshots + Search + Select a mirror + Show more + Show older versions + Signature %s + Signed using an unsafe algorithm + Skip + SOCKS proxy + Sorting order + Source code + Source code no longer available + Suggested + Sync repositories + Sync repositories automatically + Syncing + Syncing %s + System + Tap to install. + Theme Themes - Tracks or reports your activity - Uninstall - Unknown - Unknown error. - Unknown: %s - Unsigned - Unstable updates - Suggest installing unstable versions - Unverified - Update - Updates - Upstream source code is not free - Username - Username missing - Index could not be validated. - Version %s - Versions - Waiting to start download - Website + Tracks or reports your activity + Uninstall + Unknown + Unknown error. + Unknown: %s + Unsigned + Unstable updates + Suggest installing unstable versions + Unverified + Update + Updates + Upstream source code is not free + Username + Username missing + Index could not be validated. + Version %s + Versions + Waiting to start download + Website \ No newline at end of file