Merge "Polish hotseat and taskbar with 3 buttons" into tm-qpr-dev

This commit is contained in:
Alex Chau
2022-12-19 11:37:39 +00:00
committed by Android (Google) Code Review
9 changed files with 125 additions and 109 deletions
+1 -3
View File
@@ -76,10 +76,8 @@
<dimen name="gesture_tutorial_taskbar_padding_start_end">218dp</dimen> <dimen name="gesture_tutorial_taskbar_padding_start_end">218dp</dimen>
<!-- Taskbar 3 button spacing --> <!-- Taskbar 3 button spacing -->
<dimen name="taskbar_button_margin_5_5">94.5dp</dimen> <dimen name="taskbar_button_margin_split">88dp</dimen>
<dimen name="taskbar_button_margin_6_5">219.6dp</dimen> <dimen name="taskbar_button_margin_6_5">219.6dp</dimen>
<dimen name="taskbar_button_margin_4_5">84dp</dimen>
<dimen name="taskbar_button_margin_4_4">79dp</dimen>
<dimen name="taskbar_contextual_button_margin">48dp</dimen> <dimen name="taskbar_contextual_button_margin">48dp</dimen>
<dimen name="taskbar_suw_frame">96dp</dimen> <dimen name="taskbar_suw_frame">96dp</dimen>
<dimen name="taskbar_suw_insets">24dp</dimen> <dimen name="taskbar_suw_insets">24dp</dimen>
+2 -4
View File
@@ -303,11 +303,9 @@
<!-- Taskbar 3 button spacing --> <!-- Taskbar 3 button spacing -->
<dimen name="taskbar_button_space_inbetween">24dp</dimen> <dimen name="taskbar_button_space_inbetween">24dp</dimen>
<dimen name="taskbar_button_space_inbetween_phone">40dp</dimen> <dimen name="taskbar_button_space_inbetween_phone">40dp</dimen>
<dimen name="taskbar_button_margin_5_5">26dp</dimen> <dimen name="taskbar_button_margin_split">48dp</dimen>
<dimen name="taskbar_button_margin_6_5">75dp</dimen> <dimen name="taskbar_button_margin_6_5">75dp</dimen>
<dimen name="taskbar_button_margin_4_5">47dp</dimen> <dimen name="taskbar_button_margin_default">48dp</dimen>
<dimen name="taskbar_button_margin_4_4">47dp</dimen>
<dimen name="taskbar_button_margin_default">47dp</dimen>
<!-- Launcher splash screen --> <!-- Launcher splash screen -->
<!-- Note: keep this value in sync with the WindowManager/Shell dimens.xml --> <!-- Note: keep this value in sync with the WindowManager/Shell dimens.xml -->
@@ -152,10 +152,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
TaskbarNavButtonController buttonController, ScopedUnfoldTransitionProgressProvider TaskbarNavButtonController buttonController, ScopedUnfoldTransitionProgressProvider
unfoldTransitionProgressProvider) { unfoldTransitionProgressProvider) {
super(windowContext); super(windowContext);
mDeviceProfile = launcherDp.copy(this);
final Resources resources = getResources(); final Resources resources = getResources();
matchDeviceProfile(launcherDp, getResources());
mNavMode = DisplayController.getNavigationMode(windowContext); mNavMode = DisplayController.getNavigationMode(windowContext);
mImeDrawsImeNavBar = getBoolByName(IME_DRAWS_IME_NAV_BAR_RES_NAME, resources, false); mImeDrawsImeNavBar = getBoolByName(IME_DRAWS_IME_NAV_BAR_RES_NAME, resources, false);
mIsSafeModeEnabled = TraceHelper.allowIpcs("isSafeMode", mIsSafeModeEnabled = TraceHelper.allowIpcs("isSafeMode",
@@ -170,8 +170,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
mIsNavBarKidsMode = settingsCache.getValue( mIsNavBarKidsMode = settingsCache.getValue(
Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE), 0); Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE), 0);
updateIconSize(resources);
// Get display and corners first, as views might use them in constructor. // Get display and corners first, as views might use them in constructor.
Display display = windowContext.getDisplay(); Display display = windowContext.getDisplay();
Context c = display.getDisplayId() == Display.DEFAULT_DISPLAY Context c = display.getDisplayId() == Display.DEFAULT_DISPLAY
@@ -259,8 +257,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
public void updateDeviceProfile(DeviceProfile launcherDp, NavigationMode navMode) { public void updateDeviceProfile(DeviceProfile launcherDp, NavigationMode navMode) {
mNavMode = navMode; mNavMode = navMode;
mControllers.taskbarOverlayController.updateLauncherDeviceProfile(launcherDp); mControllers.taskbarOverlayController.updateLauncherDeviceProfile(launcherDp);
mDeviceProfile = launcherDp.copy(this); matchDeviceProfile(launcherDp, getResources());
updateIconSize(getResources());
AbstractFloatingView.closeAllOpenViewsExcept(this, false, TYPE_REBIND_SAFE); AbstractFloatingView.closeAllOpenViewsExcept(this, false, TYPE_REBIND_SAFE);
// Reapply fullscreen to take potential new screen size into account. // Reapply fullscreen to take potential new screen size into account.
@@ -269,6 +266,21 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
dispatchDeviceProfileChanged(); dispatchDeviceProfileChanged();
} }
/**
* Copy the original DeviceProfile, match the number of hotseat icons and qsb width and update
* the icon size
*/
private void matchDeviceProfile(DeviceProfile originDeviceProfile, Resources resources) {
mDeviceProfile = originDeviceProfile.copy(this);
// Taskbar should match the number of icons of hotseat
mDeviceProfile.numShownHotseatIcons = originDeviceProfile.numShownHotseatIcons;
// Same QSB width to have a smooth animation
mDeviceProfile.hotseatQsbWidth = originDeviceProfile.hotseatQsbWidth;
// Update the size of the icons
updateIconSize(resources);
}
private void updateIconSize(Resources resources) { private void updateIconSize(Resources resources) {
mDeviceProfile.iconSizePx = resources.getDimensionPixelSize( mDeviceProfile.iconSizePx = resources.getDimensionPixelSize(
DisplayController.isTransientTaskbar(this) DisplayController.isTransientTaskbar(this)
@@ -39,12 +39,12 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(558) assertThat(dp.hotseatBarEndOffset).isEqualTo(510)
assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.numShownHotseatIcons).isEqualTo(6)
assertThat(dp.hotseatBorderSpace).isEqualTo(69) assertThat(dp.hotseatBorderSpace).isEqualTo(70)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(176) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(150)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(558) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(580)
assertThat(dp.isQsbInline).isFalse() assertThat(dp.isQsbInline).isFalse()
assertThat(dp.hotseatQsbWidth).isEqualTo(1445) assertThat(dp.hotseatQsbWidth).isEqualTo(1445)
@@ -61,12 +61,12 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(558) assertThat(dp.hotseatBarEndOffset).isEqualTo(510)
assertThat(dp.numShownHotseatIcons).isEqualTo(4) assertThat(dp.numShownHotseatIcons).isEqualTo(4)
assertThat(dp.hotseatBorderSpace).isEqualTo(50) assertThat(dp.hotseatBorderSpace).isEqualTo(40)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(112) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(150)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(558) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(550)
assertThat(dp.isQsbInline).isFalse() assertThat(dp.isQsbInline).isFalse()
assertThat(dp.hotseatQsbWidth).isEqualTo(1080) assertThat(dp.hotseatQsbWidth).isEqualTo(1080)
@@ -82,12 +82,12 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(744) assertThat(dp.hotseatBarEndOffset).isEqualTo(705)
assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.numShownHotseatIcons).isEqualTo(6)
assertThat(dp.hotseatBorderSpace).isEqualTo(82) assertThat(dp.hotseatBorderSpace).isEqualTo(54)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(106) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(231)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(744) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(759)
assertThat(dp.isQsbInline).isFalse() assertThat(dp.isQsbInline).isFalse()
assertThat(dp.hotseatQsbWidth).isEqualTo(1468) assertThat(dp.hotseatQsbWidth).isEqualTo(1468)
@@ -107,12 +107,12 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(705) assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.numShownHotseatIcons).isEqualTo(6)
assertThat(dp.hotseatBorderSpace).isEqualTo(102) assertThat(dp.hotseatBorderSpace).isEqualTo(100)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(625) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(300)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(1040)
assertThat(dp.isQsbInline).isFalse() assertThat(dp.isQsbInline).isFalse()
assertThat(dp.hotseatQsbWidth).isEqualTo(1233) assertThat(dp.hotseatQsbWidth).isEqualTo(1233)
@@ -128,15 +128,15 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(705) assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.numShownHotseatIcons).isEqualTo(6)
assertThat(dp.hotseatBorderSpace).isEqualTo(36) assertThat(dp.hotseatBorderSpace).isEqualTo(36)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(854) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(864)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(696)
assertThat(dp.isQsbInline).isTrue() assertThat(dp.isQsbInline).isTrue()
assertThat(dp.hotseatQsbWidth).isEqualTo(531) assertThat(dp.hotseatQsbWidth).isEqualTo(528)
} }
/** /**
@@ -150,12 +150,12 @@ class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
val dp = newDP() val dp = newDP()
dp.isTaskbarPresentInApps = true dp.isTaskbarPresentInApps = true
assertThat(dp.hotseatBarEndOffset).isEqualTo(705) assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
assertThat(dp.numShownHotseatIcons).isEqualTo(5) assertThat(dp.numShownHotseatIcons).isEqualTo(5)
assertThat(dp.hotseatBorderSpace).isEqualTo(43) assertThat(dp.hotseatBorderSpace).isEqualTo(36)
assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(782) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(816)
assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(700)
assertThat(dp.isQsbInline).isTrue() assertThat(dp.isQsbInline).isTrue()
assertThat(dp.hotseatQsbWidth).isEqualTo(480) assertThat(dp.hotseatQsbWidth).isEqualTo(480)
+2 -3
View File
@@ -361,6 +361,7 @@
<dimen name="qsb_widget_height">0dp</dimen> <dimen name="qsb_widget_height">0dp</dimen>
<dimen name="qsb_shadow_height">0dp</dimen> <dimen name="qsb_shadow_height">0dp</dimen>
<dimen name="min_hotseat_icon_space">18dp</dimen> <dimen name="min_hotseat_icon_space">18dp</dimen>
<dimen name="max_hotseat_icon_space">50dp</dimen>
<dimen name="min_hotseat_qsb_width">0dp</dimen> <dimen name="min_hotseat_qsb_width">0dp</dimen>
<dimen name="taskbar_icon_size">44dp</dimen> <dimen name="taskbar_icon_size">44dp</dimen>
<dimen name="transient_taskbar_icon_size">57dp</dimen> <dimen name="transient_taskbar_icon_size">57dp</dimen>
@@ -383,10 +384,8 @@
<dimen name="taskbar_button_margin_default">0dp</dimen> <dimen name="taskbar_button_margin_default">0dp</dimen>
<dimen name="taskbar_button_space_inbetween">0dp</dimen> <dimen name="taskbar_button_space_inbetween">0dp</dimen>
<dimen name="taskbar_button_space_inbetween_phone">0dp</dimen> <dimen name="taskbar_button_space_inbetween_phone">0dp</dimen>
<dimen name="taskbar_button_margin_5_5">0dp</dimen> <dimen name="taskbar_button_margin_split">0dp</dimen>
<dimen name="taskbar_button_margin_6_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>
<!-- Taskbar swipe up thresholds threshold --> <!-- Taskbar swipe up thresholds threshold -->
<dimen name="taskbar_nav_threshold">0dp</dimen> <dimen name="taskbar_nav_threshold">0dp</dimen>
<dimen name="taskbar_app_window_threshold">0dp</dimen> <dimen name="taskbar_app_window_threshold">0dp</dimen>
+4 -2
View File
@@ -57,8 +57,9 @@
launcher:numFolderRows="3" launcher:numFolderRows="3"
launcher:numFolderColumns="4" launcher:numFolderColumns="4"
launcher:numHotseatIcons="4" launcher:numHotseatIcons="4"
launcher:numExtendedHotseatIcons="6"
launcher:dbFile="launcher_4_by_4.db" launcher:dbFile="launcher_4_by_4.db"
launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_4_4" launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_split"
launcher:defaultLayoutId="@xml/default_workspace_4x4" launcher:defaultLayoutId="@xml/default_workspace_4x4"
launcher:deviceCategory="phone|multi_display" > launcher:deviceCategory="phone|multi_display" >
@@ -121,8 +122,9 @@
launcher:numFolderRows="4" launcher:numFolderRows="4"
launcher:numFolderColumns="4" launcher:numFolderColumns="4"
launcher:numHotseatIcons="5" launcher:numHotseatIcons="5"
launcher:numExtendedHotseatIcons="6"
launcher:dbFile="launcher.db" launcher:dbFile="launcher.db"
launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_5_5" launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_split"
launcher:defaultLayoutId="@xml/default_workspace_5x5" launcher:defaultLayoutId="@xml/default_workspace_5x5"
launcher:deviceCategory="phone|multi_display" > launcher:deviceCategory="phone|multi_display" >
+57 -65
View File
@@ -188,6 +188,10 @@ public class DeviceProfile {
public final int hotseatQsbVisualHeight; public final int hotseatQsbVisualHeight;
private final int hotseatQsbShadowHeight; private final int hotseatQsbShadowHeight;
public int hotseatBorderSpace; public int hotseatBorderSpace;
private int minHotseatIconSpacePx;
private int minHotseatQsbWidthPx;
private final int maxHotseatIconSpacePx;
private int inlineNavButtonsEndSpacing;
// Bottom sheets // Bottom sheets
public int bottomSheetTopPadding; public int bottomSheetTopPadding;
@@ -434,7 +438,7 @@ public class DeviceProfile {
|| inv.inlineQsb[INDEX_TWO_PANEL_LANDSCAPE] || inv.inlineQsb[INDEX_TWO_PANEL_LANDSCAPE]
: inv.inlineQsb[INDEX_DEFAULT] || inv.inlineQsb[INDEX_LANDSCAPE]) : inv.inlineQsb[INDEX_DEFAULT] || inv.inlineQsb[INDEX_LANDSCAPE])
&& hotseatQsbHeight > 0; && hotseatQsbHeight > 0;
isQsbInline = inv.inlineQsb[mTypeIndex] && canQsbInline; isQsbInline = isScalableGrid && inv.inlineQsb[mTypeIndex] && canQsbInline;
areNavButtonsInline = isTaskbarPresent && !isGestureMode; areNavButtonsInline = isTaskbarPresent && !isGestureMode;
numShownHotseatIcons = numShownHotseatIcons =
@@ -474,17 +478,17 @@ public class DeviceProfile {
hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0; hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0;
updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics));
if (areNavButtonsInline && !isPhone) { if (areNavButtonsInline && !isPhone) {
inlineNavButtonsEndSpacing = res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing);
/* /*
* 3 nav buttons + * 3 nav buttons +
* Spacing between nav buttons + * Spacing between nav buttons +
* Little space at the end for contextual buttons + * Space at the end for contextual buttons
* Little space between icons and nav buttons
*/ */
hotseatBarEndOffset = 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size) hotseatBarEndOffset = 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
+ 2 * res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween) + 2 * res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween)
+ res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing) + inlineNavButtonsEndSpacing;
+ res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
} else { } else {
inlineNavButtonsEndSpacing = 0;
hotseatBarEndOffset = 0; hotseatBarEndOffset = 0;
} }
@@ -531,8 +535,12 @@ public class DeviceProfile {
cellLayoutPadding); cellLayoutPadding);
updateWorkspacePadding(); updateWorkspacePadding();
minHotseatIconSpacePx = res.getDimensionPixelSize(R.dimen.min_hotseat_icon_space);
minHotseatQsbWidthPx = res.getDimensionPixelSize(R.dimen.min_hotseat_qsb_width);
maxHotseatIconSpacePx = areNavButtonsInline
? res.getDimensionPixelSize(R.dimen.max_hotseat_icon_space) : Integer.MAX_VALUE;
// Hotseat and QSB width depends on updated cellSize and workspace padding // Hotseat and QSB width depends on updated cellSize and workspace padding
recalculateHotseatWidthAndBorderSpace(res); recalculateHotseatWidthAndBorderSpace();
// AllApps height calculation depends on updated cellSize // AllApps height calculation depends on updated cellSize
if (isTablet) { if (isTablet) {
@@ -621,68 +629,57 @@ public class DeviceProfile {
} }
} }
private void recalculateHotseatWidthAndBorderSpace(Resources res) { /**
hotseatBorderSpace = calculateHotseatBorderSpace(); * Calculates the width of the hotseat, changing spaces between the icons and removing icons if
* necessary.
*/
public void recalculateHotseatWidthAndBorderSpace() {
if (!isScalableGrid) return;
int columns = inv.hotseatColumnSpan[mTypeIndex];
float hotseatWidthPx = getIconToIconWidthForColumns(columns);
hotseatBorderSpace = calculateHotseatBorderSpace(hotseatWidthPx, /* numExtraBorder= */ 0);
hotseatQsbWidth = calculateQsbWidth(hotseatBorderSpace); hotseatQsbWidth = calculateQsbWidth(hotseatBorderSpace);
// Spaces should be correct when there nav buttons are not inline // Spaces should be correct when the nav buttons are not inline
if (!areNavButtonsInline) { if (!areNavButtonsInline) {
return; return;
} }
// Get the maximum width that the hotseat can be // The side space with inline buttons should be what is defined in InvariantDeviceProfile
int columns = getPanelCount() * inv.numColumns; int sideSpace = inlineNavButtonsEndSpacing;
int maxHotseatWidth = getIconToIconWidthForColumns(columns); int maxHotseatWidth = availableWidthPx - sideSpace - hotseatBarEndOffset;
int sideSpace = (availableWidthPx - maxHotseatWidth) / 2; int maxHotseatIconsWidth = maxHotseatWidth - (isQsbInline ? hotseatQsbWidth : 0);
int inlineButtonsOverlap = Math.max(0, hotseatBarEndOffset - sideSpace); hotseatBorderSpace = calculateHotseatBorderSpace(maxHotseatIconsWidth,
// decrease how much the nav buttons go "inside" the hotseat (isQsbInline ? 1 : 0) + /* border between nav buttons and first icon */ 1);
maxHotseatWidth -= inlineButtonsOverlap;
// Get how much space is required to show the hotseat with QSB if (hotseatBorderSpace >= minHotseatIconSpacePx) {
int requiredWidth = getHotseatRequiredWidth();
// If spaces are fine, use them
if (requiredWidth <= maxHotseatWidth) {
return;
}
// Calculate the difference of widths and remove a little from each space between icons
// and QSB if it's inline
int spaceDiff = requiredWidth - maxHotseatWidth;
int numOfSpaces = numShownHotseatIcons - (isQsbInline ? 0 : 1);
hotseatBorderSpace -= (spaceDiff / numOfSpaces);
int minHotseatIconSpaceDp = res.getDimensionPixelSize(R.dimen.min_hotseat_icon_space);
int minHotseatQsbWidthDp = res.getDimensionPixelSize(R.dimen.min_hotseat_qsb_width);
if (hotseatBorderSpace >= minHotseatIconSpaceDp) {
return; return;
} }
// Border space can't be less than the minimum // Border space can't be less than the minimum
hotseatBorderSpace = minHotseatIconSpaceDp; hotseatBorderSpace = minHotseatIconSpacePx;
requiredWidth = getHotseatRequiredWidth(); int requiredWidth = getHotseatRequiredWidth();
// If there is an inline qsb, change its size // If there is an inline qsb, change its size
if (isQsbInline) { if (isQsbInline) {
hotseatQsbWidth -= requiredWidth - maxHotseatWidth; hotseatQsbWidth -= requiredWidth - maxHotseatWidth;
if (hotseatQsbWidth >= minHotseatQsbWidthDp) { if (hotseatQsbWidth >= minHotseatQsbWidthPx) {
return; return;
} }
// QSB can't be less than the minimum // QSB can't be less than the minimum
hotseatQsbWidth = minHotseatQsbWidthDp; hotseatQsbWidth = minHotseatQsbWidthPx;
} }
maxHotseatIconsWidth = maxHotseatWidth - (isQsbInline ? hotseatQsbWidth : 0);
// If it still doesn't fit, start removing icons // If it still doesn't fit, start removing icons
do { do {
numShownHotseatIcons--; numShownHotseatIcons--;
requiredWidth = getHotseatRequiredWidth(); hotseatBorderSpace = calculateHotseatBorderSpace(maxHotseatIconsWidth,
} while (requiredWidth > maxHotseatWidth && numShownHotseatIcons > 1); (isQsbInline ? 1 : 0) + /* border between nav buttons and first icon */ 1);
} while (hotseatBorderSpace < minHotseatIconSpacePx && numShownHotseatIcons > 1);
// Add back some space between the icons
spaceDiff = maxHotseatWidth - requiredWidth;
numOfSpaces = numShownHotseatIcons - (isQsbInline ? 0 : 1);
hotseatBorderSpace += (spaceDiff / numOfSpaces);
} }
private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) { private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) {
@@ -954,15 +951,14 @@ public class DeviceProfile {
} }
/** /**
* Hotseat width spans a certain number of columns on scalable grids. * This method calculates the space between the icons to achieve a certain width.
* This method calculates the space between the icons to achieve that width.
*/ */
private int calculateHotseatBorderSpace() { private int calculateHotseatBorderSpace(float hotseatWidthPx, int numExtraBorder) {
if (!isScalableGrid) return 0;
int columns = inv.hotseatColumnSpan[mTypeIndex];
float hotseatWidthPx = getIconToIconWidthForColumns(columns);
float hotseatIconsTotalPx = iconSizePx * numShownHotseatIcons; float hotseatIconsTotalPx = iconSizePx * numShownHotseatIcons;
return (int) (hotseatWidthPx - hotseatIconsTotalPx) / (numShownHotseatIcons - 1); int hotseatBorderSpace =
(int) (hotseatWidthPx - hotseatIconsTotalPx)
/ (numShownHotseatIcons - 1 + numExtraBorder);
return Math.min(hotseatBorderSpace, maxHotseatIconSpacePx);
} }
@@ -1283,12 +1279,16 @@ public class DeviceProfile {
int hotseatBarTopPadding = int hotseatBarTopPadding =
hotseatBarSizePx - hotseatBarBottomPadding - hotseatCellHeightPx; hotseatBarSizePx - hotseatBarBottomPadding - hotseatCellHeightPx;
// Push icons to the side int hotseatWidth = getHotseatRequiredWidth();
int requiredWidth = getHotseatRequiredWidth(); int leftSpacing = (availableWidthPx - hotseatWidth) / 2;
int hotseatWidth = Math.min(requiredWidth, availableWidthPx - hotseatBarEndOffset); int rightSpacing = leftSpacing;
int sideSpacing = (availableWidthPx - hotseatWidth) / 2; // Hotseat aligns to the left with nav buttons
if (hotseatBarEndOffset > 0) {
leftSpacing = inlineNavButtonsEndSpacing;
rightSpacing = availableWidthPx - hotseatWidth - leftSpacing + hotseatBorderSpace;
}
hotseatBarPadding.set(sideSpacing, hotseatBarTopPadding, sideSpacing, hotseatBarPadding.set(leftSpacing, hotseatBarTopPadding, rightSpacing,
hotseatBarBottomPadding); hotseatBarBottomPadding);
boolean isRtl = Utilities.isRtl(context.getResources()); boolean isRtl = Utilities.isRtl(context.getResources());
@@ -1297,14 +1297,6 @@ public class DeviceProfile {
} else { } else {
hotseatBarPadding.left += getAdditionalQsbSpace(); hotseatBarPadding.left += getAdditionalQsbSpace();
} }
if (hotseatBarEndOffset > sideSpacing) {
int diff = isRtl
? sideSpacing - hotseatBarEndOffset
: hotseatBarEndOffset - sideSpacing;
hotseatBarPadding.left -= diff;
hotseatBarPadding.right += diff;
}
} else if (isScalableGrid) { } else if (isScalableGrid) {
int sideSpacing = (availableWidthPx - hotseatQsbWidth) / 2; int sideSpacing = (availableWidthPx - hotseatQsbWidth) / 2;
hotseatBarPadding.set(sideSpacing, hotseatBarPadding.set(sideSpacing,
@@ -1340,7 +1332,7 @@ public class DeviceProfile {
private int getHotseatRequiredWidth() { private int getHotseatRequiredWidth() {
int additionalQsbSpace = getAdditionalQsbSpace(); int additionalQsbSpace = getAdditionalQsbSpace();
return iconSizePx * numShownHotseatIcons return iconSizePx * numShownHotseatIcons
+ hotseatBorderSpace * (numShownHotseatIcons - 1) + hotseatBorderSpace * (numShownHotseatIcons - (areNavButtonsInline ? 0 : 1))
+ additionalQsbSpace; + additionalQsbSpace;
} }
@@ -422,6 +422,21 @@ public class InvariantDeviceProfile {
} }
supportedProfiles = Collections.unmodifiableList(localSupportedProfiles); supportedProfiles = Collections.unmodifiableList(localSupportedProfiles);
int numMinShownHotseatIconsForTablet = supportedProfiles
.stream()
.filter(deviceProfile -> deviceProfile.isTablet)
.mapToInt(deviceProfile -> deviceProfile.numShownHotseatIcons)
.min()
.orElse(0);
supportedProfiles
.stream()
.filter(deviceProfile -> deviceProfile.isTablet)
.forEach(deviceProfile -> {
deviceProfile.numShownHotseatIcons = numMinShownHotseatIconsForTablet;
deviceProfile.recalculateHotseatWidthAndBorderSpace();
});
ComponentName cn = new ComponentName(context.getPackageName(), getClass().getName()); ComponentName cn = new ComponentName(context.getPackageName(), getClass().getName());
defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null); defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null);
} }
@@ -109,7 +109,7 @@ abstract class DeviceProfileBaseTest {
numFolderColumns = 3 numFolderColumns = 3
folderStyle = R.style.FolderDefaultStyle folderStyle = R.style.FolderDefaultStyle
inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_5 inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_split
horizontalMargin = FloatArray(4) { 22f } horizontalMargin = FloatArray(4) { 22f }
@@ -277,7 +277,7 @@ abstract class DeviceProfileBaseTest {
numFolderColumns = 3 numFolderColumns = 3
folderStyle = R.style.FolderDefaultStyle folderStyle = R.style.FolderDefaultStyle
inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_4 inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_split
horizontalMargin = floatArrayOf(21.5f, 21.5f, 22.5f, 30.5f) horizontalMargin = floatArrayOf(21.5f, 21.5f, 22.5f, 30.5f)