diff --git a/quickstep/res/layout/taskbar.xml b/quickstep/res/layout/taskbar.xml index dfa17d6cc4..c0e0862588 100644 --- a/quickstep/res/layout/taskbar.xml +++ b/quickstep/res/layout/taskbar.xml @@ -36,18 +36,27 @@ android:layout_height="wrap_content" android:layout_gravity="bottom" > + + + android:layout_gravity="end"/> ((flags & MASK_IME_SWITCHER_VISIBLE) == MASK_IME_SWITCHER_VISIBLE) && ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0) && ((flags & FLAG_A11Y_VISIBLE) == 0))); - mBackButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK, - mStartContainer, mControllers.navButtonController, R.id.back); + View imeDownButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK, + mStartContextualContainer, mControllers.navButtonController, R.id.back); + imeDownButton.setRotation(Utilities.isRtl(mContext.getResources()) ? 90 : -90); // Rotate when Ime visible - mPropertyHolders.add(new StatePropertyHolder(mBackButton, - flags -> (flags & FLAG_IME_VISIBLE) == 0, View.ROTATION, 0, - Utilities.isRtl(mContext.getResources()) ? 90 : -90)); + mPropertyHolders.add(new StatePropertyHolder(imeDownButton, + flags -> (flags & FLAG_IME_VISIBLE) != 0)); if (mContext.isThreeButtonNav()) { - initButtons(mStartContainer, mEndContainer, mControllers.navButtonController); + initButtons(mNavButtonContainer, mEndContextualContainer, + mControllers.navButtonController); // Animate taskbar background when IME shows mPropertyHolders.add(new StatePropertyHolder( @@ -142,21 +146,18 @@ public class NavbarButtonsViewController { // Rotation button RotationButton rotationButton = new RotationButtonImpl( - addButton(mEndContainer, R.id.rotate_suggestion)); + addButton(mEndContextualContainer, R.id.rotate_suggestion)); rotationButton.hide(); mControllers.rotationButtonController.setRotationButton(rotationButton); } else { mControllers.rotationButtonController.setRotationButton(new RotationButton() {}); - // Show when IME is visible - mPropertyHolders.add(new StatePropertyHolder(mBackButton, - flags -> (flags & FLAG_IME_VISIBLE) != 0)); } applyState(); mPropertyHolders.forEach(StatePropertyHolder::endAnimation); } - private void initButtons(ViewGroup startContainer, ViewGroup endContainer, + private void initButtons(ViewGroup navContainer, ViewGroup endContainer, TaskbarNavButtonController navButtonController) { // Hide when keyguard is showing, show when bouncer is showing @@ -164,14 +165,19 @@ public class NavbarButtonsViewController { flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0 || (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0)); + mBackButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK, + mNavButtonContainer, mControllers.navButtonController, R.id.back); + mPropertyHolders.add(new StatePropertyHolder(mBackButton, + flags -> (flags & FLAG_IME_VISIBLE) == 0)); + // home and recents buttons - View homeButton = addButton(R.drawable.ic_sysbar_home, BUTTON_HOME, startContainer, + View homeButton = addButton(R.drawable.ic_sysbar_home, BUTTON_HOME, navContainer, navButtonController, R.id.home); mPropertyHolders.add(new StatePropertyHolder(homeButton, flags -> (flags & FLAG_IME_VISIBLE) == 0 && (flags & FLAG_KEYGUARD_VISIBLE) == 0)); View recentsButton = addButton(R.drawable.ic_sysbar_recent, BUTTON_RECENTS, - startContainer, navButtonController, R.id.recent_apps); + navContainer, navButtonController, R.id.recent_apps); mPropertyHolders.add(new StatePropertyHolder(recentsButton, flags -> (flags & FLAG_IME_VISIBLE) == 0 && (flags & FLAG_KEYGUARD_VISIBLE) == 0)); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 6f53f2b60c..a4a92f7567 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -194,24 +194,30 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int count = getChildCount(); int spaceNeeded = count * (mItemMarginLeftRight * 2 + mIconTouchSize); - int iconStart = (right - left - spaceNeeded) / 2; - int startOffset = ApiWrapper.getHotseatStartOffset(getContext()); - if (startOffset > iconStart) { - int diff = startOffset - iconStart; - iconStart = isLayoutRtl() ? (iconStart - diff) : iconStart + diff; + int navSpaceNeeded = ApiWrapper.getHotseatEndOffset(getContext()); + boolean layoutRtl = isLayoutRtl(); + int iconEnd = right - (right - left - spaceNeeded) / 2; + boolean needMoreSpaceForNav = layoutRtl ? + navSpaceNeeded > (iconEnd - spaceNeeded) : + iconEnd > (right - navSpaceNeeded); + if (needMoreSpaceForNav) { + int offset = layoutRtl ? + navSpaceNeeded - (iconEnd - spaceNeeded) : + (right - navSpaceNeeded) - iconEnd; + iconEnd += offset; } // Layout the children - mIconLayoutBounds.left = iconStart; + mIconLayoutBounds.right = iconEnd; mIconLayoutBounds.top = (bottom - top - mIconTouchSize) / 2; mIconLayoutBounds.bottom = mIconLayoutBounds.top + mIconTouchSize; - for (int i = 0; i < count; i++) { - View child = getChildAt(i); - iconStart += mItemMarginLeftRight; - int iconEnd = iconStart + mIconTouchSize; + for (int i = count; i > 0; i--) { + View child = getChildAt(i - 1); + iconEnd -= mItemMarginLeftRight; + int iconStart = iconEnd - mIconTouchSize; child.layout(iconStart, mIconLayoutBounds.top, iconEnd, mIconLayoutBounds.bottom); - iconStart = iconEnd + mItemMarginLeftRight; + iconEnd = iconStart - mItemMarginLeftRight; } - mIconLayoutBounds.right = iconStart; + mIconLayoutBounds.left = iconEnd; } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java index a595f54322..85943b66a6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java @@ -44,9 +44,9 @@ public class ApiWrapper { } /** - * Returns the minimum space that should be left empty at the start of hotseat + * Returns the minimum space that should be left empty at the end of hotseat */ - public static int getHotseatStartOffset(Context context) { + public static int getHotseatEndOffset(Context context) { if (SysUINavigationMode.INSTANCE.get(context).getMode() == Mode.THREE_BUTTONS) { Resources res = context.getResources(); return 2 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_spacing) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 624862d5d3..edd44e3424 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -777,7 +777,7 @@ public class DeviceProfile { int taskbarOffset = getTaskbarOffsetY(); int hotseatTopDiff = hotseatHeight - taskbarSize - taskbarOffset; - int startOffset = ApiWrapper.getHotseatStartOffset(context); + int endOffset = ApiWrapper.getHotseatEndOffset(context); int requiredWidth = iconSizePx * numShownHotseatIcons; Resources res = context.getResources(); @@ -785,16 +785,16 @@ public class DeviceProfile { float taskbarIconSpacing = 2 * res.getDimension(R.dimen.taskbar_icon_spacing); int maxSize = (int) (requiredWidth * (taskbarIconSize + taskbarIconSpacing) / taskbarIconSize); - int hotseatSize = Math.min(maxSize, availableWidthPx - startOffset); + int hotseatSize = Math.min(maxSize, availableWidthPx - endOffset); int sideSpacing = (availableWidthPx - hotseatSize) / 2; mHotseatPadding.set(sideSpacing, hotseatTopDiff, sideSpacing, taskbarOffset); - if (startOffset > sideSpacing) { + if (endOffset > sideSpacing) { int diff = Utilities.isRtl(context.getResources()) - ? sideSpacing - startOffset - : startOffset - sideSpacing; - mHotseatPadding.left += diff; - mHotseatPadding.right -= diff; + ? sideSpacing - endOffset + : endOffset - sideSpacing; + mHotseatPadding.left -= diff; + mHotseatPadding.right += diff; } } else { // We want the edges of the hotseat to line up with the edges of the workspace, but the diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java index c606861cd8..cc90e6c513 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java @@ -39,9 +39,9 @@ public class ApiWrapper { } /** - * Returns the minimum space that should be left empty at the start of hotseat + * Returns the minimum space that should be left empty at the end of hotseat */ - public static int getHotseatStartOffset(Context context) { + public static int getHotseatEndOffset(Context context) { return 0; } }