Fix wrong getIconBounds method inside BubbleTextView
Bug: 205065809
Test: screenshot on the bug
TL;DR;; created two variants depending on the layout direction
Change-Id: I9c5e74409c701b1f219ca450de0dca2291507045
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 35c257f..1f1d57a 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -141,6 +141,7 @@
private final CheckLongPressHelper mLongPressHelper;
private final boolean mLayoutHorizontal;
+ private final boolean mIsRtl;
private final int mIconSize;
@ViewDebug.ExportedProperty(category = "launcher")
@@ -185,6 +186,8 @@
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.BubbleTextView, defStyle, 0);
mLayoutHorizontal = a.getBoolean(R.styleable.BubbleTextView_layoutHorizontal, false);
+ mIsRtl = (getResources().getConfiguration().getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL);
DeviceProfile grid = mActivity.getDeviceProfile();
mDisplay = a.getInteger(R.styleable.BubbleTextView_iconDisplay, DISPLAY_WORKSPACE);
@@ -581,19 +584,29 @@
return mDotInfo != null;
}
+ /**
+ * Get the icon bounds on the view depending on the layout type.
+ */
public void getIconBounds(Rect outBounds) {
- getIconBounds(this, outBounds, mIconSize);
+ getIconBounds(mIconSize, outBounds);
}
- public static void getIconBounds(View iconView, Rect outBounds, int iconSize) {
- int top = iconView.getPaddingTop();
- int left = (iconView.getWidth() - iconSize) / 2;
- int right = left + iconSize;
- int bottom = top + iconSize;
- outBounds.set(left, top, right, bottom);
+ /**
+ * Get the icon bounds on the view depending on the layout type.
+ */
+ public void getIconBounds(int iconSize, Rect outBounds) {
+ Utilities.setRectToViewCenter(this, iconSize, outBounds);
+ if (mLayoutHorizontal) {
+ if (mIsRtl) {
+ outBounds.offsetTo(getWidth() - iconSize - getPaddingRight(), outBounds.top);
+ } else {
+ outBounds.offsetTo(getPaddingLeft(), outBounds.top);
+ }
+ } else {
+ outBounds.offsetTo(outBounds.left, getPaddingTop());
+ }
}
-
/**
* Sets whether to vertically center the content.
*/
@@ -980,8 +993,7 @@
@Override
public void getWorkspaceVisualDragBounds(Rect bounds) {
- DeviceProfile grid = mActivity.getDeviceProfile();
- BubbleTextView.getIconBounds(this, bounds, grid.iconSizePx);
+ getIconBounds(mIconSize, bounds);
}
private int getIconSizeForDisplay(int display) {
@@ -998,7 +1010,7 @@
}
public void getSourceVisualDragBounds(Rect bounds) {
- BubbleTextView.getIconBounds(this, bounds, getIconSizeForDisplay(mDisplay));
+ getIconBounds(mIconSize, bounds);
}
@Override
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 7a38fe7..d2fe483 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -527,6 +527,18 @@
}
/**
+ * Using the view's bounds and icon size, calculate where the icon bounds will
+ * be if it was positioned at the center of the view.
+ */
+ public static void setRectToViewCenter(View iconView, int iconSize, Rect outBounds) {
+ int top = (iconView.getHeight() - iconSize) / 2;
+ int left = (iconView.getWidth() - iconSize) / 2;
+ int right = left + iconSize;
+ int bottom = top + iconSize;
+ outBounds.set(left, top, right, bottom);
+ }
+
+ /**
* Ensures that a value is within given bounds. Specifically:
* If value is less than lowerBound, return lowerBound; else if value is greater than upperBound,
* return upperBound; else return value unchanged.
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 439df80..98be72a 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -628,7 +628,10 @@
public void drawDot(Canvas canvas) {
if (!mForceHideDot && ((mDotInfo != null && mDotInfo.hasDot()) || mDotScale > 0)) {
Rect iconBounds = mDotParams.iconBounds;
- BubbleTextView.getIconBounds(this, iconBounds, mActivity.getDeviceProfile().iconSizePx);
+
+ Utilities.setRectToViewCenter(this, mActivity.getDeviceProfile().iconSizePx,
+ iconBounds);
+ iconBounds.offsetTo(iconBounds.left, getPaddingTop());
float iconScale = (float) mBackground.previewSize / iconBounds.width();
Utilities.scaleRectAboutCenter(iconBounds, iconScale);