From a19238931871e143518421ae584a05b3ca0dd5ac Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 21 Jun 2016 00:17:11 +1000 Subject: [PATCH] Completely removed `CommaSeparatedList` class, replaced with two helper methods in `Utils`. The two helper methods alleviate the need for copious null checks. They also provide consistent behaviour when there are zero elements (i.e. they return null, rather than an empty string or empty array, as was the case before). --- .../java/org/fdroid/fdroid/AppFilter.java | 2 +- .../fdroid/fdroid/CompatibilityChecker.java | 3 +- .../org/fdroid/fdroid/RepoXMLHandler.java | 12 ++--- .../main/java/org/fdroid/fdroid/Utils.java | 44 +++++-------------- .../main/java/org/fdroid/fdroid/data/Apk.java | 16 +++---- .../main/java/org/fdroid/fdroid/data/App.java | 21 +++++---- .../org/fdroid/fdroid/data/AppProvider.java | 2 +- .../org/fdroid/fdroid/data/RepoPersister.java | 2 +- .../fdroid/localrepo/LocalRepoManager.java | 4 +- .../fdroid/fdroid/data/ApkProviderTest.java | 3 +- 10 files changed, 42 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppFilter.java b/app/src/main/java/org/fdroid/fdroid/AppFilter.java index 9b1036ac9..4983d922e 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppFilter.java +++ b/app/src/main/java/org/fdroid/fdroid/AppFilter.java @@ -27,7 +27,7 @@ public class AppFilter { public boolean filter(App app) { if (app.requirements != null && !Preferences.get().filterAppsRequiringRoot()) { for (String requirement : app.requirements) { - if (requirement.equals("root")) { + if ("root".equals(requirement)) { return true; } } diff --git a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java index 532a317d7..74d3b0f2a 100644 --- a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java +++ b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java @@ -7,6 +7,7 @@ import android.content.pm.PackageManager; import android.os.Build; import android.preference.PreferenceManager; import android.support.annotation.Nullable; +import android.text.TextUtils; import org.fdroid.fdroid.compat.SupportedArchitectures; import org.fdroid.fdroid.data.Apk; @@ -114,7 +115,7 @@ public class CompatibilityChecker { if (!compatibleApi(apk.nativecode)) { Collections.addAll(incompatibleReasons, apk.nativecode); Utils.debugLog(TAG, apk.packageName + " vercode " + apk.versionCode - + " only supports " + Utils.CommaSeparatedList.str(apk.nativecode) + + " only supports " + TextUtils.join(", ", apk.nativecode) + " while your architectures are " + cpuAbisDesc); } diff --git a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java index 8009fc403..f15b25a16 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java @@ -142,13 +142,13 @@ public class RepoXMLHandler extends DefaultHandler { curapk.added = Utils.parseDate(str, null); break; case "permissions": - curapk.permissions = Utils.CommaSeparatedList.make(str); + curapk.permissions = Utils.parseCommaSeparatedString(str); break; case "features": - curapk.features = Utils.CommaSeparatedList.make(str); + curapk.features = Utils.parseCommaSeparatedString(str); break; case "nativecode": - curapk.nativecode = Utils.CommaSeparatedList.make(str); + curapk.nativecode = Utils.parseCommaSeparatedString(str); break; } } else if (curapp != null) { @@ -218,13 +218,13 @@ public class RepoXMLHandler extends DefaultHandler { curapp.upstreamVersionCode = Utils.parseInt(str, -1); break; case "categories": - curapp.categories = Utils.CommaSeparatedList.make(str); + curapp.categories = Utils.parseCommaSeparatedString(str); break; case "antifeatures": - curapp.antiFeatures = Utils.CommaSeparatedList.make(str); + curapp.antiFeatures = Utils.parseCommaSeparatedString(str); break; case "requirements": - curapp.requirements = Utils.CommaSeparatedList.make(str); + curapp.requirements = Utils.parseCommaSeparatedString(str); break; } } else if ("description".equals(localName)) { diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 5cfd3eceb..5a8610dc4 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -57,12 +57,8 @@ import java.security.cert.CertificateEncodingException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.Formatter; -import java.util.Iterator; -import java.util.List; import java.util.Locale; public final class Utils { @@ -403,36 +399,6 @@ public final class Utils { return new Locale(languageTag); } - public static final class CommaSeparatedList { - @Nullable - public static String[] make(List list) { - if (list == null || list.isEmpty()) { - return null; - } - return list.toArray(new String[list.size()]); - } - - @Nullable - public static String[] make(String[] list) { - if (list == null || list.length == 0) { - return null; - } - return list; - } - - @Nullable - public static String[] make(@Nullable String list) { - if (TextUtils.isEmpty(list)) { - return null; - } - return list.split(","); - } - - public static String str(@Nullable String[] values) { - return values == null ? null : TextUtils.join(",", values); - } - } - public static DisplayImageOptions.Builder getImageLoadingOptions() { return new DisplayImageOptions.Builder() .cacheInMemory(true) @@ -510,6 +476,16 @@ public final class Utils { return result; } + @Nullable + public static String[] parseCommaSeparatedString(String values) { + return values == null || values.length() == 0 ? null : values.split(","); + } + + @Nullable + public static String serializeCommaSeparatedString(@Nullable String[] values) { + return values == null || values.length == 0 ? null : TextUtils.join(",", values); + } + private static Date parseDateFormat(DateFormat format, String str, Date fallback) { if (str == null || str.length() == 0) { return fallback; diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 66a280b6e..36d5db4e8 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -83,7 +83,7 @@ public class Apk extends ValueObject implements Comparable { added = Utils.parseDate(cursor.getString(i), null); break; case ApkProvider.DataColumns.FEATURES: - features = Utils.CommaSeparatedList.make(cursor.getString(i)); + features = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case ApkProvider.DataColumns.PACKAGE_NAME: packageName = cursor.getString(i); @@ -104,13 +104,13 @@ public class Apk extends ValueObject implements Comparable { apkName = cursor.getString(i); break; case ApkProvider.DataColumns.PERMISSIONS: - permissions = Utils.CommaSeparatedList.make(cursor.getString(i)); + permissions = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case ApkProvider.DataColumns.NATIVE_CODE: - nativecode = Utils.CommaSeparatedList.make(cursor.getString(i)); + nativecode = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case ApkProvider.DataColumns.INCOMPATIBLE_REASONS: - incompatibleReasons = Utils.CommaSeparatedList.make(cursor.getString(i)); + incompatibleReasons = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case ApkProvider.DataColumns.REPO_ID: repo = cursor.getInt(i); @@ -205,10 +205,10 @@ public class Apk extends ValueObject implements Comparable { values.put(ApkProvider.DataColumns.TARGET_SDK_VERSION, targetSdkVersion); values.put(ApkProvider.DataColumns.MAX_SDK_VERSION, maxSdkVersion); values.put(ApkProvider.DataColumns.ADDED_DATE, Utils.formatDate(added, "")); - values.put(ApkProvider.DataColumns.PERMISSIONS, Utils.CommaSeparatedList.str(permissions)); - values.put(ApkProvider.DataColumns.FEATURES, Utils.CommaSeparatedList.str(features)); - values.put(ApkProvider.DataColumns.NATIVE_CODE, Utils.CommaSeparatedList.str(nativecode)); - values.put(ApkProvider.DataColumns.INCOMPATIBLE_REASONS, Utils.CommaSeparatedList.str(incompatibleReasons)); + values.put(ApkProvider.DataColumns.PERMISSIONS, Utils.serializeCommaSeparatedString(permissions)); + values.put(ApkProvider.DataColumns.FEATURES, Utils.serializeCommaSeparatedString(features)); + values.put(ApkProvider.DataColumns.NATIVE_CODE, Utils.serializeCommaSeparatedString(nativecode)); + values.put(ApkProvider.DataColumns.INCOMPATIBLE_REASONS, Utils.serializeCommaSeparatedString(incompatibleReasons)); values.put(ApkProvider.DataColumns.IS_COMPATIBLE, compatible ? 1 : 0); return values; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 4075fe2c6..355d1a8ee 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -221,13 +221,13 @@ public class App extends ValueObject implements Comparable { lastUpdated = Utils.parseDate(cursor.getString(i), null); break; case AppProvider.DataColumns.CATEGORIES: - categories = Utils.CommaSeparatedList.make(cursor.getString(i)); + categories = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case AppProvider.DataColumns.ANTI_FEATURES: - antiFeatures = Utils.CommaSeparatedList.make(cursor.getString(i)); + antiFeatures = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case AppProvider.DataColumns.REQUIREMENTS: - requirements = Utils.CommaSeparatedList.make(cursor.getString(i)); + requirements = Utils.parseCommaSeparatedString(cursor.getString(i)); break; case AppProvider.DataColumns.IGNORE_ALLUPDATES: ignoreAllUpdates = cursor.getInt(i) == 1; @@ -334,7 +334,7 @@ public class App extends ValueObject implements Comparable { apk.targetSdkVersion = minTargetMax[1]; apk.maxSdkVersion = minTargetMax[2]; apk.packageName = this.packageName; - apk.permissions = Utils.CommaSeparatedList.make(packageInfo.requestedPermissions); + apk.permissions = packageInfo.requestedPermissions; apk.apkName = apk.packageName + "_" + apk.versionCode + ".apk"; apk.installedFile = apkFile; @@ -348,15 +348,14 @@ public class App extends ValueObject implements Comparable { abis.add(matcher.group(1)); } } - apk.nativecode = Utils.CommaSeparatedList.make(abis.toArray(new String[abis.size()])); + apk.nativecode = abis.toArray(new String[abis.size()]); final FeatureInfo[] features = packageInfo.reqFeatures; if (features != null && features.length > 0) { - final String[] featureNames = new String[features.length]; + apk.features = new String[features.length]; for (int i = 0; i < features.length; i++) { - featureNames[i] = features[i].name; + apk.features[i] = features[i].name; } - apk.features = Utils.CommaSeparatedList.make(featureNames); } final JarEntry aSignedEntry = (JarEntry) apkJar.getEntry("AndroidManifest.xml"); @@ -462,9 +461,9 @@ public class App extends ValueObject implements Comparable { values.put(AppProvider.DataColumns.SUGGESTED_VERSION_CODE, suggestedVersionCode); values.put(AppProvider.DataColumns.UPSTREAM_VERSION_NAME, upstreamVersionName); values.put(AppProvider.DataColumns.UPSTREAM_VERSION_CODE, upstreamVersionCode); - values.put(AppProvider.DataColumns.CATEGORIES, Utils.CommaSeparatedList.str(categories)); - values.put(AppProvider.DataColumns.ANTI_FEATURES, Utils.CommaSeparatedList.str(antiFeatures)); - values.put(AppProvider.DataColumns.REQUIREMENTS, Utils.CommaSeparatedList.str(requirements)); + values.put(AppProvider.DataColumns.CATEGORIES, Utils.serializeCommaSeparatedString(categories)); + values.put(AppProvider.DataColumns.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures)); + values.put(AppProvider.DataColumns.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements)); values.put(AppProvider.DataColumns.IS_COMPATIBLE, compatible ? 1 : 0); values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0); values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, ignoreThisUpdate); diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 1e9cc1eeb..0b2457dad 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -98,7 +98,7 @@ public class AppProvider extends FDroidProvider { cursor.moveToFirst(); while (!cursor.isAfterLast()) { final String categoriesString = cursor.getString(0); - String[] categoriesList = Utils.CommaSeparatedList.make(categoriesString); + String[] categoriesList = Utils.parseCommaSeparatedString(categoriesString); if (categoriesList != null) { Collections.addAll(categorySet, categoriesList); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java index 8f5d2e037..cb7ce562a 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java @@ -284,7 +284,7 @@ public class RepoPersister { final List reasons = checker.getIncompatibleReasons(apk); if (reasons.size() > 0) { apk.compatible = false; - apk.incompatibleReasons = Utils.CommaSeparatedList.make(reasons); + apk.incompatibleReasons = reasons.toArray(new String[reasons.size()]); } else { apk.compatible = true; apk.incompatibleReasons = null; diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java index a22146ced..5cf5ca1fe 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java @@ -454,7 +454,7 @@ public final class LocalRepoManager { private void tagFeatures(App app) throws IOException { serializer.startTag("", "features"); if (app.installedApk.features != null) { - serializer.text(Utils.CommaSeparatedList.str(app.installedApk.features)); + serializer.text(TextUtils.join(",", app.installedApk.features)); } serializer.endTag("", "features"); } @@ -462,7 +462,7 @@ public final class LocalRepoManager { private void tagNativecode(App app) throws IOException { if (app.installedApk.nativecode != null) { serializer.startTag("", "nativecode"); - serializer.text(Utils.CommaSeparatedList.str(app.installedApk.nativecode)); + serializer.text(TextUtils.join(",", app.installedApk.nativecode)); serializer.endTag("", "nativecode"); } } diff --git a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java index b1ba3a95d..d6fcd1b03 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java @@ -7,7 +7,6 @@ import android.net.Uri; import org.fdroid.fdroid.Assert; import org.fdroid.fdroid.BuildConfig; -import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.mock.MockApk; import org.fdroid.fdroid.mock.MockApp; import org.fdroid.fdroid.mock.MockRepo; @@ -410,7 +409,7 @@ public class ApkProviderTest extends FDroidProviderTest { assertNull(apk.added); assertNull(apk.hashType); - apk.features = Utils.CommaSeparatedList.make("one,two,three"); + apk.features = new String[] {"one", "two", "three" }; long dateTimestamp = System.currentTimeMillis(); apk.added = new Date(dateTimestamp); apk.hashType = "i'm a hash type";