Make CameraX blocklist remote configurable.

fork-5.53.8
Greyson Parrelli 2022-08-05 09:38:04 -04:00 zatwierdzone przez Cody Henthorne
rodzic ace4157a14
commit 91d3f331e5
7 zmienionych plików z 59 dodań i 148 usunięć

Wyświetl plik

@ -1,120 +0,0 @@
package org.thoughtcrime.securesms.mediasend.camerax;
import android.os.Build;
import java.util.HashSet;
import java.util.Set;
public final class CameraXModelBlacklist {
private static final Set<String> BLACKLIST = new HashSet<String>() {{
// Pixel 4
// add("Pixel 4");
// add("Pixel 4 XL");
// Huawei Mate 10
add("ALP-L29");
add("ALP-L09");
add("ALP-AL00");
// Huawei Mate 10 Pro
add("BLA-L29");
add("BLA-L09");
add("BLA-AL00");
add("BLA-A09");
// Huawei Mate 20
add("HMA-L29");
add("HMA-L09");
add("HMA-LX9");
add("HMA-AL00");
// Huawei Mate 20 Pro
add("LYA-L09");
add("LYA-L29");
add("LYA-AL00");
add("LYA-AL10");
add("LYA-TL00");
add("LYA-L0C");
// Huawei Mate 20 X
add("EVR-L29");
add("EVR-AL00");
add("EVR-TL00");
// Huawei P20
add("EML-L29C");
add("EML-L09C");
add("EML-AL00");
add("EML-TL00");
add("EML-L29");
add("EML-L09");
// Huawei P20 Pro
add("CLT-L29C");
add("CLT-L29");
add("CLT-L09C");
add("CLT-L09");
add("CLT-AL00");
add("CLT-AL01");
add("CLT-TL01");
add("CLT-AL00L");
add("CLT-L04");
add("HW-01K");
// Huawei P30
add("ELE-L29");
add("ELE-L09");
add("ELE-AL00");
add("ELE-TL00");
add("ELE-L04");
// Huawei P30 Pro
add("VOG-L29");
add("VOG-L09");
add("VOG-AL00");
add("VOG-TL00");
add("VOG-L04");
add("VOG-AL10");
// Huawei Honor 10
add("COL-AL10");
add("COL-L29");
add("COL-L19");
// Huawei Honor 20
add("YAL-L21");
add("YAL-AL00");
add("YAL-TL00");
// Samsung Galaxy S6
add("SM-G920F");
// Honor View 10
add("BKL-AL20");
add("BKL-L04");
add("BKL-L09");
add("BKL-AL00");
// Honor View 20
add("PCT-AL10");
add("PCT-TL10");
add("PCT-L29");
// Honor Play
add("COR-L29");
add("COR-L09");
add("COR-AL00");
add("COR-AL10");
add("COR-TL10");
// Motorola G20
add("moto g(20)");
}};
private CameraXModelBlacklist() {
}
public static boolean isBlacklisted() {
return BLACKLIST.contains(Build.MODEL);
}
}

Wyświetl plik

@ -0,0 +1,17 @@
package org.thoughtcrime.securesms.mediasend.camerax
import android.os.Build
import org.signal.core.util.asListContains
import org.thoughtcrime.securesms.util.FeatureFlags
/**
* Some phones don't work well with CameraX. This class uses a remote config to decide
* which phones should fall back to the legacy camera.
*/
object CameraXModelBlocklist {
@JvmStatic
fun isBlocklisted(): Boolean {
return FeatureFlags.cameraXModelBlocklist().asListContains(Build.MODEL)
}
}

Wyświetl plik

@ -106,7 +106,7 @@ public class CameraXUtil {
}
public static boolean isSupported() {
return Build.VERSION.SDK_INT >= 21 && !CameraXModelBlacklist.isBlacklisted();
return Build.VERSION.SDK_INT >= 21 && !CameraXModelBlocklist.isBlocklisted();
}
@RequiresApi(21)

Wyświetl plik

@ -1,7 +1,7 @@
package org.thoughtcrime.securesms.service.webrtc
import android.os.Build
import androidx.annotation.VisibleForTesting
import org.signal.core.util.asListContains
import org.signal.ringrtc.CallManager.AudioProcessingMethod
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.FeatureFlags
@ -31,32 +31,15 @@ object RingRtcDynamicConfiguration {
}
fun isTelecomAllowedForDevice(): Boolean {
return modelInList(Build.MANUFACTURER.lowercase(), FeatureFlags.telecomManufacturerAllowList().lowercase()) &&
!modelInList(Build.MODEL.lowercase(), FeatureFlags.telecomModelBlockList().lowercase())
return FeatureFlags.telecomManufacturerAllowList().lowercase().asListContains(Build.MANUFACTURER.lowercase()) &&
!FeatureFlags.telecomModelBlockList().lowercase().asListContains(Build.MODEL.lowercase())
}
private fun isHardwareBlocklisted(): Boolean {
return modelInList(Build.MODEL, FeatureFlags.hardwareAecBlocklistModels())
return FeatureFlags.hardwareAecBlocklistModels().asListContains(Build.MODEL)
}
private fun isSoftwareBlocklisted(): Boolean {
return modelInList(Build.MODEL, FeatureFlags.softwareAecBlocklistModels())
}
@VisibleForTesting
fun modelInList(model: String, serializedList: String): Boolean {
val items: List<String> = serializedList
.split(",")
.map { it.trim() }
.filter { it.isNotEmpty() }
.toList()
val exactMatches = items.filter { it.last() != '*' }
val prefixMatches = items.filter { it.last() == '*' }
return exactMatches.contains(model) ||
prefixMatches
.map { it.substring(0, it.length - 1) }
.any { model.startsWith(it) }
return FeatureFlags.softwareAecBlocklistModels().asListContains(Build.MODEL)
}
}

Wyświetl plik

@ -99,6 +99,7 @@ public final class FeatureFlags {
private static final String GIFT_BADGE_SEND_SUPPORT = "android.giftBadges.sending.2";
private static final String TELECOM_MANUFACTURER_ALLOWLIST = "android.calling.telecomAllowList";
private static final String TELECOM_MODEL_BLOCKLIST = "android.calling.telecomModelBlockList";
private static final String CAMERAX_MODEL_BLOCKLIST = "android.cameraXModelBlockList";
/**
* We will only store remote values for flags in this set. If you want a flag to be controllable
@ -150,7 +151,8 @@ public final class FeatureFlags {
GIFT_BADGE_RECEIVE_SUPPORT,
GIFT_BADGE_SEND_SUPPORT,
TELECOM_MANUFACTURER_ALLOWLIST,
TELECOM_MODEL_BLOCKLIST
TELECOM_MODEL_BLOCKLIST,
CAMERAX_MODEL_BLOCKLIST
);
@VisibleForTesting
@ -211,7 +213,8 @@ public final class FeatureFlags {
PAYMENTS_COUNTRY_BLOCKLIST,
USE_FCM_FOREGROUND_SERVICE,
TELECOM_MANUFACTURER_ALLOWLIST,
TELECOM_MODEL_BLOCKLIST
TELECOM_MODEL_BLOCKLIST,
CAMERAX_MODEL_BLOCKLIST
);
/**
@ -492,6 +495,11 @@ public final class FeatureFlags {
return getString(TELECOM_MODEL_BLOCKLIST, "");
}
/** A comma-separated list of manufacturers that should *not* use CameraX. */
public static @NonNull String cameraXModelBlocklist() {
return getString(CAMERAX_MODEL_BLOCKLIST, "");
}
/** Whether or not hardware AEC should be used for calling on devices older than API 29. */
public static boolean useHardwareAecIfOlderThanApi29() {
return getBoolean(USE_HARDWARE_AEC_IF_OLD, false);

Wyświetl plik

@ -0,0 +1,23 @@
package org.signal.core.util
/**
* Treats the string as a serialized list of tokens and tells you if an item is present in the list.
* In addition to exact matches, this handles wildcards at the end of an item.
*
* e.g. a,b,c*,d
*/
fun String.asListContains(item: String): Boolean {
val items: List<String> = this
.split(",")
.map { it.trim() }
.filter { it.isNotEmpty() }
.toList()
val exactMatches = items.filter { it.last() != '*' }
val prefixMatches = items.filter { it.last() == '*' }
return exactMatches.contains(item) ||
prefixMatches
.map { it.substring(0, it.length - 1) }
.any { item.startsWith(it) }
}

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.service.webrtc
package org.signal.core.util
import org.junit.Assert.assertEquals
import org.junit.Test
@ -6,7 +6,7 @@ import org.junit.runner.RunWith
import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
class RingRtcDynamicConfigurationTest_inList(
class StringExtensions_asListContains(
private val model: String,
private val serializedList: String,
private val expected: Boolean
@ -14,7 +14,7 @@ class RingRtcDynamicConfigurationTest_inList(
@Test
fun testModelInList() {
val actual = RingRtcDynamicConfiguration.modelInList(model, serializedList)
val actual = serializedList.asListContains(model)
assertEquals(expected, actual)
}