Home | History | Annotate | Download | only in views
      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