Extend ExtensionsDisabledQuirk to all Motoroal Devices with Extensions v1.1.0 and older

- ensure camera extensions minimum quality requirements are maintained
- extended to all Motorola devices to ensure:
-- SurfaceView support of extensions
-- Image is returned when capturing a photo
-- Bokeh works on all devices that support Bokeh extension mode
-- The preview resumes displaying camera frames upon returning to the Activity
- disabling Camera Extensions on Motorola devices is restricted to v1.1.0 and older
- this patch also adds some additional utilities to the ExtensionVersion class to check if minimum or maximum version

Bug: b/255956506

Test: Added new tests for ensuring maximum and minimum version utility works, extended ExtensionDisabledValidatorTest to ensure Motorola devices are disabled for v1.1.0 and older, run ExtensionDisabledValidatorTest, ./gradlew camera:camera-extensions:build

Relnote: Improve camera extensions quality and reliability. Camera extensions are disabled on Motorola devices using Camera Extensions v1.1.0 and older due to issues with Bokeh support, image capture, and preview not resuming.

Change-Id: Id3ce3d3652d09ea81cc678d0eb143d43d416bd45
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
index 808e43d..88efac3 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
@@ -182,7 +182,7 @@
     @Test
     fun correctAvailability_whenExtensionIsNotAvailable() {
         // Skips the test if extensions availability is disabled by quirk.
-        assumeFalse(ExtensionsTestUtil.extensionsDisabledByQuirk(lensFacing, extensionMode))
+        assumeFalse(ExtensionsTestUtil.extensionsDisabledByQuirk())
 
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index 57d7a47..9deb408 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -207,10 +207,7 @@
     /**
      * Returns whether extensions is disabled by quirk.
      */
-    public static boolean extensionsDisabledByQuirk(@CameraSelector.LensFacing int lensFacing,
-            @ExtensionMode.Mode int extensionMode) {
-
-        return new ExtensionDisabledValidator().shouldDisableExtension(
-                CameraUtil.getCameraIdWithLensFacing(lensFacing), extensionMode);
+    public static boolean extensionsDisabledByQuirk() {
+        return new ExtensionDisabledValidator().shouldDisableExtension();
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
index 7715f57..17a7a78 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
@@ -56,10 +56,8 @@
             new ExtensionDisabledValidator();
     private final AdvancedExtenderImpl mAdvancedExtenderImpl;
     private String mCameraId;
-    private final @ExtensionMode.Mode int mMode;
 
     public AdvancedVendorExtender(@ExtensionMode.Mode int mode) {
-        mMode = mode;
         try {
             switch (mode) {
                 case ExtensionMode.BOKEH:
@@ -101,7 +99,7 @@
     public boolean isExtensionAvailable(@NonNull String cameraId,
             @NonNull Map<String, CameraCharacteristics> characteristicsMap) {
 
-        if (mExtensionDisabledValidator.shouldDisableExtension(cameraId, mMode)) {
+        if (mExtensionDisabledValidator.shouldDisableExtension()) {
             return false;
         }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
index 2a9f2d0..37b5610 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
@@ -123,7 +123,7 @@
     public boolean isExtensionAvailable(@NonNull String cameraId,
             @NonNull Map<String, CameraCharacteristics> characteristicsMap) {
 
-        if (mExtensionDisabledValidator.shouldDisableExtension(cameraId, mMode)) {
+        if (mExtensionDisabledValidator.shouldDisableExtension()) {
             return false;
         }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
index 6b58434..ec3f327 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions.internal;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
@@ -75,6 +76,38 @@
         return getInstance().isAdvancedExtenderSupportedInternal();
     }
 
+    /**
+     * Check if the Runtime Version meets the minimum compatible version requirement. This implies
+     * that the runtime version is equal to or newer than the version.
+     *
+     * <p> The compatible version is comprised of the major and minor version numbers. The patch
+     * number is ignored.
+     *
+     * @param version The minimum compatible version required
+     * @return True if the Runtime version meets the minimum version requirement and False
+     * otherwise.
+     */
+    public static boolean isMinimumCompatibleVersion(@NonNull Version version) {
+        return ExtensionVersion.getRuntimeVersion()
+                .compareTo(version.getMajor(), version.getMinor()) >= 0;
+    }
+
+    /**
+     * Check if the Runtime Version meets the maximum compatible version requirement. This implies
+     * that the runtime version is equal to or older than the version.
+     *
+     * <p> The compatible version is comprised of the major and minor version numbers. The patch
+     * number is ignored.
+     *
+     * @param version The maximum compatible version required
+     * @return True if the Runtime version meets the maximum version requirement and False
+     * otherwise.
+     */
+    public static boolean isMaximumCompatibleVersion(@NonNull Version version) {
+        return ExtensionVersion.getRuntimeVersion()
+                .compareTo(version.getMajor(), version.getMinor()) <= 0;
+    }
+
     abstract boolean isAdvancedExtenderSupportedInternal();
 
     /**
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java
index c9dd6cd..992962c 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java
@@ -18,46 +18,43 @@
 
 import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
-import androidx.camera.extensions.ExtensionMode;
 import androidx.camera.extensions.internal.ExtensionVersion;
 import androidx.camera.extensions.internal.Version;
 
 
 /**
  * <p>QuirkSummary
- *     Bug Id: b/199408131, b/214130117
- *     Description: Quirk required to disable extension for some devices. An example is that
- *                  Pixel 5's availability check result of the basic extension interface should
- *                  be false, but it actually returns true. Therefore, force disable Basic
- *                  Extender capability on the device. Another example is that Motorola razr 5G's
- *                  availability check results of both back and front camera are true, but it
- *                  will cause the black preview screen issue. Therefore, force disable the bokeh
- *                  mode on the device.
- *     Device(s): Pixel 5, Motorola razr 5G
- *     @see androidx.camera.extensions.internal.compat.workaround.ExtensionDisabledValidator
+ * Bug Id: b/199408131, b/214130117, b/255956506
+ * Description: Quirk required to disable extension for some devices. An example is that
+ * Pixel 5's availability check result of the basic extension interface should
+ * be false, but it actually returns true. Therefore, force disable Basic
+ * Extender capability on the device. Another example is to ensure Motorola devices meet the
+ * minimum quality requirements for camera extensions support. Common issues encountered with
+ * Motorola extensions include: Bokeh not supported on some devices, SurfaceView not supported,
+ * Image doesn't appear after taking a picture, Preview is pauses after resuming.
+ * Device(s): Pixel 5, Motorola
+ *
+ * @see androidx.camera.extensions.internal.compat.workaround.ExtensionDisabledValidator
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ExtensionDisabledQuirk implements Quirk {
-    private boolean mIsAdvancedInterface = isAdvancedExtenderSupported();
+    private final boolean mIsAdvancedInterface = isAdvancedExtenderSupported();
 
     static boolean load() {
-        return isPixel5() || isMotoRazr5G() || isAdvancedExtenderSupported();
+        return isPixel5() || isMoto() || isAdvancedExtenderSupported();
     }
 
     /**
      * Checks whether extension should be disabled.
      */
-    public boolean shouldDisableExtension(@NonNull String cameraId,
-            @ExtensionMode.Mode int extensionMode) {
+    public boolean shouldDisableExtension() {
         if (isPixel5() && !mIsAdvancedInterface) {
             // 1. Disables Pixel 5's Basic Extender capability.
             return true;
-        } else if (isMotoRazr5G() && ("0".equals(cameraId) || "1".equals(cameraId)) && (
-                ExtensionMode.BOKEH == extensionMode)) {
-            // 2. Disables Motorola Razr 5G's bokeh capability.
+        } else if (isMoto() && ExtensionVersion.isMaximumCompatibleVersion(Version.VERSION_1_1)) {
+            // 2. Disables Motorola extensions capability for version 1.1 and older.
             return true;
         }
 
@@ -68,14 +65,12 @@
         return "google".equalsIgnoreCase(Build.BRAND) && "redfin".equalsIgnoreCase(Build.DEVICE);
     }
 
-    private static boolean isMotoRazr5G() {
-        return "motorola".equalsIgnoreCase(Build.BRAND) && "smith".equalsIgnoreCase(Build.DEVICE);
+    private static boolean isMoto() {
+        return "motorola".equalsIgnoreCase(Build.BRAND);
     }
 
     private static boolean isAdvancedExtenderSupported() {
-        if (ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_2) < 0) {
-            return false;
-        }
-        return ExtensionVersion.isAdvancedExtenderSupported();
+        return ExtensionVersion.isMinimumCompatibleVersion(Version.VERSION_1_2)
+                && ExtensionVersion.isAdvancedExtenderSupported();
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java
index 3b9bcd1..166eabf 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java
@@ -16,9 +16,7 @@
 
 package androidx.camera.extensions.internal.compat.workaround;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.camera.extensions.ExtensionMode;
 import androidx.camera.extensions.internal.compat.quirk.DeviceQuirks;
 import androidx.camera.extensions.internal.compat.quirk.ExtensionDisabledQuirk;
 
@@ -40,8 +38,7 @@
     /**
      * Checks whether extension should be disabled.
      */
-    public boolean shouldDisableExtension(@NonNull String cameraId,
-            @ExtensionMode.Mode int extensionMode) {
-        return mQuirk != null && mQuirk.shouldDisableExtension(cameraId, extensionMode);
+    public boolean shouldDisableExtension() {
+        return mQuirk != null && mQuirk.shouldDisableExtension();
     }
 }
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMaximumCompatibleTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMaximumCompatibleTest.kt
new file mode 100644
index 0000000..b21dea5
--- /dev/null
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMaximumCompatibleTest.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal
+
+import android.os.Build
+import androidx.camera.extensions.internal.util.ExtensionsTestUtil.resetSingleton
+import androidx.camera.extensions.internal.util.ExtensionsTestUtil.setTestApiVersion
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.ParameterizedRobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(ParameterizedRobolectricTestRunner::class)
+@DoNotInstrument
+@Config(
+    minSdk = Build.VERSION_CODES.LOLLIPOP,
+    instrumentedPackages = arrayOf("androidx.camera.extensions.internal")
+)
+class ExtensionVersionMaximumCompatibleTest(private val config: TestConfig) {
+
+    @Before
+    @Throws(NoSuchFieldException::class, IllegalAccessException::class)
+    fun setUp() {
+        val field = VersionName::class.java.getDeclaredField("CURRENT")
+        field.isAccessible = true
+        field[null] = VersionName(config.targetVersion)
+    }
+
+    @After
+    fun tearDown() {
+        resetSingleton(ExtensionVersion::class.java, "sExtensionVersion")
+    }
+
+    @Test
+    fun isMaximumCompatibleVersion() {
+        setTestApiVersion(config.targetVersion)
+
+        val version = Version.parse(config.maximumCompatibleVersion)!!
+        assertThat(ExtensionVersion.isMaximumCompatibleVersion(version))
+            .isEqualTo(config.expectedResult)
+    }
+
+    data class TestConfig(
+        val targetVersion: String,
+        val maximumCompatibleVersion: String,
+        val expectedResult: Boolean
+    )
+
+    companion object {
+        @JvmStatic
+        @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
+        fun createTestSet(): List<TestConfig> {
+            return listOf(
+                TestConfig("1.1.0", "1.1.0", true),
+                TestConfig("1.1.0", "1.2.0", true),
+                TestConfig("1.1.0", "1.0.0", false),
+                TestConfig("1.1.0", "0.9.0", false),
+
+                // Test to ensure the patch version is ignored
+                TestConfig("1.2.1", "1.2.0", true),
+                TestConfig("1.2.0", "1.2.1", true),
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMinimumCompatibleTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMinimumCompatibleTest.kt
new file mode 100644
index 0000000..d92c03db1
--- /dev/null
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionMinimumCompatibleTest.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal
+
+import android.os.Build
+import androidx.camera.extensions.internal.util.ExtensionsTestUtil.resetSingleton
+import androidx.camera.extensions.internal.util.ExtensionsTestUtil.setTestApiVersion
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.ParameterizedRobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(ParameterizedRobolectricTestRunner::class)
+@DoNotInstrument
+@Config(
+    minSdk = Build.VERSION_CODES.LOLLIPOP,
+    instrumentedPackages = arrayOf("androidx.camera.extensions.internal")
+)
+class ExtensionVersionMinimumCompatibleTest(private val config: TestConfig) {
+
+    @Before
+    @Throws(NoSuchFieldException::class, IllegalAccessException::class)
+    fun setUp() {
+        val field = VersionName::class.java.getDeclaredField("CURRENT")
+        field.isAccessible = true
+        field[null] = VersionName(config.targetVersion)
+    }
+
+    @After
+    fun tearDown() {
+        resetSingleton(ExtensionVersion::class.java, "sExtensionVersion")
+    }
+
+    @Test
+    fun isMinimumCompatibleVersion() {
+        setTestApiVersion(config.targetVersion)
+        val version = Version.parse(config.minimumCompatibleVersion)!!
+        assertThat(ExtensionVersion.isMinimumCompatibleVersion(version))
+            .isEqualTo(config.expectedResult)
+    }
+
+    data class TestConfig(
+        val targetVersion: String,
+        val minimumCompatibleVersion: String,
+        val expectedResult: Boolean
+    )
+
+    companion object {
+        @JvmStatic
+        @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
+        fun createTestSet(): List<TestConfig> {
+            return listOf(
+                TestConfig("1.1.0", "1.1.0", true),
+                TestConfig("1.1.0", "1.0.0", true),
+                TestConfig("1.1.0", "1.2.0", false),
+
+                // Test to ensure the patch version is ignored
+                TestConfig("1.1.1", "1.1.0", true),
+                TestConfig("1.1.0", "1.1.1", true),
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt
index a70923e..d34b6c6 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt
@@ -17,7 +17,6 @@
 package androidx.camera.extensions.internal.compat.workaround
 
 import android.os.Build
-import androidx.camera.extensions.ExtensionMode
 import androidx.camera.extensions.internal.ExtensionVersion
 import androidx.camera.extensions.internal.util.ExtensionsTestUtil.resetSingleton
 import androidx.camera.extensions.internal.util.ExtensionsTestUtil.setTestApiVersionAndAdvancedExtender
@@ -41,7 +40,7 @@
 
     @Before
     fun setUp() {
-        setTestApiVersionAndAdvancedExtender("1.2.0", config.isAdvancedInterface)
+        setTestApiVersionAndAdvancedExtender(config.version, config.isAdvancedInterface)
     }
 
     @After
@@ -56,19 +55,13 @@
         ReflectionHelpers.setStaticField(Build::class.java, "DEVICE", config.device)
 
         val validator = ExtensionDisabledValidator()
-        assertThat(
-            validator.shouldDisableExtension(
-                config.cameraId,
-                config.extensionMode
-            )
-        ).isEqualTo(config.shouldDisableExtension)
+        assertThat(validator.shouldDisableExtension()).isEqualTo(config.shouldDisableExtension)
     }
 
     class TestConfig(
         val brand: String,
         val device: String,
-        val cameraId: String,
-        val extensionMode: Int,
+        val version: String,
         val isAdvancedInterface: Boolean,
         val shouldDisableExtension: Boolean
     )
@@ -79,36 +72,24 @@
         fun createTestSet(): List<TestConfig> {
             return listOf(
                 // Pixel 5 extension capability is disabled on basic extender
-                TestConfig("Google", "Redfin", "0", ExtensionMode.BOKEH, false, true),
-                TestConfig("Google", "Redfin", "0", ExtensionMode.HDR, false, true),
-                TestConfig("Google", "Redfin", "0", ExtensionMode.NIGHT, false, true),
-                TestConfig("Google", "Redfin", "0", ExtensionMode.FACE_RETOUCH, false, true),
-                TestConfig("Google", "Redfin", "0", ExtensionMode.AUTO, false, true),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.BOKEH, false, true),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.HDR, false, true),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.NIGHT, false, true),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.FACE_RETOUCH, false, true),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.AUTO, false, true),
+                TestConfig("Google", "Redfin", "1.2.0", false, true),
 
                 // Pixel 5 extension capability is enabled on advanced extender
-                TestConfig("Google", "Redfin", "0", ExtensionMode.NIGHT, true, false),
-                TestConfig("Google", "Redfin", "1", ExtensionMode.NIGHT, true, false),
+                TestConfig("Google", "Redfin", "1.2.0", true, false),
 
-                // Motorola Razr 5G bokeh mode is disabled. Other extension modes should still work.
-                TestConfig("Motorola", "Smith", "0", ExtensionMode.BOKEH, false, true),
-                TestConfig("Motorola", "Smith", "0", ExtensionMode.HDR, false, false),
-                TestConfig("Motorola", "Smith", "1", ExtensionMode.BOKEH, false, true),
-                TestConfig("Motorola", "Smith", "1", ExtensionMode.HDR, false, false),
-                TestConfig("Motorola", "Smith", "2", ExtensionMode.BOKEH, false, false),
-                TestConfig("Motorola", "Smith", "2", ExtensionMode.HDR, false, false),
+                // All Motorola devices should be disabled for version 1.1.0 and older.
+                TestConfig("Motorola", "Smith", "1.1.0", false, true),
+                TestConfig("Motorola", "Hawaii P", "1.1.0", false, true),
+
+                // Make sure Motorola device would still be enabled for newer versions
+                // Motorola doesn't support this today but making sure there is a path to enable
+                TestConfig("Motorola", "Hawaii P", "1.2.0", false, false),
 
                 // Other cases should be kept normal.
-                TestConfig("", "", "0", ExtensionMode.BOKEH, false, false),
-                TestConfig("", "", "1", ExtensionMode.BOKEH, false, false),
+                TestConfig("", "", "1.2.0", false, false),
 
                 // Advanced extender is enabled for all devices
-                TestConfig("", "", "0", ExtensionMode.BOKEH, true, false),
-                TestConfig("", "", "1", ExtensionMode.BOKEH, true, false),
+                TestConfig("", "", "1.2.0", true, false),
             )
         }
     }