Merge "Fix npe in FrameHandler" into tm-dev
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 7727fae..420180b 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -261,6 +261,10 @@
     public static final BooleanFlag ENABLE_ONE_SEARCH_MOTION = new DeviceFlag(
             "ENABLE_ONE_SEARCH_MOTION", true, "Enables animations in OneSearch.");
 
+    public static final BooleanFlag USE_LOCAL_ICON_OVERRIDES = getDebugFlag(
+            "USE_LOCAL_ICON_OVERRIDES", true,
+            "Use inbuilt monochrome icons if app doesn't provide one");
+
     public static void initialize(Context context) {
         synchronized (sDebugFlags) {
             for (DebugFlag flag : sDebugFlags) {
diff --git a/src/com/android/launcher3/icons/LauncherIconProvider.java b/src/com/android/launcher3/icons/LauncherIconProvider.java
index a7379bb..c4d5f2b 100644
--- a/src/com/android/launcher3/icons/LauncherIconProvider.java
+++ b/src/com/android/launcher3/icons/LauncherIconProvider.java
@@ -23,6 +23,7 @@
 import android.util.Log;
 
 import com.android.launcher3.R;
+import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.util.Themes;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -55,7 +56,8 @@
      */
     public void setIconThemeSupported(boolean isSupported) {
         mSupportsIconTheme = isSupported;
-        mThemedIconMap = isSupported ? null : DISABLED_MAP;
+        mThemedIconMap = isSupported && FeatureFlags.USE_LOCAL_ICON_OVERRIDES.get()
+                ? null : DISABLED_MAP;
     }
 
     @Override
diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index e598df9..f91f1c4 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -88,11 +88,11 @@
     protected fun newScalableInvariantDeviceProfile(): InvariantDeviceProfile =
         InvariantDeviceProfile().apply {
             isScalable = true
-            numColumns = 5
-            numRows = 5
-            numShownHotseatIcons = 5
+            numColumns = 4
+            numRows = 4
+            numShownHotseatIcons = 4
             numDatabaseHotseatIcons = 6
-            numShrunkenHotseatIcons = 4
+            numShrunkenHotseatIcons = 5
             horizontalMargin = FloatArray(4) { 22f }
             borderSpaces = listOf(
                 PointF(16f, 16f),
diff --git a/tests/src/com/android/launcher3/HotseatSizeTest.kt b/tests/src/com/android/launcher3/HotseatSizeTest.kt
index ca697d7..a44939f 100644
--- a/tests/src/com/android/launcher3/HotseatSizeTest.kt
+++ b/tests/src/com/android/launcher3/HotseatSizeTest.kt
@@ -43,11 +43,11 @@
         val dp = newDP()
 
         assertThat(dp.isQsbInline).isFalse()
-        assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
     }
 
     @Test
-    fun hotseat_size_is_max_for_foldables() {
+    fun hotseat_size_is_max_when_large_screen() {
         initializeVarsForTablet(isLandscape = true)
         inv = newScalableInvariantDeviceProfile().apply {
             deviceType = TYPE_MULTI_DISPLAY
@@ -61,7 +61,7 @@
     }
 
     @Test
-    fun hotseat_size_is_shrunk_if_needed() {
+    fun hotseat_size_is_shrunk_if_needed_when_large_screen() {
         initializeVarsForTablet(isLandscape = true)
         inv = newScalableInvariantDeviceProfile().apply {
             deviceType = TYPE_MULTI_DISPLAY
@@ -79,7 +79,7 @@
 
         if (dp.hotseatQsbHeight > 0) {
             assertThat(dp.isQsbInline).isTrue()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
         } else { // Launcher3 doesn't have QSB height
             assertThat(dp.isQsbInline).isFalse()
             assertThat(dp.numShownHotseatIcons).isEqualTo(6)
@@ -91,7 +91,7 @@
      * inline qsb
      */
     @Test
-    fun hotseat_size_is_shrunk_even_in_portrait() {
+    fun hotseat_size_is_shrunk_even_in_portrait_when_large_screen() {
         initializeVarsForTablet()
         inv = newScalableInvariantDeviceProfile().apply {
             deviceType = TYPE_MULTI_DISPLAY
@@ -109,7 +109,7 @@
 
         if (dp.hotseatQsbHeight > 0) {
             assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
         } else { // Launcher3 doesn't have QSB height
             assertThat(dp.isQsbInline).isFalse()
             assertThat(dp.numShownHotseatIcons).isEqualTo(6)
@@ -117,7 +117,7 @@
     }
 
     @Test
-    fun hotseat_size_is_default_when_folded() {
+    fun hotseat_size_is_default_when_small_screen() {
         initializeVarsForPhone()
         inv = newScalableInvariantDeviceProfile().apply {
             deviceType = TYPE_MULTI_DISPLAY
@@ -126,7 +126,33 @@
 
         val dp = newDP()
 
-        assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+    }
+
+    @Test
+    fun hotseat_size_is_not_shrunk_on_gesture_tablet() {
+        initializeVarsForTablet(isLandscape = true)
+        inv = newScalableInvariantDeviceProfile().apply {
+            deviceType = TYPE_TABLET
+            inlineQsb = booleanArrayOf(
+                    false,
+                    true, // landscape
+                    false,
+                    false
+            )
+            numShownHotseatIcons = 6
+        }
+
+        isGestureMode = true
+        val dp = newDP()
+
+        if (dp.hotseatQsbHeight > 0) {
+            assertThat(dp.isQsbInline).isTrue()
+            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        } else { // Launcher3 doesn't have QSB height
+            assertThat(dp.isQsbInline).isFalse()
+            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        }
     }
 
     @Test
@@ -140,6 +166,7 @@
                 false,
                 false
             )
+            numShownHotseatIcons = 6
         }
 
         isGestureMode = false
@@ -147,10 +174,10 @@
 
         if (dp.hotseatQsbHeight > 0) {
             assertThat(dp.isQsbInline).isTrue()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
         } else { // Launcher3 doesn't have QSB height
             assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
         }
     }
 
@@ -169,6 +196,7 @@
                 false,
                 false
             )
+            numShownHotseatIcons = 6
         }
 
         isGestureMode = false
@@ -176,10 +204,10 @@
 
         if (dp.hotseatQsbHeight > 0) {
             assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
         } else { // Launcher3 doesn't have QSB height
             assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
         }
     }