/* * Copyright (C) 2021 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 android.content.res.Resources; import android.graphics.Rect; 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; import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuView.ShapeType; import java.lang.ref.WeakReference; /** * An accessibility item delegate for the individual items of the list view * {@link AccessibilityFloatingMenuView}. */ final class ItemDelegateCompat extends RecyclerViewAccessibilityDelegate.ItemDelegate { private final WeakReference mMenuViewRef; ItemDelegateCompat(@NonNull RecyclerViewAccessibilityDelegate recyclerViewDelegate, AccessibilityFloatingMenuView menuView) { super(recyclerViewDelegate); this.mMenuViewRef = new WeakReference<>(menuView); } @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { super.onInitializeAccessibilityNodeInfo(host, info); if (mMenuViewRef.get() == null) { return; } final AccessibilityFloatingMenuView menuView = mMenuViewRef.get(); final Resources res = menuView.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 = menuView.isOvalShape() ? R.id.action_move_to_edge_and_hide : R.id.action_move_out_edge_and_show; final int moveEdgeTextResId = menuView.isOvalShape() ? R.string.accessibility_floating_button_action_move_to_edge_and_hide_to_half : R.string.accessibility_floating_button_action_move_out_edge_and_show; final AccessibilityNodeInfoCompat.AccessibilityActionCompat moveToOrOutEdge = new AccessibilityNodeInfoCompat.AccessibilityActionCompat(moveEdgeId, res.getString(moveEdgeTextResId)); info.addAction(moveToOrOutEdge); } @Override public boolean performAccessibilityAction(View host, int action, Bundle args) { if (mMenuViewRef.get() == null) { return super.performAccessibilityAction(host, action, args); } final AccessibilityFloatingMenuView menuView = mMenuViewRef.get(); menuView.fadeIn(); final Rect bounds = menuView.getAvailableBounds(); if (action == R.id.action_move_top_left) { menuView.setShapeType(ShapeType.OVAL); menuView.snapToLocation(bounds.left, bounds.top); return true; } if (action == R.id.action_move_top_right) { menuView.setShapeType(ShapeType.OVAL); menuView.snapToLocation(bounds.right, bounds.top); return true; } if (action == R.id.action_move_bottom_left) { menuView.setShapeType(ShapeType.OVAL); menuView.snapToLocation(bounds.left, bounds.bottom); return true; } if (action == R.id.action_move_bottom_right) { menuView.setShapeType(ShapeType.OVAL); menuView.snapToLocation(bounds.right, bounds.bottom); return true; } if (action == R.id.action_move_to_edge_and_hide) { menuView.setShapeType(ShapeType.HALF_OVAL); return true; } if (action == R.id.action_move_out_edge_and_show) { menuView.setShapeType(ShapeType.OVAL); return true; } return super.performAccessibilityAction(host, action, args); } }