LauncherAccessibilityDelegate.java revision 71b5c0b988a64b3a0613ded5403749bc537ee8a5
171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalpackage com.android.launcher3;
271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.annotation.TargetApi;
471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.os.Build;
571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.os.Bundle;
671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.util.SparseArray;
771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.View;
871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.View.AccessibilityDelegate;
971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.accessibility.AccessibilityNodeInfo;
1071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
1171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport com.android.launcher3.LauncherModel.ScreenPosProvider;
1371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport java.util.ArrayList;
1571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal@TargetApi(Build.VERSION_CODES.LOLLIPOP)
1771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalpublic class LauncherAccessibilityDelegate extends AccessibilityDelegate {
1871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
1971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int REMOVE = R.id.action_remove;
2071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int INFO = R.id.action_info;
2171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int UNINSTALL = R.id.action_uninstall;
2271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public static final int ADD_TO_WORKSPACE = R.id.action_add_to_workspace;
2371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
2471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    private final SparseArray<AccessibilityAction> mActions =
2571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            new SparseArray<AccessibilityAction>();
2671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    private final Launcher mLauncher;
2771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
2871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public LauncherAccessibilityDelegate(Launcher launcher) {
2971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mLauncher = launcher;
3071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
3171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(REMOVE, new AccessibilityAction(REMOVE,
3271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.delete_target_label)));
3371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(INFO, new AccessibilityAction(INFO,
3471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.info_target_label)));
3571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(UNINSTALL, new AccessibilityAction(UNINSTALL,
3671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.delete_target_uninstall_label)));
3771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        mActions.put(ADD_TO_WORKSPACE, new AccessibilityAction(ADD_TO_WORKSPACE,
3871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                launcher.getText(R.string.action_add_to_workspace)));
3971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
4071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
4171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    @Override
4271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
4371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        super.onInitializeAccessibilityNodeInfo(host, info);
4471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if (!(host.getTag() instanceof ItemInfo)) return;
4571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        ItemInfo item = (ItemInfo) host.getTag();
4671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
4771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if ((item instanceof ShortcutInfo)
4871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                || (item instanceof LauncherAppWidgetInfo)
4971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                || (item instanceof FolderInfo)) {
5071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            // Workspace shortcut / widget
5171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            info.addAction(mActions.get(REMOVE));
5271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if ((item instanceof AppInfo) || (item instanceof PendingAddItemInfo)) {
5371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            // App or Widget from customization tray
5471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            if (item instanceof AppInfo) {
5571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                info.addAction(mActions.get(UNINSTALL));
5671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            }
5771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            info.addAction(mActions.get(INFO));
5871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            info.addAction(mActions.get(ADD_TO_WORKSPACE));
5971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
6071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
6171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
6271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    @Override
6371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public boolean performAccessibilityAction(View host, int action, Bundle args) {
6471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if ((host.getTag() instanceof ItemInfo)
6571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                && performAction(host, (ItemInfo) host.getTag(), action)) {
6671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return true;
6771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
6871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        return super.performAccessibilityAction(host, action, args);
6971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
7071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
7171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    public boolean performAction(View host, ItemInfo item, int action) {
7271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        if (action == REMOVE) {
7371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return DeleteDropTarget.removeWorkspaceOrFolderItem(mLauncher, item, host);
7471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == INFO) {
7571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            InfoDropTarget.startDetailsActivityForInfo(item, mLauncher);
7671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return true;
7771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == UNINSTALL) {
7871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            DeleteDropTarget.uninstallApp(mLauncher, (AppInfo) item);
7971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            return true;
8071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        } else if (action == ADD_TO_WORKSPACE) {
8171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            final int preferredPage = mLauncher.getWorkspace().getCurrentPage();
8271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            final ScreenPosProvider screenProvider = new ScreenPosProvider() {
8371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
8471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                @Override
8571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                public int getScreenIndex(ArrayList<Long> screenIDs) {
8671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    return preferredPage;
8771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                }
8871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            };
8971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            if (item instanceof AppInfo) {
9071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                final ArrayList<ItemInfo> addShortcuts = new ArrayList<ItemInfo>();
9171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                addShortcuts.add(((AppInfo) item).makeShortcut());
9271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                mLauncher.showWorkspace(true, new Runnable() {
9371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal
9471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    @Override
9571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    public void run() {
9671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                        mLauncher.getModel().addAndBindAddedWorkspaceApps(
9771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                                mLauncher, addShortcuts, screenProvider, 0, true);
9871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                    }
9971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                });
10071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                return true;
10171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            } else if (item instanceof PendingAddItemInfo) {
10271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                mLauncher.getModel().addAndBindPendingItem(
10371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                        mLauncher, (PendingAddItemInfo) item, screenProvider, 0);
10471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal                return true;
10571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal            }
10671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        }
10771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        return false;
10871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal    }
10971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal}
110