From 55c1bd0572ae803eb6b622ae855047fb1ecbbce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 3 Jan 2015 17:53:36 +0100 Subject: [PATCH] Support devices with more than two ABIs on >=21 Also, start using String[] like Android's SUPPORTED_ABIS instead of Set. Said list of ABIs will always be very short, at most containing a handful of elements. --- .../fdroid/fdroid/CompatibilityChecker.java | 8 ++--- F-Droid/src/org/fdroid/fdroid/Utils.java | 9 +++++ .../fdroid/compat/SupportedArchitectures.java | 35 +++++++++++-------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/F-Droid/src/org/fdroid/fdroid/CompatibilityChecker.java b/F-Droid/src/org/fdroid/fdroid/CompatibilityChecker.java index f750f971a..1b8ebcfeb 100644 --- a/F-Droid/src/org/fdroid/fdroid/CompatibilityChecker.java +++ b/F-Droid/src/org/fdroid/fdroid/CompatibilityChecker.java @@ -18,7 +18,7 @@ public class CompatibilityChecker extends Compatibility { private Context context; private Set features; - private Set cpuAbis; + private String[] cpuAbis; private String cpuAbisDesc; private boolean ignoreTouchscreen; @@ -59,8 +59,8 @@ public class CompatibilityChecker extends Compatibility { private boolean compatibleApi(Utils.CommaSeparatedList nativecode) { if (nativecode == null) return true; - for (String abi : nativecode) { - if (cpuAbis.contains(abi)) { + for (final String abi : nativecode) { + if (Utils.arrayContains(cpuAbis, abi)) { return true; } } @@ -79,7 +79,7 @@ public class CompatibilityChecker extends Compatibility { } if (apk.features != null) { - for (String feat : apk.features) { + for (final String feat : apk.features) { if (ignoreTouchscreen && feat.equals("android.hardware.touchscreen")) { // Don't check it! diff --git a/F-Droid/src/org/fdroid/fdroid/Utils.java b/F-Droid/src/org/fdroid/fdroid/Utils.java index f5ef0c357..7358104bd 100644 --- a/F-Droid/src/org/fdroid/fdroid/Utils.java +++ b/F-Droid/src/org/fdroid/fdroid/Utils.java @@ -507,4 +507,13 @@ public final class Utils { } } + public static boolean arrayContains(final T[] array, final T v) { + for (final T e : array) { + if (e == v || v != null && v.equals(e)) { + return true; + } + } + return false; + } + } diff --git a/F-Droid/src/org/fdroid/fdroid/compat/SupportedArchitectures.java b/F-Droid/src/org/fdroid/fdroid/compat/SupportedArchitectures.java index cc88a534b..e1620b6a2 100644 --- a/F-Droid/src/org/fdroid/fdroid/compat/SupportedArchitectures.java +++ b/F-Droid/src/org/fdroid/fdroid/compat/SupportedArchitectures.java @@ -1,30 +1,35 @@ package org.fdroid.fdroid.compat; -import java.util.Set; -import java.util.HashSet; - import android.annotation.TargetApi; import android.os.Build; public class SupportedArchitectures extends Compatibility { - private static Set getOneAbi() { - Set abis = new HashSet(1); - abis.add(Build.CPU_ABI); - return abis; + private static String[] getAbisDonut() { + return new String[]{Build.CPU_ABI}; } @TargetApi(8) - private static Set getTwoAbis() { - Set abis = new HashSet(2); - abis.add(Build.CPU_ABI); - abis.add(Build.CPU_ABI2); - return abis; + private static String[] getAbisFroyo() { + return new String[]{Build.CPU_ABI, Build.CPU_ABI2}; } - public static Set getAbis() { - if (hasApi(8)) return getTwoAbis(); - return getOneAbi(); + @TargetApi(21) + private static String[] getAbisLollipop() { + return Build.SUPPORTED_ABIS; + } + + /** + * The most preferred ABI is the first element in the list. + */ + public static String[] getAbis() { + if (hasApi(21)) { + return getAbisLollipop(); + } + if (hasApi(8)) { + return getAbisFroyo(); + } + return getAbisDonut(); } }