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