From 6055874d9d8492fdca127faa92bec0860714fc41 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 15:23:01 +0100 Subject: [PATCH 1/6] do not crash if file vanishes during getBinaryHash() APKs can be deleted at any time, either by being uninstalled or deleted from the cache. --- .../main/java/org/fdroid/fdroid/Utils.java | 81 ++++++++++--------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 9c16d4674..089ffc192 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -38,12 +38,10 @@ import android.text.style.TypefaceSpan; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; - import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.utils.StorageUtils; - import org.fdroid.fdroid.compat.FileCompat; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.SanitizedFile; @@ -91,7 +89,7 @@ public final class Utils { new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss", Locale.ENGLISH); private static final String[] FRIENDLY_SIZE_FORMAT = { - "%.0f B", "%.0f KiB", "%.1f MiB", "%.2f GiB", + "%.0f B", "%.0f KiB", "%.1f MiB", "%.2f GiB", }; public static final String FALLBACK_ICONS_DIR = "/icons/"; @@ -205,31 +203,31 @@ public final class Utils { } private static final String[] ANDROID_VERSION_NAMES = { - "?", // 0, undefined - "1.0", // 1 - "1.1", // 2 - "1.5", // 3 - "1.6", // 4 - "2.0", // 5 - "2.0.1", // 6 - "2.1", // 7 - "2.2", // 8 - "2.3", // 9 - "2.3.3", // 10 - "3.0", // 11 - "3.1", // 12 - "3.2", // 13 - "4.0", // 14 - "4.0.3", // 15 - "4.1", // 16 - "4.2", // 17 - "4.3", // 18 - "4.4", // 19 - "4.4W", // 20 - "5.0", // 21 - "5.1", // 22 - "6.0", // 23 - "7.0", // 24 + "?", // 0, undefined + "1.0", // 1 + "1.1", // 2 + "1.5", // 3 + "1.6", // 4 + "2.0", // 5 + "2.0.1", // 6 + "2.1", // 7 + "2.2", // 8 + "2.3", // 9 + "2.3.3", // 10 + "3.0", // 11 + "3.1", // 12 + "3.2", // 13 + "4.0", // 14 + "4.0.3", // 15 + "4.1", // 16 + "4.2", // 17 + "4.3", // 18 + "4.4", // 19 + "4.4W", // 20 + "5.0", // 21 + "5.1", // 22 + "6.0", // 23 + "7.0", // 24 }; public static String getAndroidVersionName(int sdkLevel) { @@ -400,7 +398,16 @@ public final class Utils { /** * Get the checksum hash of the file {@code apk} using the algorithm in {@code algo}. * {@code apk} must exist on the filesystem and {@code algo} must be supported - * by this device, otherwise an {@link IllegalArgumentException} is thrown. + * by this device, otherwise an {@link IllegalArgumentException} is thrown. This + * method must be very defensive about checking whether the file exists, since APKs + * can be uninstalled/deleted in background at any time, even if this is in the + * middle of running. + *

+ * This also will run into filesystem corruption if the device is having trouble. + * So hide those so F-Droid does not pop up crash reports about that. As such this + * exception-message-parsing-and-throwing-a-new-ignorable-exception-hackery is + * probably warranted. See https://www.gitlab.com/fdroid/fdroidclient/issues/855 + * for more detail. */ public static String getBinaryHash(File apk, String algo) { FileInputStream fis = null; @@ -418,14 +425,12 @@ public final class Utils { byte[] mdbytes = md.digest(); return toHexString(mdbytes).toLowerCase(Locale.ENGLISH); } catch (IOException e) { - // The annoyance (potentially) caused by miscellaneous filesystem corruption results in - // F-Droid constantly popping up crash reports when F-Droid isn't even open. As such this - // exception-message-parsing-and-throwing-a-new-ignorable-exception-hackery is probably - // warranted. See https://www.gitlab.com/fdroid/fdroidclient/issues/855 for more detail. - if (e.getMessage().contains("read failed: EIO (I/O error)")) { + String message = e.getMessage(); + if (message.contains("read failed: EIO (I/O error)")) { throw new PotentialFilesystemCorruptionException(e); + } else if (message.contains(" ENOENT ")) { + Utils.debugLog(TAG, apk + " vanished: " + message); } - throw new IllegalArgumentException(e); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); @@ -537,10 +542,10 @@ public final class Utils { public static String formatLastUpdated(@NonNull Resources res, @NonNull Date date) { long msDiff = Calendar.getInstance().getTimeInMillis() - date.getTime(); - long days = msDiff / DateUtils.DAY_IN_MILLIS; - long weeks = msDiff / (DateUtils.DAY_IN_MILLIS * 7); + long days = msDiff / DateUtils.DAY_IN_MILLIS; + long weeks = msDiff / (DateUtils.DAY_IN_MILLIS * 7); long months = msDiff / (DateUtils.DAY_IN_MILLIS * 30); - long years = msDiff / (DateUtils.DAY_IN_MILLIS * 365); + long years = msDiff / (DateUtils.DAY_IN_MILLIS * 365); if (days < 1) { return res.getString(R.string.details_last_updated_today); From dffac4e7977f8219236ea6237823f2d5bbd25008 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 15:30:41 +0100 Subject: [PATCH 2/6] fix boot crash when Provisioner can't find ExternalFilesDir closes #1332 !630 --- .../java/org/fdroid/fdroid/Provisioner.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Provisioner.java b/app/src/main/java/org/fdroid/fdroid/Provisioner.java index e0265ac39..13464702d 100644 --- a/app/src/main/java/org/fdroid/fdroid/Provisioner.java +++ b/app/src/main/java/org/fdroid/fdroid/Provisioner.java @@ -21,6 +21,7 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -48,8 +49,11 @@ public class Provisioner { * search for provision files and process them */ public static void scanAndProcess(Context context) { - - File provisionDir = new File(context.getExternalFilesDir(null).getAbsolutePath(), NEW_PROVISIONS_DIR); + File externalFilesDir = context.getExternalFilesDir(null); + if (externalFilesDir == null) { + return; + } + File provisionDir = new File(externalFilesDir.getAbsolutePath(), NEW_PROVISIONS_DIR); if (!provisionDir.isDirectory()) { Utils.debugLog(TAG, "Provisions dir does not exists: '" + provisionDir.getAbsolutePath() + "' moving on ..."); @@ -105,13 +109,17 @@ public class Provisioner { } public List findProvisionFiles(Context context) { - String provisionDirPath = context.getExternalFilesDir(null).getAbsolutePath() + File.separator + NEW_PROVISIONS_DIR; - return findProvisionFilesInDir(new File(provisionDirPath)); + File externalFilesDir = context.getExternalFilesDir(null); + if (externalFilesDir == null) { + return Collections.emptyList(); + } + File provisionDir = new File(externalFilesDir.getAbsolutePath(), NEW_PROVISIONS_DIR); + return findProvisionFilesInDir(provisionDir); } protected List findProvisionFilesInDir(File file) { if (file == null || !file.isDirectory()) { - return new ArrayList<>(); + return Collections.emptyList(); } try { File[] files = file.listFiles(new FilenameFilter() { From b9144cc95d72ac065be46252ff13ebf363f114f6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 16:49:28 +0100 Subject: [PATCH 3/6] fix pedantic warnings in Provisioner.java to make null warnings clear The NullPointerException fixed by the previous commit had a warning to that effect. This fixes almost all the warnings to make the warnings clearer: * unused method * unused result of File.delete() * can have reduced visibility * single char static "" strings can be '' chars --- .../java/org/fdroid/fdroid/Provisioner.java | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Provisioner.java b/app/src/main/java/org/fdroid/fdroid/Provisioner.java index 13464702d..26782111f 100644 --- a/app/src/main/java/org/fdroid/fdroid/Provisioner.java +++ b/app/src/main/java/org/fdroid/fdroid/Provisioner.java @@ -4,9 +4,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Base64; - import com.fasterxml.jackson.databind.ObjectMapper; - import org.apache.commons.io.IOUtils; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; @@ -37,7 +35,7 @@ public class Provisioner { /** * This is the name of the subfolder in the file directory of this app * where {@link Provisioner} looks for new provisions. - * + *

* eg. in the Emulator (API level 24): /data/user/0/org.fdroid.fdroid.debug/files/provisions */ private static final String NEW_PROVISIONS_DIR = "provisions"; @@ -48,7 +46,7 @@ public class Provisioner { /** * search for provision files and process them */ - public static void scanAndProcess(Context context) { + static void scanAndProcess(Context context) { File externalFilesDir = context.getExternalFilesDir(null); if (externalFilesDir == null) { return; @@ -83,21 +81,24 @@ public class Provisioner { Uri origUrl = Uri.parse(repo.getUrl()); Uri.Builder data = new Uri.Builder(); data.scheme(origUrl.getScheme()); - data.encodedAuthority(Uri.encode(repo.getUsername()) + ":" + Uri.encode(repo.getPassword()) + "@" + Uri.encode(origUrl.getAuthority())); + data.encodedAuthority(Uri.encode(repo.getUsername()) + ':' + + Uri.encode(repo.getPassword()) + '@' + Uri.encode(origUrl.getAuthority())); data.path(origUrl.getPath()); data.appendQueryParameter("fingerprint", repo.getSigfp()); Intent i = new Intent(context, ManageReposActivity.class); i.setData(data.build()); context.startActivity(i); - Utils.debugLog(TAG, "Provision processed: '" + provision.getProvisonPath() + "' prompted user ..."); + Utils.debugLog(TAG, "Provision processed: '" + + provision.getProvisonPath() + "' prompted user ..."); } } // remove provision file try { - new File(provision.getProvisonPath()).delete(); - cleanupCounter++; + if (new File(provision.getProvisonPath()).delete()) { + cleanupCounter++; + } } catch (SecurityException e) { // ignore this exception Utils.debugLog(TAG, "Removing provision not possible: " + e.getMessage() + " ()"); @@ -108,7 +109,7 @@ public class Provisioner { } } - public List findProvisionFiles(Context context) { + private List findProvisionFiles(Context context) { File externalFilesDir = context.getExternalFilesDir(null); if (externalFilesDir == null) { return Collections.emptyList(); @@ -117,7 +118,7 @@ public class Provisioner { return findProvisionFilesInDir(provisionDir); } - protected List findProvisionFilesInDir(File file) { + List findProvisionFilesInDir(File file) { if (file == null || !file.isDirectory()) { return Collections.emptyList(); } @@ -153,7 +154,7 @@ public class Provisioner { return sb.toString(); } - protected String deobfuscate(String obfuscated) { + String deobfuscate(String obfuscated) { try { return new String(Base64.decode(rot13(obfuscated), Base64.DEFAULT), "UTF-8"); } catch (UnsupportedEncodingException e) { @@ -162,7 +163,7 @@ public class Provisioner { } } - protected List extractProvisionsPlaintext(List files) { + List extractProvisionsPlaintext(List files) { List result = new ArrayList<>(); if (files != null) { for (File file : files) { @@ -171,7 +172,7 @@ public class Provisioner { ZipInputStream in = null; try { in = new ZipInputStream(new FileInputStream(file)); - ZipEntry zipEntry = null; + ZipEntry zipEntry; while ((zipEntry = in.getNextEntry()) != null) { String name = zipEntry.getName(); if ("repo_provision.json".equals(name)) { @@ -202,7 +203,7 @@ public class Provisioner { return result; } - public List parseProvisions(List provisionPlaintexts) { + List parseProvisions(List provisionPlaintexts) { List provisions = new ArrayList<>(); ObjectMapper mapper = new ObjectMapper(); @@ -224,44 +225,44 @@ public class Provisioner { return provisions; } - public static class ProvisionPlaintext { + static class ProvisionPlaintext { private String provisionPath; private String repositoryProvision; - public String getProvisionPath() { + String getProvisionPath() { return provisionPath; } - public void setProvisionPath(String provisionPath) { + void setProvisionPath(String provisionPath) { this.provisionPath = provisionPath; } - public String getRepositoryProvision() { + String getRepositoryProvision() { return repositoryProvision; } - public void setRepositoryProvision(String repositoryProvision) { + void setRepositoryProvision(String repositoryProvision) { this.repositoryProvision = repositoryProvision; } } - public static class Provision { + static class Provision { private String provisonPath; private RepositoryProvision repositoryProvision; - public String getProvisonPath() { + String getProvisonPath() { return provisonPath; } - public void setProvisonPath(String provisonPath) { + void setProvisonPath(String provisonPath) { this.provisonPath = provisonPath; } - public RepositoryProvision getRepositoryProvision() { + RepositoryProvision getRepositoryProvision() { return repositoryProvision; } - public void setRepositoryProvision(RepositoryProvision repositoryProvision) { + void setRepositoryProvision(RepositoryProvision repositoryProvision) { this.repositoryProvision = repositoryProvision; } } From 978f4a2928d6b6ac227e725becd534f97d8564d9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 16:54:34 +0100 Subject: [PATCH 4/6] ignore potential filesystem corruption As nice as it would be to help the users, F-Droid is not well positioned to help the user with this problem. The Android OS itself should do it. Plus this issue has been open a long time, without much work on it, and the existing solution is causing crashes. #855 !440 !581 Utils.getBinaryHash() is used in a lot of places in the code, so its not easy to handle this specific issue. Here's one example: org.fdroid.fdroid.Utils$PotentialFilesystemCorruptionException: java.io.IOException: read failed: EIO (I/O error) at org.fdroid.fdroid.Utils.getBinaryHash(Utils.java:426) at org.fdroid.fdroid.AppUpdateStatusService.findApkMatchingHash(AppUpdateStatusService.java:159) at org.fdroid.fdroid.AppUpdateStatusService.processDownloadedApk(AppUpdateStatusService.java:110) at org.fdroid.fdroid.AppUpdateStatusService.onHandleIntent(AppUpdateStatusService.java:65) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.os.HandlerThread.run(HandlerThread.java:60) --- app/src/main/java/org/fdroid/fdroid/Utils.java | 8 +------- .../fdroid/data/InstalledAppProviderService.java | 11 ----------- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-ast/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bo/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-id/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - 44 files changed, 1 insertion(+), 60 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 089ffc192..bb3873309 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -427,7 +427,7 @@ public final class Utils { } catch (IOException e) { String message = e.getMessage(); if (message.contains("read failed: EIO (I/O error)")) { - throw new PotentialFilesystemCorruptionException(e); + Utils.debugLog(TAG, "potential filesystem corruption while accessing " + apk + ": " + message); } else if (message.contains(" ENOENT ")) { Utils.debugLog(TAG, apk + " vanished: " + message); } @@ -439,12 +439,6 @@ public final class Utils { } } - public static class PotentialFilesystemCorruptionException extends IllegalArgumentException { - public PotentialFilesystemCorruptionException(IOException e) { - super(e); - } - } - /** * Computes the base 16 representation of the byte array argument. * diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index 5b2aaec29..035c2ff28 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -11,11 +11,9 @@ import android.net.Uri; import android.os.Process; import android.support.annotation.Nullable; import android.util.Log; -import android.widget.Toast; import org.acra.ACRA; import org.fdroid.fdroid.AppUpdateStatusManager; import org.fdroid.fdroid.Hasher; -import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Schema.InstalledAppTable; import rx.functions.Action1; @@ -249,15 +247,6 @@ public class InstalledAppProviderService extends IntentService { } insertAppIntoDb(this, packageInfo, hashType, hash); - } catch (Utils.PotentialFilesystemCorruptionException e) { - String msg = getString(R.string.installed_app__file_corrupt, apk.getAbsolutePath()); - Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); - Log.e(TAG, "Encountered potential filesystem corruption, or other unknown " + - "problem when calculating hash of " + apk.getAbsolutePath() + ". " + - "It is unlikely F-Droid can do anything about this, and this " + - "likely happened in the background. As such, we will continue without " + - "interrupting the user by asking them to send a crash report."); - return; } catch (IllegalArgumentException e) { Utils.debugLog(TAG, e.getMessage()); ACRA.getErrorReporter().handleException(e, false); diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index cd6a12d94..963cc14ef 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -467,7 +467,6 @@ التحديث تم تخطيه تخطي الحساسية - أف-درويد تلقي خطأ EIO:ربما %s تالف! لقد وجدنا ثغرة في %1$s. نحن نوصي بإلغاء تثبيت هذا التطبيق في الحال. لقد وجدنا ثغرة في %1$s. نحن نوصي بالتحديث إلي أحدث إصدار في الحال. حينما يتم تحديث قائمة التطبيقات، التطبيقات الأخيرة سوف تظهر هنا diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 24e29b559..5ff39473d 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -509,7 +509,6 @@ Inseguridá inorada Descarga encaboxada - F-Droid recibió un error EIO: ¡probablemente %s ta corrompíu! Alcontramos una inseguridá con %1$s. Recomendamos desinstalar esta app nel intre. Alcontramos una inseguridá con %1$s. Recomendamos actualizar a la versión más nueva nel intre. Inorar diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 2176302a9..21d71c93e 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -545,7 +545,6 @@ Няма супадзенняў сярод даступных праграм. - F-Droid атрымаў EIO-памылку: %s верагодна пашкоджаны! Абнаўленне ігнаруецца Уразлівасць ігнаруецца Спампоўка адмененая diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4ae88df73..272489f05 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -498,7 +498,6 @@ Изтeглено и готово за инсталиране Спряно изтегляне - Входно-изходна грешка. %s вероятно е повреден! Открита е уязвимост в %1$s. Препоръчва се незабавно обновяване до най-новата версия. Лични данни Без снимки на екрана diff --git a/app/src/main/res/values-bo/strings.xml b/app/src/main/res/values-bo/strings.xml index 2f1d03c01..f89e18626 100644 --- a/app/src/main/res/values-bo/strings.xml +++ b/app/src/main/res/values-bo/strings.xml @@ -466,7 +466,6 @@ ཡ་ལན་མ་བྱས་པའི་ཉེན་ཁ། ཕབ་ལེན་བརྩི་མེད། - ཨེཕ་རོཌ་ལ་EIO ནོར་སྐྱོན་འདུག :%s ཕལ་ཆེར་སྐྱོན་ཤོར་ཡོད་ས་རེད། ང་ཚོས་ %1$s འདི་དང་མཉམ་དུ་ཉེན་ཁ་འབྱུང་ཉེ་བ་རྙེད་སོང་། མཉེན་ཆས་འདི་ལམ་སེང་ཕྱིར་དབྱུང་བྱེད་རྒྱུའི་རེ་བ་ཞུ་གི་ཡོད། ང་ཚོས་ %1$s འདི་དང་མཉམ་དུ་ཉེན་ཁ་འབྱུང་ཉེ་བ་རྙེད་སོང་། ཁྱེད་རང་གིས་གང་མགྱོགས་ཐོན་རིམ་གསར་ཤོས་འདི་ལ་གསར་བསྒྱུར་བྱེད་རྒྱུའི་རེ་བ་འདོན་རྒྱུ་ཡིན། ཡ་ལན་མ་བྱས་པ། diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 887ef7275..15eb95b85 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -490,7 +490,6 @@ Vulnerabilitat ignorada Baixada cancel·lada - Error EIO rebut a l\'F-Droid: %s probablement és corrupte! S\'ha trobat una vulnerabilitat a %1$s. Us recomanem suprimir aquesta aplicació immediatament. S\'ha trobat una vulnerabilitat a %1$s. Us recomanem actualitzar immediatament a la versió més recent. Ignora diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ed96e61ec..cef3bbc4e 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -445,7 +445,6 @@ Zranitelnost ignorována Stahování zrušeno - F-Droid obdržel EIO chybu: %s je pravděpodobně poškozené! V %1$s byla nalezena zranitelnost. Doporučujeme tuto aplikaci okamžitě odinstalovat. V %1$s byla nalezena zranitelnost. Doporučujeme tuto aplikaci aktualizovat na nejnovější verzi. Ignorovat diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 001d1b2b3..0076a59ab 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -497,7 +497,6 @@ Sårbarhed ignoreret Hentning annulleret - F-Droid modtog EIO-fejl: %s er formentlig korrupt! Vi har fundet en sårbarhed med %1$s. Vi anbefaler, at du afinstallerer denne app med det samme. Vi har fundet en sårbarhed med %1$s. Vi anbefaler, at du opgraderer til den nyeste version med det samme. Ignorer diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ae29efd9b..a09bd0281 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -510,7 +510,6 @@ Keine mit dem Gerät kompatiblen Versionen Die installierte Version ist mit keiner der vorhandenen Versionen kompatibel. Eine Deinstallation der App ermöglicht Ihnen, kompatible Versionen anzusehen und zu installieren. Dies tritt häufig bei Apps auf, die über Google Play oder andere Quellen installiert wurden, da sie mit einem anderen Zertifikat signiert sind. - F-Droid empfing einen EIO-Fehler: Möglicherweise ist %s beschädigt! Aktualisierung ignoriert Sicherheitslücke ignoriert Herunterladen abgebrochen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 972d63218..f3621df26 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -461,7 +461,6 @@ Η ευπάθεια αγνοήθηκε Ακύρωση λήψης - Το F-Droid έχει ένα ΕΙΟ σφάλμα: Το %s είναι πιθανόν κατεστραμμένο! Βρέθηκε ευπάθεια με %1$s. Συνίσταται να απεγκαταστήσετε αυτή την εφαρμογή αμέσως. Βρέθηκε ευπάθεια με %1$s. Συνίσταται να αναβαθμίσετε αυτή την εφαρμογή αμέσως στη νεότερη έκδοση. Αγνοήστε diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index aefc4ff85..80432f4fa 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -494,7 +494,6 @@ Neniuj versioj kongruaj kun la aparato La instalita versio ne kongruas kun ĉiuj disponeblaj versioj. Malinstalado de aplikaĵo ebligos al vi vidigi kaj instali kongruajn versiojn. Tio ĉi ofte okazas ĉe aplikaĵoj instalitaj el Google Play aŭ aliaj fontoj, se ili estas subskribitaj per alia atestilo. - F-Droid renkontis EIO-eraron: %s probable estas difektita! Ĝisdatigo ignorata Sekurec-fliko ignorata Elŝuto nuligita diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2e60c48d0..695c46e29 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -512,7 +512,6 @@ No hay versiones compatibles con el dispositivo La versión instalada no es compatible con ninguna de las versiones disponibles. Desinstalar la aplicación te permitirá ver e instalar las versiones compatibles. Esto ocurre a menudo con aplicaciones instaladas a través de Google Play o de otras fuentes, si se han firmado con un certificado diferente. - F-Droid recibió un error EIO: ¡probablemente %s está corrupto! Actualización ignorada Vulnerabilidad ignorada Descarga cancelada diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index b44428419..0e2980c28 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -418,7 +418,6 @@ Paigaldatud rakendused Värskendusi ignoreeriti Versiooni %1$s värskendust ignoreeriti - F-Droid sai EIO vea: %s on ilmselt rikutud! Laadi alla kõik värskendused %1$s sees leiti haavatavus. Soovitatav on see rakendus koheselt eemaldada. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 738347544..feb1b6dd7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -531,7 +531,6 @@ Ez dago gailuarekin bateragarria den bertsiorik Instalatutako bertsioa ez da bateragarria eskuragarri duden bertsioekin. Aplikazioa desinstalatzeak bertsio bateragarriak ikusi eta instalatzea ahalbidetuko dizu. Hau Gogle Play edo beste iturrietatik instalatutako aplikazioekin gertatu ohi da, ziurtagiri desberdin batekin sinatu direlako. - F-Droid-ek EIO errorea jaso du: %s hondatuta egon daiteke! Eguneraketa ezikusia Ahultasun ezikusia Deskarga utzita diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 4ea029f93..059819f01 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -481,7 +481,6 @@ آسیب‌پذیری نادیده گرفته شد بارگیری لغو شد - اف‌دروید خطای EIO گرفت: احتمالاً %s خراب است! یک آسیب‌پذیری در %1$s پیدا شد. توصیه می‌شود فوراً این کاره را حذف نصب کنید. یک آسیب‌پذیری در %1$s پیدا شد. توصیه می‌شود فوراً به جدیدترین نگارش ارتقا دهید. نادیده گرفتن diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d350bbe24..ff30f232f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -515,7 +515,6 @@ Aucune version ne possède une signature compatible La version installée n\'est compatible avec aucune des versions disponibles. Désinstaller cette application vous permettra de consulter et installer les versions compatibles. Ce problème est fréquent avec les applications installées depuis Google Play ou d\'autres sources, si elles sont signées à l\'aide d\'un certificat différent. - F-Droid a reçu une erreur EIO : %s est probablement corrompu ! Mise à jour ignorée Vulnérabilité ignorée Téléchargement annulé diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 989a48c72..ca14b42eb 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -386,7 +386,6 @@ Aplicacións instaladas Anovacións ignoradas Anovacións ignoradas para a versión %1$s - F-Droid recibiu un erro EIO: ¡probablemente %s está corrupto! Descargar todas as anovacións Atopamos unha vulnerabilidade en %1$s. Recomendamos desinstalar esta app inmediatamente. diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 2100e261e..1a093bb3e 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -502,7 +502,6 @@ אין גרסאות תואמות להתקן זה הגרסה המותקנת אינה תואמת לכל הגרסאות הנתמכות. הסרת היישומון תאפשר לך לצפות ולהתקין גרסאות תואמות. מצב זה קורה לרוב עם יישומונים שמותקנים דרך Google Play או מקורות אחרים, אם היישומונים נחתמו עם אישור אחר. - התקבלה שגיאת קלט/פלט ב־F-Droid: כנראה כי קיימת תקלה מול %s! מצאנו חולשה אצל %1$s. אנו ממליצים להסיר את היישומון הזה מיידית. מצאנו חולשה אצל %1$s. אנו ממליצים לשדרג את היישומון הזה לגרסה החדשה ביותר מיידית. התעלמות diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 66da980fe..2202c780f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -447,7 +447,6 @@ %1$d éve frissítve A fájl telepítve ide: %s - Az F-Droid EIO hibát kapott: a(z) %s valószínűleg sérült! Alkalmazás részleteinek mentése (%1$d / %2$d), forrás: %3$s %d megtekintése diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 75570085d..f69c3aec7 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -498,7 +498,6 @@ Pembaruan diabaikan Unduhan dibatalkan - F-Droid menerima galat EIO: %s mungkin rusak! Abaikan Tanda tangan berbeda dari versi terpasang diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 83aa1aa82..371340680 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -549,7 +549,6 @@ Öryggisgalli hunsaður Hætt við niðurhal - F-Droid tók á móti EIO-villu: %s er líklega skemmd! Við fundum öryggisveilu í %1$s. Við mælum með því að þetta forrit verði fjarlægt strax. Við fundum öryggisveilu í %1$s. Við mælum með því að þetta forrit verði strax uppfært í nýjustu útgáfuna. Hunsa diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1a2b5dec7..263da8f8c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -530,7 +530,6 @@ Vulnerabilità ignorata Download annullato - F-Droid ha ricevuto un errore EIO: %s probabilmente è corrotto! Abbiamo trovato una vulnerabilità in %1$s. Ti raccomandiamo di disinstallare questa applicazione immediatamente. Abbiamo trovato una vulnerabilità in %1$s. Ti raccomandiamo di aggiornare all\'ultima versione immediatamente. Ignora diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1303db421..633c8744f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -460,7 +460,6 @@ 脆弱性を無視しました ダウンロードをキャンセルしました - F-DroidがEIOエラーを受信しました: %sは壊れている可能性があります! %1$sで脆弱性を発見しました。今すぐにこのアプリをアンインストールすることをおすすめします。 %1$sで脆弱性を発見しました。今すぐに最新バージョンへのアップグレードすることをおすすめします。 無視する diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4960c5588..0bda60e66 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -366,7 +366,6 @@ 설치된 앱 업데이트 무시됨 버전 %1$s의 업데이트 무시됨 - F-Droid가 EIO 오류를 수신했습니다: %s은(는) 아마도 손상되었을 것입니다! 모든 업데이트 다운로드 무시 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 0b4ebf60d..fe508e723 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -506,7 +506,6 @@ Ingen versjoner kompatible med enhet Den installerte versjonen er ikke kompatibel med noen tilgjengelig versjoner. Å avinstallere programmet vil la deg vise og installere kompatible versjoner. Dette skjer ofte når programmer er installert via Google Play eller fra andre kilder, hvis de er signert med et annet sertifikat. - F-Droid støtte på en EIO-feil: %s er antagelig skadet! Oppdatering oversett Sårbarhet ignorert Nedlasting avbrutt diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c522e2a67..1f9d1bd87 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -493,7 +493,6 @@ Geen versies compatibel met apparaat De geïnstalleerde versie is niet compatibel met de beschikbare versies. Door de app te verwijderen zullen compatibele versies worden weergegeven, waarna je ze kan installeren. Dit gebeurt vaak wanneer je apps installeert via Google Play of andere bronnen, en deze door een ander certificaat zijn ondertekend. - F-Droid ontving een EIO-fout: %s is waarschijnlijk beschadigd! Update genegeerd Kwetsbaarheid genegeerd Download geannuleerd diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e24d7f419..9b45f4d7a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -523,7 +523,6 @@ Brak wersji zgodnych z urządzeniem Zainstalowana wersja nie jest kompatybilna z jakąkolwiek dostępną wersją. Odinstalowanie aplikacji umożliwi podgląd i zainstalowanie zgodnych wersji. To często zdarza się w przypadku aplikacji zainstalowanych ze Sklepu Play lub z innych źródeł, jeżeli są one podpisane innym kluczem. - F-Droid napotkał na błąd EIO: %s prawdopodobnie jest uszkodzony! Ignorowana aktualizacja Ignorowana łatka bezpieczeństwa Anulowano pobieranie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1be1ad4c4..5431882d4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -526,7 +526,6 @@ Vulnerabilidade ignorada Baixar cancelado - F-Droid recebeu erro EIO: %s está provavelmente corrompido! Nós encontramos uma vulnerabilidade com o %1$s. Nós recomendamos desinstalar o aplicativo imediatamente. Nós encontramos uma vulnerabilidade com o %1$s. Nós recomendamos atualizar para a versão mais nova imediatamente. Ignorar diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4ff64dce6..4229fc2ac 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -533,7 +533,6 @@ Vulnerabilidade ignorada Descarga cancelada - Ocorreu um erro EIO: possivelmente %s está danificada! Encontrámos uma vulnerabilidade em %1$s. Recomendamos a desinstalação imediata da aplicação. Encontrámos uma vulnerabilidade em %1$s. Recomendamos a atualização imediata da aplicação. Ignorar diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 349190568..896b953cc 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -471,7 +471,6 @@ Nici o versiune nu este compatibilă cu acest dispozitiv Versiunea instalată nu este compatibilă cu cele disponibile. Dacă dezinstalați aplicația veți putea vedea și instala versiunile compatibile. Acest fapt se întâmplă cel mai des atunci când aplicațiile sunt instalate din Google Play sau din alte surse, dacă sunt semnate cu un certificat diferit. - F-Droid a întâlnit o eroare EIO: %s este probabil corupt! Actualizare ignorată Vulnerabilitate ignorată Descărcare anulată diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index da55d57cb..bae9ee11a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -508,7 +508,6 @@ Уязвимость игнорируется Загрузка отменена - F-Droid получил ошибку EIO: вероятно, файл %s поврежден! Обнаружена уязвимость в %1$s. Мы рекомендуем немедленно удалить это приложение. Обнаружена уязвимость в %1$s. Мы рекомендуем немедленно обновиться до новейшей версии. Пропустить diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 7440aad16..e5f313732 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -533,7 +533,6 @@ Peruna versione cumpatìbile cun su dispositivu Sa versione installada no est cumpatìbile cun sas versiones disponìbiles. Disinstallende s\'aplicatzione t\'at a permìtere de bìdere e installare versiones cumpatìbiles. Custu acontessit, a s\'ispissu, cun aplicatziones installadas pro mèdiu de Google Play o àteras mitzas, si sunt firmadas cun unu tzertificadu diferente. - F-Droid at retzidu un\'errore EIO: %s est probabilmente corrùmpidu! Agiornamentu ignoradu Vulnerabilidade ignorada Iscantzellamentu annulladu diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1834f86ba..d4c35471e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -530,7 +530,6 @@ Zraniteľnosť bola ignorovaná Sťahovanie bolo zrušené - F-Droid obdržal chybu EIO: %s je pravdepodobne poškodený! Zistili sme zraniteľnosť %1$s. Odporúčame okamžite odinštalovať túto aplikáciu. Objavili sme zraniteľnosť %1$s. Odporúčame ihneď aktualizovať na najnovšiu verziu. Ignorovať diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index cb9f110e2..292db887b 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -514,7 +514,6 @@ Рањивост је занемарена Преузимање отказано - Ф-дроид је примио ЕУИ грешку: %s је вероватно покварена! Пронашли смо безбедносну рањивост у %1$s. Препоручујемо да сместа уклоните апликацију. Пронашли смо безбедносну рањивост у %1$s. Препоручујемо да сместа надоградите апликацију. Занемари diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index d38d8ad1c..93d33c9c2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -488,7 +488,6 @@ Inga versioner är kompatibla med enheten Den installerade versionen är inte kompatibel med några tillgängliga versioner. Om du avinstallerar appen kan du visa och installera kompatibla versioner. Det här händer ofta med appar installerade via Google Play eller andra källor, om de är signerade med ett annat certifikat. - F-Droid mottog EIO-fel: %s är förmodligen korrupt! Uppdatering ignorerad Sårbarhet ignorerad Hämtning avbruten diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7fbc04b66..e201fa089 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -503,7 +503,6 @@ Cihazla uyumlu sürüm yok Kurulu sürüm hiçbir kullanılabilir sürümle uyumlu değil. Uygulamayı kaldırmak, uyumlu sürümleri görüntüleyip kurmanızı sağlayacaktır. Bu genellikle, farklı bir sertifika ile imzalanmışsa, Google Play veya diğer kaynaklar aracılığıyla kurulmuş uygulamalarda oluşur. - F-Droid EIO hatası aldı: %s büyük olasılıkla bozuk! Güncelleme yok sayıldı Güvenlik açığı yok sayıldı İndirme iptal edildi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f89007e2b..96efff5a9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -511,7 +511,6 @@ Завантажено, готовий до встановлення Збереження деталей застосунку (%1$d/%2$d) з %3$s - F-Droid отримав помилку EIO: %s ймовірно, зіпсований! Оновлення ігнорується Вразливість ігнорується Завантаження скасовано diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 33560bdac..9da0edd01 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -375,7 +375,6 @@ Ứng dụng đã cài đặt Đã bỏ qua các cập nhật Đã bỏ qua cập nhật với phiên bản %1$s - F-Droid nhận được lỗi vào ra: Có khả năng %s đã bị hỏng! Tải về tất cả các bản cập nhật Chúng tôi đã tìm thấy lỗ hổng bảo mật trong ứng dụng %1$s. Chúng tôi khuyên bạn gỡ bỏ ứng dụng này ngay lập tức. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 089673006..f58e03b1a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -457,7 +457,6 @@ 已忽略漏洞 已取消下载 - F-Droid收到了EIO错误:%s很可能已经损毁! 我们发现了关于%1$s的漏洞,建议您立即卸载此应用。 我们发现了关于%1$s的漏洞,建议您立即升级到最新的版本。 忽略 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3889416b8..7e9a6c750 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -456,5 +456,4 @@ 沒有與裝置相容的版本 已安裝的程式版本與可供安裝的版本並不相容。卸載現有的應用程式將讓您檢視及安裝相容的版本。此問題通常出現於透過 Google Play 或其他途徑安裝,並使用不同認證的應用程式。 - F-Droid 偵測到一個 EIO 錯誤:%s 很可能已崩潰! diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 913590e30..8e0afeb6b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -469,7 +469,6 @@ 沒有與裝置相容的版本 已安裝的版本不相容於任何可用的版本。解除安裝該應用程式,將使您能夠查看和安裝相容的版本。這通常是透過 Google Play 或其它來源安裝的應用程式,如果它們是由不同的證書簽署時才會發生。 - F-Droid 接收到 EIO 錯誤:%s 很可能已損壞! 已忽略更新 已忽略漏洞 已取消下載 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 26a67f65b..eea0e7a19 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -96,7 +96,6 @@ This often occurs with apps installed via Google Play or other sources, if they Updates ignored for Version %1$s - F-Droid received EIO error: %s is probably corrupt! Download Download all updates From 5547f1252712f858c6a7c0f23e5dcab787cb3425 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 18:02:20 +0100 Subject: [PATCH 5/6] actually fix crashes from update notifications on < android-11 8600ce8d8a56398a4eb731f0cccb848c4e18d2eb didn't get all the affected places. #1306 --- .../fdroid/fdroid/AppUpdateStatusManager.java | 56 ++++++++++++------- .../org/fdroid/fdroid/NotificationHelper.java | 10 ++-- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java index b9ae3c7fe..fa7faeaf1 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java +++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; @@ -36,7 +37,6 @@ import java.util.Map; * and {@code versionCode} since there could be different copies of the same * APK on different servers, signed by different keys, or even different builds. */ -@SuppressWarnings("LineLength") public final class AppUpdateStatusManager { private static final String TAG = "AppUpdateStatusManager"; @@ -132,7 +132,7 @@ public final class AppUpdateStatusManager { */ public String toString() { return app.packageName + " [Status: " + status - + ", Progress: " + progressCurrent + " / " + progressMax + "]"; + + ", Progress: " + progressCurrent + " / " + progressMax + ']'; } protected AppUpdateStatus(Parcel in) { @@ -257,20 +257,14 @@ public final class AppUpdateStatusManager { boolean isStatusUpdate = entry.status != status; entry.status = status; entry.intent = intent; - // If intent not set, see if we need to create a default intent - if (entry.intent == null) { - entry.intent = getContentIntent(entry); - } + setEntryContentIntentIfEmpty(entry); notifyChange(entry, isStatusUpdate); } private void addApkInternal(@NonNull Apk apk, @NonNull Status status, PendingIntent intent) { Utils.debugLog(LOGTAG, "Add APK " + apk.apkName + " with state " + status.name()); AppUpdateStatus entry = createAppEntry(apk, status, intent); - // If intent not set, see if we need to create a default intent - if (entry.intent == null) { - entry.intent = getContentIntent(entry); - } + setEntryContentIntentIfEmpty(entry); appMapping.put(entry.getUniqueKey(), entry); notifyAdd(entry); } @@ -453,6 +447,7 @@ public final class AppUpdateStatusManager { } } + @SuppressWarnings("LineLength") void clearAllUpdates() { synchronized (appMapping) { for (Iterator> it = appMapping.entrySet().iterator(); it.hasNext(); ) { // NOCHECKSTYLE EmptyForIteratorPad @@ -465,6 +460,7 @@ public final class AppUpdateStatusManager { } } + @SuppressWarnings("LineLength") void clearAllInstalled() { synchronized (appMapping) { for (Iterator> it = appMapping.entrySet().iterator(); it.hasNext(); ) { // NOCHECKSTYLE EmptyForIteratorPad @@ -477,28 +473,46 @@ public final class AppUpdateStatusManager { } } - private PendingIntent getContentIntent(AppUpdateStatus entry) { + /** + * If the {@link PendingIntent} aimed at {@link Notification.Builder#setContentIntent(PendingIntent)} + * is not set, then create a default one. The goal is to link the notification + * to the most relevant action, like the installer if the APK is downloaded, or the launcher once + * installed, if possible, or other relevant action. If there is no app launch + * {@code PendingIntent}, the app is probably not launchable, e.g. its a keyboard. + * If there is not an {@code PendingIntent} to install the app, this creates an {@code PendingIntent} + * to open up the app details page for the app. From there, the user can hit "install". + *

+ * Before {@code android-11}, a {@code ContentIntent} was required in every + * {@link Notification}. This generates a boilerplate one for places where + * there isn't an obvious one. + */ + private void setEntryContentIntentIfEmpty(AppUpdateStatus entry) { + if (entry.intent != null) { + return; + } switch (entry.status) { case UpdateAvailable: case ReadyToInstall: - // Make sure we have an intent to install the app. If not set, we create an intent - // to open up the app details page for the app. From there, the user can hit "install" - return getAppDetailsIntent(entry.apk); - + entry.intent = getAppDetailsIntent(entry.apk); + break; case InstallError: - return getAppErrorIntent(entry); - + entry.intent = getAppErrorIntent(entry); + break; case Installed: PackageManager pm = context.getPackageManager(); Intent intentObject = pm.getLaunchIntentForPackage(entry.app.packageName); if (intentObject != null) { - return PendingIntent.getActivity(context, 0, intentObject, 0); + entry.intent = PendingIntent.getActivity(context, 0, intentObject, 0); } else { - // Could not get launch intent, maybe not launchable, e.g. a keyboard - return getAppDetailsIntent(entry.apk); + entry.intent = getAppDetailsIntent(entry.apk); } + break; + } + if (Build.VERSION.SDK_INT < 11 && entry.intent == null) { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + entry.intent = PendingIntent.getActivity(context, 0, intent, 0); } - return null; } /** diff --git a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java index 1f5fa61b5..7d9a5d9d6 100644 --- a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java @@ -77,9 +77,12 @@ class NotificationHelper { BroadcastReceiver receiverAppStatusChanges = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + AppUpdateStatusManager.AppUpdateStatus entry; String url; - switch (intent.getAction()) { case AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED: notificationManager.cancelAll(); @@ -434,11 +437,6 @@ class NotificationHelper { PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT); builder.setDeleteIntent(piDeleted); - if (Build.VERSION.SDK_INT < 11) { - Intent intent = new Intent(); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0)); - } return builder.build(); } From 215db818024ccebfc9253eb2be43f6a3268303b6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Mar 2018 16:45:44 +0100 Subject: [PATCH 6/6] use warning suggestions for .addAll() method and null guard --- .../org/fdroid/fdroid/views/updates/UpdatesAdapter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java index 51f1ae792..7489c28a8 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java @@ -63,7 +63,6 @@ import java.util.Set; * TODO: If a user downloads an old version of an app (resulting in a new update being available * instantly), then we need to refresh the list of apps to update. */ -@SuppressWarnings("LineLength") public class UpdatesAdapter extends RecyclerView.Adapter implements LoaderManager.LoaderCallbacks { @@ -170,9 +169,7 @@ public class UpdatesAdapter extends RecyclerView.Adapter