diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index ff70279eab..0baa8f3db7 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -25,6 +25,7 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.shortcuts.DeepShortcutView; import java.util.ArrayList; @@ -46,7 +47,10 @@ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDele @Override public boolean performAction(View host, ItemInfo item, int action) { if (action == ADD_TO_WORKSPACE) { - final ShortcutInfo info = (ShortcutInfo) item; + if (!(host.getParent() instanceof DeepShortcutView)) { + return false; + } + final ShortcutInfo info = ((DeepShortcutView) host.getParent()).getFinalInfo(); final int[] coordinates = new int[2]; final long screenId = findSpaceOnWorkspace(item, coordinates); Runnable onComplete = new Runnable() { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 37b6d04226..e7fc415128 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -21,16 +21,19 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import com.android.launcher3.IconCache; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; +import com.android.launcher3.shortcuts.DeepShortcutsContainer.UnbadgedShortcutInfo; import com.android.launcher3.util.PillRevealOutlineProvider; import com.android.launcher3.util.PillWidthRevealOutlineProvider; @@ -48,6 +51,8 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima private View mIconView; private float mOpenAnimationProgress; + private UnbadgedShortcutInfo mInfo; + public DeepShortcutView(Context context) { this(context, null, 0); } @@ -87,10 +92,36 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima mPillRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); } - public void applyShortcutInfo(ShortcutInfo info) { + /** package private **/ + void applyShortcutInfo(UnbadgedShortcutInfo info, DeepShortcutsContainer container) { + mInfo = info; IconCache cache = LauncherAppState.getInstance().getIconCache(); mBubbleText.applyFromShortcutInfo(info, cache); mIconView.setBackground(mBubbleText.getIcon()); + + // Use the long label as long as it exists and fits. + CharSequence longLabel = info.mDetail.getLongLabel(); + int availableWidth = mBubbleText.getWidth() - mBubbleText.getTotalPaddingLeft() + - mBubbleText.getTotalPaddingRight(); + boolean usingLongLabel = !TextUtils.isEmpty(longLabel) + && mBubbleText.getPaint().measureText(longLabel.toString()) <= availableWidth; + mBubbleText.setText(usingLongLabel ? longLabel : info.mDetail.getShortLabel()); + + // TODO: Add the click handler to this view directly and not the child view. + mBubbleText.setOnClickListener(Launcher.getLauncher(getContext())); + mBubbleText.setOnLongClickListener(container); + mBubbleText.setOnTouchListener(container); + } + + /** + * Returns the shortcut info that is suitable to be added on the homescreen + */ + public ShortcutInfo getFinalInfo() { + ShortcutInfo badged = new ShortcutInfo(mInfo); + // Queue an update task on the worker thread. This ensures that the badged + // shortcut eventually gets its icon updated. + Launcher.getLauncher(getContext()).getModel().updateShortcutInfo(mInfo.mDetail, badged); + return badged; } public View getIconView() { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 2542df6a28..5d9025a697 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -187,12 +187,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } for (int i = 0; i < shortcuts.size(); i++) { final ShortcutInfoCompat shortcut = shortcuts.get(i); - final ShortcutInfo launcherShortcutInfo = - new UnbadgedShortcutInfo(shortcut, mLauncher); - CharSequence shortLabel = shortcut.getShortLabel(); - CharSequence longLabel = shortcut.getLongLabel(); - uiHandler.post(new UpdateShortcutChild(i, launcherShortcutInfo, - shortLabel, longLabel)); + uiHandler.post(new UpdateShortcutChild( + i, new UnbadgedShortcutInfo(shortcut, mLauncher))); } } }); @@ -201,32 +197,17 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC /** Updates the child of this container at the given index based on the given shortcut info. */ private class UpdateShortcutChild implements Runnable { private int mShortcutChildIndex; - private ShortcutInfo mShortcutChildInfo; - private CharSequence mShortLabel; - private CharSequence mLongLabel; + private UnbadgedShortcutInfo mShortcutChildInfo; - public UpdateShortcutChild(int shortcutChildIndex, ShortcutInfo shortcutChildInfo, - CharSequence shortLabel, CharSequence longLabel) { + public UpdateShortcutChild(int shortcutChildIndex, UnbadgedShortcutInfo shortcutChildInfo) { mShortcutChildIndex = shortcutChildIndex; mShortcutChildInfo = shortcutChildInfo; - mShortLabel = shortLabel; - mLongLabel = longLabel; } @Override public void run() { - DeepShortcutView shortcutViewContainer = getShortcutAt(mShortcutChildIndex); - shortcutViewContainer.applyShortcutInfo(mShortcutChildInfo); - BubbleTextView shortcutView = getShortcutAt(mShortcutChildIndex).getBubbleText(); - // Use the long label as long as it exists and fits. - int availableWidth = shortcutView.getWidth() - shortcutView.getTotalPaddingLeft() - - shortcutView.getTotalPaddingRight(); - boolean usingLongLabel = !TextUtils.isEmpty(mLongLabel) - && shortcutView.getPaint().measureText(mLongLabel.toString()) <= availableWidth; - shortcutView.setText(usingLongLabel ? mLongLabel : mShortLabel); - shortcutView.setOnClickListener(mLauncher); - shortcutView.setOnLongClickListener(DeepShortcutsContainer.this); - shortcutView.setOnTouchListener(DeepShortcutsContainer.this); + getShortcutAt(mShortcutChildIndex) + .applyShortcutInfo(mShortcutChildInfo, DeepShortcutsContainer.this); } } @@ -528,14 +509,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC // Return if global dragging is not enabled if (!mLauncher.isDraggingEnabled()) return false; - UnbadgedShortcutInfo unbadgedInfo = (UnbadgedShortcutInfo) v.getTag(); - ShortcutInfo badged = new ShortcutInfo(unbadgedInfo); - // Queue an update task on the worker thread. This ensures that the badged - // shortcut eventually gets its icon updated. - mLauncher.getModel().updateShortcutInfo(unbadgedInfo.mDetail, badged); - // Long clicked on a shortcut. - mDeferContainerRemoval = true; DeepShortcutView sv = (DeepShortcutView) v.getParent(); sv.setWillDrawIcon(false); @@ -545,7 +519,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC mIconShift.y = mIconLastTouchPos.y - mLauncher.getDeviceProfile().iconSizePx; DragView dv = mLauncher.getWorkspace().beginDragShared( - sv.getBubbleText(), this, false, badged, + sv.getBubbleText(), this, false, sv.getFinalInfo(), new ShortcutDragPreviewProvider(sv.getIconView(), mIconShift)); dv.animateShift(-mIconShift.x, -mIconShift.y); @@ -779,8 +753,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC /** * Extension of {@link ShortcutInfo} which does not badge the icons. */ - private static class UnbadgedShortcutInfo extends ShortcutInfo { - private final ShortcutInfoCompat mDetail; + static class UnbadgedShortcutInfo extends ShortcutInfo { + public final ShortcutInfoCompat mDetail; public UnbadgedShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { super(shortcutInfo, context);