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