Merge "Space out 3 button nav on taskbar" into tm-qpr-dev
diff --git a/quickstep/res/layout/taskbar.xml b/quickstep/res/layout/taskbar.xml
index 3b1d217..94388b4 100644
--- a/quickstep/res/layout/taskbar.xml
+++ b/quickstep/res/layout/taskbar.xml
@@ -45,8 +45,8 @@
             android:id="@+id/start_contextual_buttons"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
+            android:paddingStart="@dimen/taskbar_contextual_button_padding"
+            android:paddingEnd="@dimen/taskbar_contextual_button_padding"
             android:paddingTop="@dimen/taskbar_contextual_padding_top"
             android:gravity="center_vertical"
             android:layout_gravity="start"/>
@@ -56,9 +56,6 @@
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:orientation="horizontal"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
-            android:layout_marginEnd="@dimen/taskbar_contextual_button_margin"
             android:gravity="center_vertical"
             android:layout_gravity="end"/>
 
@@ -66,8 +63,6 @@
             android:id="@+id/end_contextual_buttons"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
             android:paddingTop="@dimen/taskbar_contextual_padding_top"
             android:gravity="center_vertical"
             android:layout_gravity="end"/>
diff --git a/quickstep/res/values-land/dimens.xml b/quickstep/res/values-land/dimens.xml
index 732f511..8368069 100644
--- a/quickstep/res/values-land/dimens.xml
+++ b/quickstep/res/values-land/dimens.xml
@@ -74,4 +74,10 @@
 
     <!-- Gesture Tutorial mock taskbar -->
     <dimen name="gesture_tutorial_taskbar_padding_start_end">218dp</dimen>
+
+    <!--  Taskbar 3 button spacing  -->
+    <dimen name="taskbar_button_margin_5_5">94.5dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">94.5dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">84dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">79dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index fa4eaed..0232f86 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -250,11 +250,11 @@
     <dimen name="taskbar_icon_touch_size">48dp</dimen>
     <dimen name="taskbar_icon_drag_icon_size">54dp</dimen>
     <dimen name="taskbar_folder_margin">16dp</dimen>
-    <dimen name="taskbar_nav_buttons_spacing">16dp</dimen>
+    <dimen name="taskbar_contextual_button_padding">16dp</dimen>
     <dimen name="taskbar_contextual_padding_top">8dp</dimen>
     <dimen name="taskbar_nav_buttons_size">44dp</dimen>
-    <dimen name="taskbar_contextual_button_margin">40dp</dimen>
-    <dimen name="taskbar_hotseat_nav_spacing">42dp</dimen>
+    <dimen name="taskbar_contextual_button_margin">47dp</dimen>
+    <dimen name="taskbar_hotseat_nav_spacing">24dp</dimen>
     <dimen name="taskbar_contextual_buttons_size">35dp</dimen>
     <dimen name="taskbar_stashed_size">24dp</dimen>
     <dimen name="taskbar_stashed_handle_width">220dp</dimen>
@@ -268,4 +268,12 @@
     <dimen name="taskbar_back_button_left_margin_kids">48dp</dimen>
     <dimen name="taskbar_home_button_left_margin_kids">48dp</dimen>
     <dimen name="taskbar_icon_size_kids">32dp</dimen>
+
+    <!--  Taskbar 3 button spacing  -->
+    <dimen name="taskbar_button_space_inbetween">24dp</dimen>
+    <dimen name="taskbar_button_margin_5_5">26dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">26dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">47dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">47dp</dimen>
+    <dimen name="taskbar_button_margin_default">47dp</dimen>
 </resources>
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 17da0d9..400a3df 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -46,6 +46,7 @@
 import android.content.pm.ActivityInfo.Config;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.graphics.Region;
@@ -67,6 +68,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.LauncherAnimUtils;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
@@ -94,7 +96,7 @@
 
     private final Rect mTempRect = new Rect();
 
-    private static final int FLAG_SWITCHER_SUPPORTED = 1 << 0;
+    private static final int FLAG_SWITCHER_SHOWING = 1 << 0;
     private static final int FLAG_IME_VISIBLE = 1 << 1;
     private static final int FLAG_ROTATION_BUTTON_VISIBLE = 1 << 2;
     private static final int FLAG_A11Y_VISIBLE = 1 << 3;
@@ -189,7 +191,7 @@
                     isThreeButtonNav ? mStartContextualContainer : mEndContextualContainer,
                     mControllers.navButtonController, R.id.ime_switcher);
             mPropertyHolders.add(new StatePropertyHolder(imeSwitcherButton,
-                    flags -> ((flags & FLAG_SWITCHER_SUPPORTED) != 0)
+                    flags -> ((flags & FLAG_SWITCHER_SHOWING) != 0)
                             && ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
         }
 
@@ -228,6 +230,7 @@
         if (alwaysShowButtons) {
             initButtons(mNavButtonContainer, mEndContextualContainer,
                     mControllers.navButtonController);
+            updateButtonLayoutSpacing();
 
             if (isInSetup) {
                 // Since setup wizard only has back button enabled, it looks strange to be
@@ -451,7 +454,7 @@
 
         // TODO(b/202218289) we're getting IME as not visible on lockscreen from system
         updateStateForFlag(FLAG_IME_VISIBLE, isImeVisible);
-        updateStateForFlag(FLAG_SWITCHER_SUPPORTED, isImeSwitcherShowing);
+        updateStateForFlag(FLAG_SWITCHER_SHOWING, isImeSwitcherShowing);
         updateStateForFlag(FLAG_A11Y_VISIBLE, a11yVisible);
         updateStateForFlag(FLAG_DISABLE_HOME, isHomeDisabled);
         updateStateForFlag(FLAG_DISABLE_RECENTS, isRecentsDisabled);
@@ -465,6 +468,7 @@
             boolean a11yLongClickable =
                     (sysUiStateFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
             mA11yButton.setLongClickable(a11yLongClickable);
+            updateButtonLayoutSpacing();
         }
     }
 
@@ -480,6 +484,13 @@
     }
 
     /**
+     * @return {@code true} if A11y is showing in 3 button nav taskbar
+     */
+    private boolean isContextualButtonShowing() {
+        return mContext.isThreeButtonNav() && (mState & FLAG_A11Y_VISIBLE) != 0;
+    }
+
+    /**
      * Should be called when we need to show back button for bouncer
      */
     public void setBackForBouncer(boolean isBouncerVisible) {
@@ -508,7 +519,7 @@
      * Returns true if IME switcher is visible
      */
     public boolean isImeSwitcherVisible() {
-        return (mState & FLAG_SWITCHER_SUPPORTED) != 0;
+        return (mState & FLAG_SWITCHER_SHOWING) != 0;
     }
 
     /**
@@ -662,6 +673,46 @@
         if (mFloatingRotationButton != null) {
             mFloatingRotationButton.onConfigurationChanged(configChanges);
         }
+        updateButtonLayoutSpacing();
+    }
+
+    /** Adds the correct spacing to 3 button nav container. No-op if using gesture nav */
+    private void updateButtonLayoutSpacing() {
+        if (!mContext.isThreeButtonNav()) {
+            return;
+        }
+        DeviceProfile dp = mContext.getDeviceProfile();
+        Resources res = mContext.getResources();
+
+        // Add spacing after the end of the last nav button
+        FrameLayout.LayoutParams navButtonParams =
+                (FrameLayout.LayoutParams) mNavButtonContainer.getLayoutParams();
+        int navMarginEnd = (int) res.getDimension(dp.inv.inlineNavButtonsEndSpacing);
+        int contextualWidth = mEndContextualContainer.getWidth();
+        // If contextual buttons are showing, we check if the end margin is enough for the
+        // contextual button to be showing - if not, move the nav buttons over a smidge
+        if (isContextualButtonShowing() && navMarginEnd < contextualWidth) {
+            // Additional spacing, eat up half of space between last icon and nav button
+            navMarginEnd += res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing) / 2;
+        }
+        navButtonParams.setMarginEnd(navMarginEnd);
+        mNavButtonContainer.setLayoutParams(navButtonParams);
+
+        // Add the spaces in between the nav buttons
+        int spaceInBetween = res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween);
+        for (int i = 0; i < mNavButtonContainer.getChildCount(); i++) {
+            View navButton = mNavButtonContainer.getChildAt(i);
+            LinearLayout.LayoutParams buttonLayoutParams =
+                    (LinearLayout.LayoutParams) navButton.getLayoutParams();
+            if (i == 0) {
+                buttonLayoutParams.setMarginEnd(spaceInBetween / 2);
+            } else if (i == mNavButtonContainer.getChildCount() - 1) {
+                buttonLayoutParams.setMarginStart(spaceInBetween / 2);
+            } else {
+                buttonLayoutParams.setMarginStart(spaceInBetween / 2);
+                buttonLayoutParams.setMarginEnd(spaceInBetween / 2);
+            }
+        }
     }
 
     public void onDestroy() {
@@ -749,7 +800,7 @@
 
     private static String getStateString(int flags) {
         StringJoiner str = new StringJoiner("|");
-        appendFlag(str, flags, FLAG_SWITCHER_SUPPORTED, "FLAG_SWITCHER_SUPPORTED");
+        appendFlag(str, flags, FLAG_SWITCHER_SHOWING, "FLAG_SWITCHER_SHOWING");
         appendFlag(str, flags, FLAG_IME_VISIBLE, "FLAG_IME_VISIBLE");
         appendFlag(str, flags, FLAG_ROTATION_BUTTON_VISIBLE, "FLAG_ROTATION_BUTTON_VISIBLE");
         appendFlag(str, flags, FLAG_A11Y_VISIBLE, "FLAG_A11Y_VISIBLE");
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
index 3f8d2fb..d0c9346 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
@@ -461,7 +461,7 @@
 
     @Test
     fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1443)
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1305)
     }
 
     @Test
@@ -471,7 +471,7 @@
 
     @Test
     fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(566)
     }
 
     @Test
@@ -481,6 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(566)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
index b53b36a..eed3598 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
@@ -481,6 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(502)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
index 274ca95..6728540 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
@@ -481,6 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(566)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
index 7dd95f9..a4b446a 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
@@ -461,7 +461,7 @@
 
     @Test
     fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(340)
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(266)
     }
 
     @Test
@@ -471,7 +471,7 @@
 
     @Test
     fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(502)
     }
 
     @Test
@@ -481,6 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(502)
     }
 }
\ No newline at end of file
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index e5b588c..3b71585 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -176,6 +176,10 @@
         <!-- defaults to numColumns, if not specified -->
         <attr name="hotseatColumnSpanTwoPanelPortrait" format="integer" />
 
+        <!-- Spacing to have at the end of the nav buttons in large screen 3 button nav,
+             defaults to @dimen/taskbar_button_margin_default -->
+        <attr name="inlineNavButtonsEndSpacing" format="reference" />
+
         <attr name="dbFile" format="string" />
         <attr name="defaultLayoutId" format="reference" />
         <attr name="defaultSplitDisplayLayoutId" format="reference" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e8e318b..b19e739 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -363,6 +363,12 @@
     <dimen name="taskbar_nav_buttons_size">0dp</dimen>
     <dimen name="taskbar_contextual_button_margin">0dp</dimen>
     <dimen name="taskbar_hotseat_nav_spacing">0dp</dimen>
+    <dimen name="taskbar_button_margin_default">0dp</dimen>
+    <dimen name="taskbar_button_space_inbetween">0dp</dimen>
+    <dimen name="taskbar_button_margin_5_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">0dp</dimen>
 
     <!-- Size of the maximum radius for the enforced rounded rectangles. -->
     <dimen name="enforced_rounded_corner_max_radius">16dp</dimen>
diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml
index 5ee291b..0238e7d 100644
--- a/res/xml/device_profiles.xml
+++ b/res/xml/device_profiles.xml
@@ -26,7 +26,7 @@
         launcher:numHotseatIcons="3"
         launcher:dbFile="launcher_3_by_3.db"
         launcher:defaultLayoutId="@xml/default_workspace_3x3"
-        launcher:deviceCategory="phone|multi_display" >
+        launcher:deviceCategory="phone" >
 
         <display-option
             launcher:name="Super Short Stubby"
@@ -58,6 +58,7 @@
         launcher:numFolderColumns="4"
         launcher:numHotseatIcons="4"
         launcher:dbFile="launcher_4_by_4.db"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_4_4"
         launcher:defaultLayoutId="@xml/default_workspace_4x4"
         launcher:deviceCategory="phone|multi_display" >
 
@@ -121,6 +122,7 @@
         launcher:numFolderColumns="4"
         launcher:numHotseatIcons="5"
         launcher:dbFile="launcher.db"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_5_5"
         launcher:defaultLayoutId="@xml/default_workspace_5x5"
         launcher:deviceCategory="phone|multi_display" >
 
@@ -167,6 +169,7 @@
         launcher:hotseatColumnSpanLandscape="4"
         launcher:numAllAppsColumns="6"
         launcher:isScalable="true"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
         launcher:devicePaddingId="@xml/paddings_6x5"
         launcher:dbFile="launcher_6_by_5.db"
         launcher:defaultLayoutId="@xml/default_workspace_6x5"
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index adf6216..3a2227a 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -413,11 +413,13 @@
         if (areNavButtonsInline) {
             /*
              * 3 nav buttons +
+             * Spacing between nav buttons +
              * Little space at the end for contextual buttons +
              * Little space between icons and nav buttons
              */
             hotseatBarEndOffset = 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
-                    + res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin)
+                    + 2 * res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween)
+                    + res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing)
                     + res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
         } else {
             hotseatBarEndOffset = 0;
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 2085b84..c051292 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -127,6 +127,7 @@
     public PointF[] borderSpaces;
     public float folderBorderSpace;
     public float[] hotseatBorderSpaces;
+    public int inlineNavButtonsEndSpacing;
 
     public float[] horizontalMargin;
 
@@ -339,6 +340,8 @@
         devicePaddingId = closestProfile.devicePaddingId;
         this.deviceType = deviceType;
 
+        inlineNavButtonsEndSpacing = closestProfile.inlineNavButtonsEndSpacing;
+
         mExtraAttrs = closestProfile.extraAttrs;
 
         iconSize = displayOption.iconSizes;
@@ -735,6 +738,7 @@
 
         private final int[] hotseatColumnSpan = new int[COUNT_SIZES];
 
+        private int inlineNavButtonsEndSpacing;
         private final String dbFile;
 
         private final int defaultLayoutId;
@@ -785,6 +789,9 @@
                     R.styleable.GridDisplayOption_hotseatColumnSpanTwoPanelPortrait,
                     numColumns);
 
+            inlineNavButtonsEndSpacing =
+                    a.getResourceId(R.styleable.GridDisplayOption_inlineNavButtonsEndSpacing,
+                    R.dimen.taskbar_button_margin_default);
             numFolderRows = a.getInt(
                     R.styleable.GridDisplayOption_numFolderRows, numRows);
             numFolderColumns = a.getInt(
diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
index 6715749..c8b5e2f 100644
--- a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
+++ b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
@@ -17,7 +17,6 @@
 package com.android.launcher3.uioverrides;
 
 import android.app.Person;
-import android.content.Context;
 import android.content.pm.ShortcutInfo;
 
 import com.android.launcher3.Utilities;
@@ -29,11 +28,4 @@
     public static Person[] getPersons(ShortcutInfo si) {
         return Utilities.EMPTY_PERSON_ARRAY;
     }
-
-    /**
-     * Returns the minimum space that should be left empty at the end of hotseat
-     */
-    public static int getHotseatEndOffset(Context context) {
-        return 0;
-    }
 }
diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index 9a76336..7465db5 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -135,6 +135,7 @@
             hotseatBorderSpaces = FloatArray(4) { 16f }
             hotseatColumnSpan = IntArray(4) { 4 }
             hotseatBarBottomSpace = FloatArray(4) { 48f }
+            inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_4
             hotseatQsbSpace = FloatArray(4) { 36f }
             iconSize = FloatArray(4) { 56f }
             allAppsIconSize = FloatArray(4) { 56f }