summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java33
-rw-r--r--src/com/android/launcher3/shortcuts/ShortcutsContainerListener.java31
2 files changed, 38 insertions, 26 deletions
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
index 9f59e06b0..ffa9c26c4 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
@@ -75,7 +75,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
private final int mStartDragThreshold;
private BubbleTextView mDeferredDragIcon;
private int mActivePointerId;
- private Point mTouchDown = null;
+ private int[] mTouchDown = null;
private DragView mDragView;
private float mLastX, mLastY;
private float mDistanceDragged = 0;
@@ -236,7 +236,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
/**
* Orients this container above or below the given icon, aligning with the left or right.
*
- * These are the preferred orientations, in order:
+ * These are the preferred orientations, in order (RTL prefers right-aligned over left):
* - Above and left-aligned
* - Above and right-aligned
* - Below and left-aligned
@@ -253,16 +253,25 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
DragLayer dragLayer = mLauncher.getDragLayer();
dragLayer.getDescendantRectRelativeToSelf(icon, mTempRect);
- // Align left and above by default.
- int x = mTempRect.left + icon.getPaddingLeft();
- int y = mTempRect.top - height;
Rect insets = dragLayer.getInsets();
- mIsLeftAligned = x + width < dragLayer.getRight() - insets.right;
- if (!mIsLeftAligned) {
- x = mTempRect.right - width - icon.getPaddingRight();
+ // Align left (right in RTL) if there is room.
+ boolean isRtl = Utilities.isRtl(getResources());
+ int leftAlignedX = mTempRect.left + icon.getPaddingLeft();
+ int rightAlignedX = mTempRect.right - width - icon.getPaddingRight();
+ int x = leftAlignedX;
+ boolean canBeLeftAligned = leftAlignedX + width < dragLayer.getRight() - insets.right;
+ boolean canBeRightAligned = rightAlignedX > dragLayer.getLeft() + insets.left;
+ if (!canBeLeftAligned || (isRtl && canBeRightAligned)) {
+ x = rightAlignedX;
+ }
+ mIsLeftAligned = x == leftAlignedX;
+ if (isRtl) {
+ x -= dragLayer.getWidth() - width;
}
+ // Open above icon if there is room.
+ int y = mTempRect.top - height;
mIsAboveIcon = mTempRect.top - height > dragLayer.getTop() + insets.top;
if (!mIsAboveIcon) {
y = mTempRect.bottom;
@@ -304,7 +313,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
mDragView.show(motionDownX, motionDownY);
}
- public boolean onForwardedEvent(MotionEvent ev, int activePointerId, Point touchDown) {
+ public boolean onForwardedEvent(MotionEvent ev, int activePointerId, int[] touchDown) {
mActivePointerId = activePointerId;
mTouchDown = touchDown;
return dispatchTouchEvent(ev);
@@ -398,9 +407,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
*/
private boolean shouldStartDeferredDrag(int x, int y, boolean containerContainsTouch) {
int closestEdgeY = mIsAboveIcon ? getMeasuredHeight() : 0;
- double distToEdge = Math.abs(mTouchDown.y - closestEdgeY);
- double newDistToEdge = Math.hypot(x - mTouchDown.x, y - closestEdgeY);
- return !containerContainsTouch && (newDistToEdge - distToEdge > mStartDragThreshold);
+ double distToEdge = Math.abs(mTouchDown[1] - closestEdgeY);
+ double newDistToEdge = Math.hypot(x - mTouchDown[0], y - closestEdgeY);
+ return !containerContainsTouch && (newDistToEdge - distToEdge > mStartDragThreshold);
}
public void cleanupDeferredDrag() {
diff --git a/src/com/android/launcher3/shortcuts/ShortcutsContainerListener.java b/src/com/android/launcher3/shortcuts/ShortcutsContainerListener.java
index 63c836367..962fbac83 100644
--- a/src/com/android/launcher3/shortcuts/ShortcutsContainerListener.java
+++ b/src/com/android/launcher3/shortcuts/ShortcutsContainerListener.java
@@ -1,7 +1,6 @@
package com.android.launcher3.shortcuts;
import android.content.Context;
-import android.graphics.Point;
import android.os.SystemClock;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
@@ -53,9 +52,9 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
private Launcher mLauncher;
private DragLayer mDragLayer;
- private MotionEvent mTouchDownEvent;
- /** The coordinates of the touch down, relative do the shortcuts container. */
- private final Point mTouchDown;
+ /** The coordinates of the touch down, relative to the shortcuts container. */
+ private final int[] mTouchDown;
+ private boolean mHasMappedTouchDownToContainerCoord;
public ShortcutsContainerListener(BubbleTextView icon) {
mSrcIcon = icon;
@@ -68,7 +67,7 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
mLauncher = Launcher.getLauncher(mSrcIcon.getContext());
mDragLayer = mLauncher.getDragLayer();
- mTouchDown = new Point();
+ mTouchDown = new int[2];
}
@Override
@@ -79,10 +78,10 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
- if (mTouchDownEvent != null) {
- mTouchDownEvent.recycle();
- }
- mTouchDownEvent = MotionEvent.obtainNoHistory(event);
+ mTouchDown[0] = (int) event.getX();
+ mTouchDown[1] = (int) event.getY();
+ mDragLayer.getDescendantCoordRelativeToSelf(mSrcIcon, mTouchDown);
+ mHasMappedTouchDownToContainerCoord = false;
}
final boolean wasForwarding = mForwarding;
@@ -140,10 +139,6 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
deepShortcutsContainer.populateAndShow(mSrcIcon, ids);
mSrcIcon.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
-
- // Convert touch down event to the container's coordinates.
- Utilities.translateEventCoordinates(mSrcIcon, deepShortcutsContainer, mTouchDownEvent);
- mTouchDown.set((int) mTouchDownEvent.getX(), (int) mTouchDownEvent.getY());
return true;
}
return false;
@@ -257,13 +252,21 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
if (dst == null) {
return false;
}
+ if (!dst.isLaidOut()) {
+ return true;
+ }
// Convert event to destination-local coordinates.
final MotionEvent dstEvent = MotionEvent.obtainNoHistory(srcEvent);
Utilities.translateEventCoordinates(src, dst, dstEvent);
+ // Convert touch down event to destination-local coordinates.
+ if (!mHasMappedTouchDownToContainerCoord) {
+ mDragLayer.mapCoordInSelfToDescendent(dst, mTouchDown);
+ mHasMappedTouchDownToContainerCoord = true;
+ }
+
// Forward converted event to destination view, then recycle it.
- // TODO: don't create objects in onForwardedEvent.
final boolean handled = dst.onForwardedEvent(dstEvent, mActivePointerId, mTouchDown);
dstEvent.recycle();