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 17 package com.android.systemui.recents.views; 18 19 import android.app.ActivityManager; 20 import android.content.Context; 21 import android.graphics.Point; 22 import android.os.Bundle; 23 import android.util.SparseArray; 24 import android.view.View; 25 import android.view.accessibility.AccessibilityNodeInfo; 26 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; 27 28 import com.android.systemui.R; 29 import com.android.systemui.recents.Recents; 30 import com.android.systemui.recents.events.EventBus; 31 import com.android.systemui.recents.events.ui.dragndrop.DragEndEvent; 32 import com.android.systemui.recents.events.ui.dragndrop.DragStartEvent; 33 import com.android.systemui.shared.recents.utilities.Utilities; 34 import com.android.systemui.shared.recents.model.TaskStack; 35 36 public class TaskViewAccessibilityDelegate extends View.AccessibilityDelegate { 37 private static final String TAG = "TaskViewAccessibilityDelegate"; 38 39 private final TaskView mTaskView; 40 41 protected static final int SPLIT_TASK_TOP = R.id.action_split_task_to_top; 42 protected static final int SPLIT_TASK_LEFT = R.id.action_split_task_to_left; 43 protected static final int SPLIT_TASK_RIGHT = R.id.action_split_task_to_right; 44 45 protected final SparseArray<AccessibilityAction> mActions = new SparseArray<>(); 46 47 public TaskViewAccessibilityDelegate(TaskView taskView) { 48 mTaskView = taskView; 49 Context context = taskView.getContext(); 50 mActions.put(SPLIT_TASK_TOP, new AccessibilityAction(SPLIT_TASK_TOP, 51 context.getString(R.string.recents_accessibility_split_screen_top))); 52 mActions.put(SPLIT_TASK_LEFT, new AccessibilityAction(SPLIT_TASK_LEFT, 53 context.getString(R.string.recents_accessibility_split_screen_left))); 54 mActions.put(SPLIT_TASK_RIGHT, new AccessibilityAction(SPLIT_TASK_RIGHT, 55 context.getString(R.string.recents_accessibility_split_screen_right))); 56 } 57 58 @Override 59 public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { 60 super.onInitializeAccessibilityNodeInfo(host, info); 61 if (ActivityManager.supportsSplitScreenMultiWindow(mTaskView.getContext()) 62 && !Recents.getSystemServices().hasDockedTask()) { 63 DockState[] dockStates = Recents.getConfiguration() 64 .getDockStatesForCurrentOrientation(); 65 for (DockState dockState: dockStates) { 66 if (dockState == DockState.TOP) { 67 info.addAction(mActions.get(SPLIT_TASK_TOP)); 68 } else if (dockState == DockState.LEFT) { 69 info.addAction(mActions.get(SPLIT_TASK_LEFT)); 70 } else if (dockState == DockState.RIGHT) { 71 info.addAction(mActions.get(SPLIT_TASK_RIGHT)); 72 } 73 } 74 } 75 } 76 77 @Override 78 public boolean performAccessibilityAction(View host, int action, Bundle args) { 79 if (action == SPLIT_TASK_TOP) { 80 simulateDragIntoMultiwindow(DockState.TOP); 81 } else if (action == SPLIT_TASK_LEFT) { 82 simulateDragIntoMultiwindow(DockState.LEFT); 83 } else if (action == SPLIT_TASK_RIGHT) { 84 simulateDragIntoMultiwindow(DockState.RIGHT); 85 } else { 86 return super.performAccessibilityAction(host, action, args); 87 } 88 return true; 89 } 90 91 /** Simulate a user drag event to split the screen to the respected side */ 92 private void simulateDragIntoMultiwindow(DockState dockState) { 93 EventBus.getDefault().send(new DragStartEvent(mTaskView.getTask(), mTaskView, 94 new Point(0,0), false /* isUserTouchInitiated */)); 95 EventBus.getDefault().send(new DragEndEvent(mTaskView.getTask(), mTaskView, dockState)); 96 } 97 } 98