TaskViewAccessibilityDelegate.java revision b7035f3a4738efdf40dc0ad06f19303ffcd784f7
1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.recents.views;
18
19import android.app.ActivityManager;
20import android.content.Context;
21import android.content.res.Configuration;
22import android.graphics.Point;
23import android.os.Bundle;
24import android.util.SparseArray;
25import android.view.View;
26import android.view.accessibility.AccessibilityNodeInfo;
27import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
28
29import com.android.systemui.R;
30import com.android.systemui.recents.Recents;
31import com.android.systemui.recents.events.EventBus;
32import com.android.systemui.recents.events.ui.dragndrop.DragEndEvent;
33import com.android.systemui.recents.events.ui.dragndrop.DragStartEvent;
34import com.android.systemui.recents.misc.Utilities;
35import com.android.systemui.recents.model.TaskStack;
36
37public class TaskViewAccessibilityDelegate extends View.AccessibilityDelegate {
38    private static final String TAG = "TaskViewAccessibilityDelegate";
39
40    private final TaskView mTaskView;
41
42    protected static final int OPEN = R.id.action_open;
43    protected static final int DIMISS = R.id.action_dimiss;
44    protected static final int SPLIT_TASK_TOP = R.id.action_split_task_to_top;
45    protected static final int SPLIT_TASK_LEFT = R.id.action_split_task_to_left;
46    protected static final int SPLIT_TASK_RIGHT = R.id.action_split_task_to_right;
47
48    protected final SparseArray<AccessibilityAction> mActions = new SparseArray<>();
49
50    public TaskViewAccessibilityDelegate(TaskView taskView) {
51        mTaskView = taskView;
52        Context context = taskView.getContext();
53        mActions.put(OPEN, new AccessibilityAction(OPEN,
54                context.getString(R.string.recents_accessibility_open)));
55        mActions.put(DIMISS, new AccessibilityAction(DIMISS,
56                context.getString(R.string.recents_accessibility_dismissed)));
57        mActions.put(SPLIT_TASK_TOP, new AccessibilityAction(SPLIT_TASK_TOP,
58                context.getString(R.string.recents_accessibility_split_screen_top)));
59        mActions.put(SPLIT_TASK_LEFT, new AccessibilityAction(SPLIT_TASK_LEFT,
60                context.getString(R.string.recents_accessibility_split_screen_left)));
61        mActions.put(SPLIT_TASK_RIGHT, new AccessibilityAction(SPLIT_TASK_RIGHT,
62                context.getString(R.string.recents_accessibility_split_screen_right)));
63    }
64
65    @Override
66    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
67        super.onInitializeAccessibilityNodeInfo(host, info);
68        info.addAction(mActions.get(OPEN));
69        info.addAction(mActions.get(DIMISS));
70        if (ActivityManager.supportsSplitScreenMultiWindow()
71                && !Recents.getSystemServices().hasDockedTask()) {
72            TaskStack.DockState[] dockStates = Recents.getConfiguration()
73                    .getDockStatesForCurrentOrientation();
74            for (TaskStack.DockState dockState: dockStates) {
75                if (dockState == TaskStack.DockState.TOP) {
76                    info.addAction(mActions.get(SPLIT_TASK_TOP));
77                } else if (dockState == TaskStack.DockState.LEFT) {
78                    info.addAction(mActions.get(SPLIT_TASK_LEFT));
79                } else if (dockState == TaskStack.DockState.RIGHT) {
80                    info.addAction(mActions.get(SPLIT_TASK_RIGHT));
81                }
82            }
83        }
84    }
85
86    @Override
87    public boolean performAccessibilityAction(View host, int action, Bundle args) {
88        if (action == OPEN) {
89            mTaskView.onClick(host);
90        } else if (action == DIMISS) {
91            mTaskView.dismissTask();
92        } else if (action == SPLIT_TASK_TOP) {
93            simulateDragIntoMultiwindow(TaskStack.DockState.TOP);
94        } else if (action == SPLIT_TASK_LEFT) {
95            simulateDragIntoMultiwindow(TaskStack.DockState.LEFT);
96        } else if (action == SPLIT_TASK_RIGHT) {
97            simulateDragIntoMultiwindow(TaskStack.DockState.RIGHT);
98        } else {
99            return super.performAccessibilityAction(host, action, args);
100        }
101        return true;
102    }
103
104    /** Simulate a user drag event to split the screen to the respected side */
105    private void simulateDragIntoMultiwindow(TaskStack.DockState dockState) {
106        int orientation = Utilities.getAppConfiguration(mTaskView.getContext()).orientation;
107        EventBus.getDefault().send(new DragStartEvent(mTaskView.getTask(), mTaskView,
108                new Point(0,0), false /* isUserTouchInitiated */));
109        EventBus.getDefault().send(new DragEndEvent(mTaskView.getTask(), mTaskView, dockState));
110    }
111}
112