| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.systemui.accessibility.floatingmenu; |
| |
| import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; |
| import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS; |
| |
| import android.content.res.Resources; |
| import android.os.Bundle; |
| import android.view.View; |
| |
| import androidx.annotation.NonNull; |
| import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; |
| import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate; |
| |
| import com.android.systemui.R; |
| |
| /** |
| * An accessibility item delegate for the individual items of the list view in the |
| * {@link MenuView}. |
| */ |
| class MenuItemAccessibilityDelegate extends RecyclerViewAccessibilityDelegate.ItemDelegate { |
| private final MenuAnimationController mAnimationController; |
| |
| MenuItemAccessibilityDelegate(@NonNull RecyclerViewAccessibilityDelegate recyclerViewDelegate, |
| MenuAnimationController animationController) { |
| super(recyclerViewDelegate); |
| mAnimationController = animationController; |
| } |
| |
| @Override |
| public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { |
| super.onInitializeAccessibilityNodeInfo(host, info); |
| |
| final Resources res = host.getResources(); |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveTopLeft = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat(R.id.action_move_top_left, |
| res.getString( |
| R.string.accessibility_floating_button_action_move_top_left)); |
| info.addAction(moveTopLeft); |
| |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveTopRight = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat( |
| R.id.action_move_top_right, |
| res.getString( |
| R.string.accessibility_floating_button_action_move_top_right)); |
| info.addAction(moveTopRight); |
| |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveBottomLeft = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat( |
| R.id.action_move_bottom_left, |
| res.getString( |
| R.string.accessibility_floating_button_action_move_bottom_left)); |
| info.addAction(moveBottomLeft); |
| |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveBottomRight = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat( |
| R.id.action_move_bottom_right, |
| res.getString( |
| R.string.accessibility_floating_button_action_move_bottom_right)); |
| info.addAction(moveBottomRight); |
| |
| final int moveEdgeId = mAnimationController.isMoveToTucked() |
| ? R.id.action_move_out_edge_and_show |
| : R.id.action_move_to_edge_and_hide; |
| final int moveEdgeTextResId = mAnimationController.isMoveToTucked() |
| ? R.string.accessibility_floating_button_action_move_out_edge_and_show |
| : R.string.accessibility_floating_button_action_move_to_edge_and_hide_to_half; |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveToOrOutEdge = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat(moveEdgeId, |
| res.getString(moveEdgeTextResId)); |
| info.addAction(moveToOrOutEdge); |
| |
| final AccessibilityNodeInfoCompat.AccessibilityActionCompat removeMenu = |
| new AccessibilityNodeInfoCompat.AccessibilityActionCompat( |
| R.id.action_remove_menu, |
| res.getString(R.string.accessibility_floating_button_action_remove_menu)); |
| info.addAction(removeMenu); |
| } |
| |
| @Override |
| public boolean performAccessibilityAction(View host, int action, Bundle args) { |
| if (action == ACTION_ACCESSIBILITY_FOCUS) { |
| mAnimationController.fadeInNowIfEnabled(); |
| } |
| |
| if (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS) { |
| mAnimationController.fadeOutIfEnabled(); |
| } |
| |
| if (action == R.id.action_move_top_left) { |
| mAnimationController.moveToTopLeftPosition(); |
| return true; |
| } |
| |
| if (action == R.id.action_move_top_right) { |
| mAnimationController.moveToTopRightPosition(); |
| return true; |
| } |
| |
| if (action == R.id.action_move_bottom_left) { |
| mAnimationController.moveToBottomLeftPosition(); |
| return true; |
| } |
| |
| if (action == R.id.action_move_bottom_right) { |
| mAnimationController.moveToBottomRightPosition(); |
| return true; |
| } |
| |
| if (action == R.id.action_move_to_edge_and_hide) { |
| mAnimationController.moveToEdgeAndHide(); |
| return true; |
| } |
| |
| if (action == R.id.action_move_out_edge_and_show) { |
| mAnimationController.moveOutEdgeAndShow(); |
| return true; |
| } |
| |
| if (action == R.id.action_remove_menu) { |
| mAnimationController.removeMenu(); |
| return true; |
| } |
| |
| return super.performAccessibilityAction(host, action, args); |
| } |
| } |