1 /* 2 * Copyright (C) 2022 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.accessibility.floatingmenu; 18 19 import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; 20 import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS; 21 22 import android.content.res.Resources; 23 import android.os.Bundle; 24 import android.view.View; 25 26 import androidx.annotation.NonNull; 27 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; 28 import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate; 29 30 import com.android.systemui.R; 31 32 /** 33 * An accessibility item delegate for the individual items of the list view in the 34 * {@link MenuView}. 35 */ 36 class MenuItemAccessibilityDelegate extends RecyclerViewAccessibilityDelegate.ItemDelegate { 37 private final MenuAnimationController mAnimationController; 38 MenuItemAccessibilityDelegate(@onNull RecyclerViewAccessibilityDelegate recyclerViewDelegate, MenuAnimationController animationController)39 MenuItemAccessibilityDelegate(@NonNull RecyclerViewAccessibilityDelegate recyclerViewDelegate, 40 MenuAnimationController animationController) { 41 super(recyclerViewDelegate); 42 mAnimationController = animationController; 43 } 44 45 @Override onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info)46 public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { 47 super.onInitializeAccessibilityNodeInfo(host, info); 48 49 final Resources res = host.getResources(); 50 final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveTopLeft = 51 new AccessibilityNodeInfoCompat.AccessibilityActionCompat(R.id.action_move_top_left, 52 res.getString( 53 R.string.accessibility_floating_button_action_move_top_left)); 54 info.addAction(moveTopLeft); 55 56 final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveTopRight = 57 new AccessibilityNodeInfoCompat.AccessibilityActionCompat( 58 R.id.action_move_top_right, 59 res.getString( 60 R.string.accessibility_floating_button_action_move_top_right)); 61 info.addAction(moveTopRight); 62 63 final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveBottomLeft = 64 new AccessibilityNodeInfoCompat.AccessibilityActionCompat( 65 R.id.action_move_bottom_left, 66 res.getString( 67 R.string.accessibility_floating_button_action_move_bottom_left)); 68 info.addAction(moveBottomLeft); 69 70 final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveBottomRight = 71 new AccessibilityNodeInfoCompat.AccessibilityActionCompat( 72 R.id.action_move_bottom_right, 73 res.getString( 74 R.string.accessibility_floating_button_action_move_bottom_right)); 75 info.addAction(moveBottomRight); 76 77 final int moveEdgeId = mAnimationController.isMoveToTucked() 78 ? R.id.action_move_out_edge_and_show 79 : R.id.action_move_to_edge_and_hide; 80 final int moveEdgeTextResId = mAnimationController.isMoveToTucked() 81 ? R.string.accessibility_floating_button_action_move_out_edge_and_show 82 : R.string.accessibility_floating_button_action_move_to_edge_and_hide_to_half; 83 final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveToOrOutEdge = 84 new AccessibilityNodeInfoCompat.AccessibilityActionCompat(moveEdgeId, 85 res.getString(moveEdgeTextResId)); 86 info.addAction(moveToOrOutEdge); 87 88 final AccessibilityNodeInfoCompat.AccessibilityActionCompat removeMenu = 89 new AccessibilityNodeInfoCompat.AccessibilityActionCompat( 90 R.id.action_remove_menu, 91 res.getString(R.string.accessibility_floating_button_action_remove_menu)); 92 info.addAction(removeMenu); 93 } 94 95 @Override performAccessibilityAction(View host, int action, Bundle args)96 public boolean performAccessibilityAction(View host, int action, Bundle args) { 97 if (action == ACTION_ACCESSIBILITY_FOCUS) { 98 mAnimationController.fadeInNowIfEnabled(); 99 } 100 101 if (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS) { 102 mAnimationController.fadeOutIfEnabled(); 103 } 104 105 if (action == R.id.action_move_top_left) { 106 mAnimationController.moveToTopLeftPosition(); 107 return true; 108 } 109 110 if (action == R.id.action_move_top_right) { 111 mAnimationController.moveToTopRightPosition(); 112 return true; 113 } 114 115 if (action == R.id.action_move_bottom_left) { 116 mAnimationController.moveToBottomLeftPosition(); 117 return true; 118 } 119 120 if (action == R.id.action_move_bottom_right) { 121 mAnimationController.moveToBottomRightPosition(); 122 return true; 123 } 124 125 if (action == R.id.action_move_to_edge_and_hide) { 126 mAnimationController.moveToEdgeAndHide(); 127 return true; 128 } 129 130 if (action == R.id.action_move_out_edge_and_show) { 131 mAnimationController.moveOutEdgeAndShow(); 132 return true; 133 } 134 135 if (action == R.id.action_remove_menu) { 136 mAnimationController.removeMenu(); 137 return true; 138 } 139 140 return super.performAccessibilityAction(host, action, args); 141 } 142 } 143