From d99b357a1fe8ca3fb2a673ad4177eb70f8b79167 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Mon, 20 Jun 2016 22:24:52 +1000 Subject: [PATCH] Replace `CommaSeparatedList` with `String[]`. This is a combination of: * `String[].split(",")` and * `TextUtils.join(",", values)` It seems a bit wastefull to have our own implementation of these two things which lightly wrap this code, and produce a datastructure which is non standard and foreign to Java developers. --- .../java/org/fdroid/fdroid/AppDetails.java | 6 +- .../java/org/fdroid/fdroid/AppFilter.java | 11 ++- .../fdroid/fdroid/CompatibilityChecker.java | 14 ++-- .../main/java/org/fdroid/fdroid/Utils.java | 84 ++++--------------- .../main/java/org/fdroid/fdroid/data/Apk.java | 8 +- .../main/java/org/fdroid/fdroid/data/App.java | 6 +- .../org/fdroid/fdroid/data/AppProvider.java | 6 +- .../org/fdroid/fdroid/RepoXMLHandlerTest.java | 4 +- .../fdroid/fdroid/data/ApkProviderTest.java | 8 +- 9 files changed, 51 insertions(+), 96 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index 69b03523e..5a0ad42a1 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails.java @@ -266,7 +266,7 @@ public class AppDetails extends AppCompatActivity { } if (Preferences.get().expertMode() && apk.nativecode != null) { - holder.nativecode.setText(apk.nativecode.toString().replaceAll(",", " ")); + holder.nativecode.setText(TextUtils.join(" ", apk.nativecode)); holder.nativecode.setVisibility(View.VISIBLE); } else { holder.nativecode.setVisibility(View.GONE); @@ -276,7 +276,7 @@ public class AppDetails extends AppCompatActivity { holder.incompatibleReasons.setText( getResources().getString( R.string.requires_features, - apk.incompatibleReasons.toPrettyString())); + TextUtils.join(", ", apk.incompatibleReasons))); holder.incompatibleReasons.setVisibility(View.VISIBLE); } else { holder.incompatibleReasons.setVisibility(View.GONE); @@ -1323,7 +1323,7 @@ public class AppDetails extends AppCompatActivity { // Categories TextView final TextView categories = (TextView) view.findViewById(R.id.categories); if (prefs.expertMode() && app.categories != null) { - categories.setText(app.categories.toString().replaceAll(",", ", ")); + categories.setText(TextUtils.join(", ", app.categories)); } else { categories.setVisibility(View.GONE); } diff --git a/app/src/main/java/org/fdroid/fdroid/AppFilter.java b/app/src/main/java/org/fdroid/fdroid/AppFilter.java index ee3397b02..9b1036ac9 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppFilter.java +++ b/app/src/main/java/org/fdroid/fdroid/AppFilter.java @@ -25,12 +25,15 @@ public class AppFilter { // Return true if the given app should be filtered out based on user // preferences, and false otherwise. public boolean filter(App app) { - if (app.requirements == null) { - return false; + if (app.requirements != null && !Preferences.get().filterAppsRequiringRoot()) { + for (String requirement : app.requirements) { + if (requirement.equals("root")) { + return true; + } + } } - return !Preferences.get().filterAppsRequiringRoot() - && app.requirements.contains("root"); + return false; } } diff --git a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java index 306f38ced..532a317d7 100644 --- a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java +++ b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java @@ -6,6 +6,7 @@ import android.content.pm.FeatureInfo; import android.content.pm.PackageManager; import android.os.Build; import android.preference.PreferenceManager; +import android.support.annotation.Nullable; import org.fdroid.fdroid.compat.SupportedArchitectures; import org.fdroid.fdroid.data.Apk; @@ -69,13 +70,16 @@ public class CompatibilityChecker { cpuAbisDesc = builder.toString(); } - private boolean compatibleApi(Utils.CommaSeparatedList nativecode) { + private boolean compatibleApi(@Nullable String[] nativecode) { if (nativecode == null) { return true; } + for (final String cpuAbi : cpuAbis) { - if (nativecode.contains(cpuAbi)) { - return true; + for (String code : nativecode) { + if (code.equals(cpuAbi)) { + return true; + } } } return false; @@ -108,9 +112,7 @@ public class CompatibilityChecker { } } if (!compatibleApi(apk.nativecode)) { - for (final String code : apk.nativecode) { - incompatibleReasons.add(code); - } + Collections.addAll(incompatibleReasons, apk.nativecode); Utils.debugLog(TAG, apk.packageName + " vercode " + apk.versionCode + " only supports " + Utils.CommaSeparatedList.str(apk.nativecode) + " while your architectures are " + cpuAbisDesc); diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 5e6d2f7ea..5cfd3eceb 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -58,6 +58,7 @@ 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; @@ -402,84 +403,33 @@ public final class Utils { return new Locale(languageTag); } - public static final class CommaSeparatedList implements Iterable { - private final String value; - - private CommaSeparatedList(String list) { - value = list; - } - - public static CommaSeparatedList make(List list) { + public static final class CommaSeparatedList { + @Nullable + public static String[] make(List list) { if (list == null || list.isEmpty()) { return null; } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < list.size(); i++) { - if (i > 0) { - sb.append(','); - } - sb.append(list.get(i)); - } - return new CommaSeparatedList(sb.toString()); - } - - public static CommaSeparatedList make(String[] list) { - if (list == null || list.length == 0) { - return null; - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < list.length; i++) { - if (i > 0) { - sb.append(','); - } - sb.append(list[i]); - } - return new CommaSeparatedList(sb.toString()); + return list.toArray(new String[list.size()]); } @Nullable - public static CommaSeparatedList make(@Nullable String list) { + 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 new CommaSeparatedList(list); + return list.split(","); } - public static String str(CommaSeparatedList instance) { - return instance == null ? null : instance.toString(); - } - - @Override - public String toString() { - return value; - } - - public String toPrettyString() { - return value.replaceAll(",", ", "); - } - - @Override - public Iterator iterator() { - TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(','); - splitter.setString(value); - return splitter.iterator(); - } - - public ArrayList toArrayList() { - ArrayList out = new ArrayList<>(); - for (String element : this) { - out.add(element); - } - return out; - } - - public boolean contains(String v) { - for (final String s : this) { - if (s.equals(v)) { - return true; - } - } - return false; + public static String str(@Nullable String[] values) { + return values == null ? null : TextUtils.join(",", values); } } 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 48a02ea2f..66a280b6e 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -29,11 +29,11 @@ public class Apk extends ValueObject implements Comparable { public int targetSdkVersion = SDK_VERSION_MIN_VALUE; // 0 if unknown public int maxSdkVersion = SDK_VERSION_MAX_VALUE; // "infinity" if not set public Date added; - public Utils.CommaSeparatedList permissions; // null if empty or + public String[] permissions; // null if empty or // unknown - public Utils.CommaSeparatedList features; // null if empty or unknown + public String[] features; // null if empty or unknown - public Utils.CommaSeparatedList nativecode; // null if empty or unknown + public String[] nativecode; // null if empty or unknown /** * ID (md5 sum of public key) of signature. Might be null, in the @@ -58,7 +58,7 @@ public class Apk extends ValueObject implements Comparable { public int repoVersion; public String repoAddress; - public Utils.CommaSeparatedList incompatibleReasons; + public String[] incompatibleReasons; public Apk() { } 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 9bc6f32fb..4075fe2c6 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -88,17 +88,17 @@ public class App extends ValueObject implements Comparable { /** * List of categories (as defined in the metadata documentation) or null if there aren't any. */ - public Utils.CommaSeparatedList categories; + public String[] categories; /** * List of anti-features (as defined in the metadata documentation) or null if there aren't any. */ - public Utils.CommaSeparatedList antiFeatures; + public String[] antiFeatures; /** * List of special requirements (such as root privileges) or null if there aren't any. */ - public Utils.CommaSeparatedList requirements; + public String[] requirements; /** * True if all updates for this app are to be ignored 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 396c6cf63..1e9cc1eeb 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -98,11 +98,9 @@ public class AppProvider extends FDroidProvider { cursor.moveToFirst(); while (!cursor.isAfterLast()) { final String categoriesString = cursor.getString(0); - Utils.CommaSeparatedList categoriesList = Utils.CommaSeparatedList.make(categoriesString); + String[] categoriesList = Utils.CommaSeparatedList.make(categoriesString); if (categoriesList != null) { - for (final String s : categoriesList) { - categorySet.add(s); - } + Collections.addAll(categorySet, categoriesList); } cursor.moveToNext(); } diff --git a/app/src/test/java/org/fdroid/fdroid/RepoXMLHandlerTest.java b/app/src/test/java/org/fdroid/fdroid/RepoXMLHandlerTest.java index 1c7fd96fd..27cc720a6 100644 --- a/app/src/test/java/org/fdroid/fdroid/RepoXMLHandlerTest.java +++ b/app/src/test/java/org/fdroid/fdroid/RepoXMLHandlerTest.java @@ -672,9 +672,7 @@ public class RepoXMLHandlerTest { assertNull(app.antiFeatures); } else { List actualAntiFeatures = new ArrayList<>(); - for (String antiFeature : app.antiFeatures) { - actualAntiFeatures.add(antiFeature); - } + Collections.addAll(actualAntiFeatures, app.antiFeatures); assertTrue(actualAntiFeatures.containsAll(antiFeatures)); assertTrue(antiFeatures.containsAll(actualAntiFeatures)); } 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 03e7ebfa0..b1ba3a95d 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java @@ -289,7 +289,8 @@ public class ApkProviderTest extends FDroidProviderTest { assertEquals(0, apk.repoVersion); // But this should have saved correctly... - assertEquals("Some features", apk.features.toString()); + assertEquals(1, apk.features.length); + assertEquals("Some features", apk.features[0]); assertEquals("com.example.com", apk.packageName); assertEquals(1, apk.versionCode); assertEquals(10, apk.repo); @@ -435,7 +436,10 @@ public class ApkProviderTest extends FDroidProviderTest { assertNotNull(updatedApk.added); assertNotNull(updatedApk.hashType); - assertEquals("one,two,three", updatedApk.features.toString()); + assertEquals(3, updatedApk.features.length); + assertEquals("one", updatedApk.features[0]); + assertEquals("two", updatedApk.features[1]); + assertEquals("three", updatedApk.features[2]); assertEquals(new Date(dateTimestamp).getYear(), updatedApk.added.getYear()); assertEquals(new Date(dateTimestamp).getMonth(), updatedApk.added.getMonth()); assertEquals(new Date(dateTimestamp).getDay(), updatedApk.added.getDay());