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