LauncherAccessibilityDelegate.java revision 1a70cef9884270f2f0a760f079a10fdfb1544c98
171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalpackage com.android.launcher3;
271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.annotation.TargetApi;
4c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohenimport android.graphics.Rect;
571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.os.Build;
671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.os.Bundle;
71a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyalimport android.text.TextUtils;
871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.util.SparseArray;
971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.View;
1071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.View.AccessibilityDelegate;
1171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.accessibility.AccessibilityNodeInfo;
1271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
1371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport com.android.launcher3.LauncherModel.ScreenPosProvider;
15091440a9cb9d4f42406631004aa484cbb79214caAdam Cohenimport com.android.launcher3.util.Thunk;
1671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport java.util.ArrayList;
1871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal@TargetApi(Build.VERSION_CODES.LOLLIPOP)
2071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalpublic class LauncherAccessibilityDelegate extends AccessibilityDelegate {
2171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
2271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int REMOVE = R.id.action_remove;
2371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int INFO = R.id.action_info;
2471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int UNINSTALL = R.id.action_uninstall;
2571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int ADD_TO_WORKSPACE = R.id.action_add_to_workspace;
26c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public static final int MOVE = R.id.action_move;
27c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
28c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    enum DragType {
29c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        ICON,
30c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        FOLDER,
31c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        WIDGET
32c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
33c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
34c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public static class DragInfo {
35c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        DragType dragType;
36c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        ItemInfo info;
37c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        View item;
38c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
39c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
40c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    private DragInfo mDragInfo = null;
4171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
4271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    private final SparseArray<AccessibilityAction> mActions =
4371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            new SparseArray<AccessibilityAction>();
44091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk final Launcher mLauncher;
4571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
4671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public LauncherAccessibilityDelegate(Launcher launcher) {
4771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mLauncher = launcher;
4871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
4971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(REMOVE, new AccessibilityAction(REMOVE,
5071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.delete_target_label)));
5171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(INFO, new AccessibilityAction(INFO,
5271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.info_target_label)));
5371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(UNINSTALL, new AccessibilityAction(UNINSTALL,
5471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.delete_target_uninstall_label)));
5571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(ADD_TO_WORKSPACE, new AccessibilityAction(ADD_TO_WORKSPACE,
5671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.action_add_to_workspace)));
57c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mActions.put(MOVE, new AccessibilityAction(MOVE,
58c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen                launcher.getText(R.string.action_move)));
59c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
6071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
6171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
6271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    @Override
6371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
6471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        super.onInitializeAccessibilityNodeInfo(host, info);
6571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if (!(host.getTag() instanceof ItemInfo)) return;
6671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        ItemInfo item = (ItemInfo) host.getTag();
6771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
681a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        if (DeleteDropTarget.supportsDrop(item)) {
691a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            info.addAction(mActions.get(REMOVE));
701a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
711a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        if (UninstallDropTarget.supportsDrop(host.getContext(), item)) {
721a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            info.addAction(mActions.get(UNINSTALL));
731a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
741a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        if (InfoDropTarget.supportsDrop(host.getContext(), item)) {
751a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            info.addAction(mActions.get(INFO));
761a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
771a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal
7871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if ((item instanceof ShortcutInfo)
7971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                || (item instanceof LauncherAppWidgetInfo)
8071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                || (item instanceof FolderInfo)) {
81c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            info.addAction(mActions.get(MOVE));
821a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        } if ((item instanceof AppInfo) || (item instanceof PendingAddItemInfo)) {
8371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            info.addAction(mActions.get(ADD_TO_WORKSPACE));
8471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
8571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
8671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
8771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    @Override
8871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public boolean performAccessibilityAction(View host, int action, Bundle args) {
8971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if ((host.getTag() instanceof ItemInfo)
9071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                && performAction(host, (ItemInfo) host.getTag(), action)) {
9171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return true;
9271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
9371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        return super.performAccessibilityAction(host, action, args);
9471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
9571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
9671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public boolean performAction(View host, ItemInfo item, int action) {
9771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if (action == REMOVE) {
98c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            if (DeleteDropTarget.removeWorkspaceOrFolderItem(mLauncher, item, host)) {
991a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal                announceConfirmation(R.string.item_removed);
100c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen                return true;
101c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            }
102c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            return false;
10371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == INFO) {
10471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            InfoDropTarget.startDetailsActivityForInfo(item, mLauncher);
10571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return true;
10671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == UNINSTALL) {
1071a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            return UninstallDropTarget.startUninstallActivity(mLauncher, item);
108c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        } else if (action == MOVE) {
109c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            beginAccessibleDrag(host, item);
11071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == ADD_TO_WORKSPACE) {
11171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            final int preferredPage = mLauncher.getWorkspace().getCurrentPage();
11271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            final ScreenPosProvider screenProvider = new ScreenPosProvider() {
11371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
11471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                @Override
11571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                public int getScreenIndex(ArrayList<Long> screenIDs) {
11671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    return preferredPage;
11771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                }
11871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            };
11971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            if (item instanceof AppInfo) {
12071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                final ArrayList<ItemInfo> addShortcuts = new ArrayList<ItemInfo>();
12171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                addShortcuts.add(((AppInfo) item).makeShortcut());
12271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                mLauncher.showWorkspace(true, new Runnable() {
12371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    @Override
12471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    public void run() {
12518bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal                        mLauncher.getModel().addAndBindAddedWorkspaceItems(
12671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                                mLauncher, addShortcuts, screenProvider, 0, true);
127c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen                        announceConfirmation(R.string.item_added_to_workspace);
12871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    }
12971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                });
13071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                return true;
13171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            } else if (item instanceof PendingAddItemInfo) {
13271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                mLauncher.getModel().addAndBindPendingItem(
13371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                        mLauncher, (PendingAddItemInfo) item, screenProvider, 0);
134c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen                announceConfirmation(R.string.item_added_to_workspace);
13571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                return true;
13671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            }
13771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
13871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        return false;
13971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
140c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
141091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk void announceConfirmation(int resId) {
142c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        announceConfirmation(mLauncher.getResources().getString(resId));
143c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
144c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
145091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen    @Thunk void announceConfirmation(String confirmation) {
146c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getDragLayer().announceForAccessibility(confirmation);
147c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
148c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
149c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
150c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public boolean isInAccessibleDrag() {
151c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        return mDragInfo != null;
152c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
153c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
154c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public DragInfo getDragInfo() {
155c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        return mDragInfo;
156c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
157c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
1581a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal    /**
1591a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal     * @param clickedTarget the actual view that was clicked
1601a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal     * @param dropLocation relative to {@param clickedTarget}. If provided, its center is used
1611a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal     * as the actual drop location otherwise the views center is used.
1621a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal     */
1631a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal    public void handleAccessibleDrop(View clickedTarget, Rect dropLocation,
164c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            String confirmation) {
165c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        if (!isInAccessibleDrag()) return;
166c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
167c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        int[] loc = new int[2];
1681a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        if (dropLocation == null) {
1691a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            loc[0] = clickedTarget.getWidth() / 2;
1701a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            loc[1] = clickedTarget.getHeight() / 2;
1711a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        } else {
1721a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            loc[0] = dropLocation.centerX();
1731a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            loc[1] = dropLocation.centerY();
1741a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
175c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
1761a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(clickedTarget, loc);
177c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getDragController().completeAccessibleDrag(loc);
178c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
179c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        endAccessibleDrag();
1801a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        if (!TextUtils.isEmpty(confirmation)) {
1811a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal            announceConfirmation(confirmation);
1821a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal        }
183c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
184c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
185c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public void beginAccessibleDrag(View item, ItemInfo info) {
186c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDragInfo = new DragInfo();
187c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDragInfo.info = info;
188c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDragInfo.item = item;
189c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDragInfo.dragType = DragType.ICON;
190c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        if (info instanceof FolderInfo) {
191c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            mDragInfo.dragType = DragType.FOLDER;
192c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        } else if (info instanceof LauncherAppWidgetInfo) {
193c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            mDragInfo.dragType = DragType.WIDGET;
194c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        }
195c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
196c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        CellLayout.CellInfo cellInfo = new CellLayout.CellInfo(item, info);
197c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
198c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        Rect pos = new Rect();
199c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getDragLayer().getDescendantRectRelativeToSelf(item, pos);
200c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
201c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getDragController().prepareAccessibleDrag(pos.centerX(), pos.centerY());
202c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getWorkspace().enableAccessibleDrag(true);
203c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getWorkspace().startDrag(cellInfo, true);
204c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
205c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
206c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    public boolean onBackPressed() {
207c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        if (isInAccessibleDrag()) {
208c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            cancelAccessibleDrag();
209c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen            return true;
210c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        }
211c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        return false;
212c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
213c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
214c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    private void cancelAccessibleDrag() {
215c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getDragController().cancelDrag();
216c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        endAccessibleDrag();
217c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
218c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen
219c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    private void endAccessibleDrag() {
220c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mDragInfo = null;
221c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen        mLauncher.getWorkspace().enableAccessibleDrag(false);
222c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen    }
22371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal}
224