184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan/* 284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * Copyright (C) 2016 The Android Open Source Project 384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * 484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * Licensed under the Apache License, Version 2.0 (the "License"); 584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * you may not use this file except in compliance with the License. 684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * You may obtain a copy of the License at 784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * 884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * http://www.apache.org/licenses/LICENSE-2.0 984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * 1084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * Unless required by applicable law or agreed to in writing, software 1184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * distributed under the License is distributed on an "AS IS" BASIS, 1284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * See the License for the specific language governing permissions and 1484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * limitations under the License. 1584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan */ 1684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 17bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKaypackage com.android.documentsui; 1884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 19d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport static com.android.documentsui.base.Shared.DEBUG; 2084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 2184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.annotation.IdRes; 2284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.annotation.Nullable; 2384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.app.Activity; 2484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.text.TextUtils; 2584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.util.Log; 2684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.view.ActionMode; 2784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.view.HapticFeedbackConstants; 2884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.view.Menu; 2984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.view.MenuItem; 3084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport android.view.View; 3184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 325b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.MenuManager.SelectionDetails; 33c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKayimport com.android.documentsui.base.ConfirmationCallback; 34c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKayimport com.android.documentsui.base.ConfirmationCallback.Result; 35bff980add478a229b6923f6202152fb792104da0Steve McKayimport com.android.documentsui.base.EventHandler; 36d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.Menus; 374f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.Selection; 384f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.SelectionManager; 395b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.ui.MessageBuilder; 4084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 4184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport java.util.function.Consumer; 4284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tanimport java.util.function.IntConsumer; 4384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 4484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan/** 4584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan * A controller that listens to selection changes and manages life cycles of action modes. 4684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan */ 47bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKaypublic class ActionModeController 48bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay implements SelectionManager.Callback, ActionMode.Callback, ActionModeAddons { 4984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 5084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private static final String TAG = "ActionModeController"; 5184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 525b0a2c187a9e446b683687817d22cbe443585223Steve McKay private final Activity mActivity; 534f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay private final SelectionManager mSelectionMgr; 5484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private final MenuManager mMenuManager; 555b0a2c187a9e446b683687817d22cbe443585223Steve McKay private final MessageBuilder mMessages; 5684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 57bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay private final ContentScope mScope = new ContentScope(); 5884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private final Selection mSelected = new Selection(); 5984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 6084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private @Nullable ActionMode mActionMode; 6184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private @Nullable Menu mMenu; 6284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 635b0a2c187a9e446b683687817d22cbe443585223Steve McKay public ActionModeController( 645b0a2c187a9e446b683687817d22cbe443585223Steve McKay Activity activity, 654f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay SelectionManager selectionMgr, 6684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan MenuManager menuManager, 675b0a2c187a9e446b683687817d22cbe443585223Steve McKay MessageBuilder messages) { 685b0a2c187a9e446b683687817d22cbe443585223Steve McKay 695b0a2c187a9e446b683687817d22cbe443585223Steve McKay mActivity = activity; 7084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mSelectionMgr = selectionMgr; 7184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mMenuManager = menuManager; 725b0a2c187a9e446b683687817d22cbe443585223Steve McKay mMessages = messages; 7384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 7484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 7584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 7684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public void onSelectionChanged() { 7784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mSelectionMgr.getSelection(mSelected); 7884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mSelected.size() > 0) { 7984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode == null) { 8084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (DEBUG) Log.d(TAG, "Starting action mode."); 815b0a2c187a9e446b683687817d22cbe443585223Steve McKay mActionMode = mActivity.startActionMode(this); 8284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 8384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan updateActionMenu(); 8484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } else { 8584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode != null) { 8684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (DEBUG) Log.d(TAG, "Finishing action mode."); 8784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mActionMode.finish(); 8884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 8984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 9084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 9184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode != null) { 9284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan assert(!mSelected.isEmpty()); 935b0a2c187a9e446b683687817d22cbe443585223Steve McKay final String title = mMessages.getQuantityString( 9484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan R.plurals.elements_selected, mSelected.size()); 9584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mActionMode.setTitle(title); 96c8739d979a0e3ca87a723cf8c499d163b27e1123Ben Lin mActivity.getWindow().setTitle(title); 9784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 9884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 9984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 10084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 10184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public void onSelectionRestored() { 10284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mSelectionMgr.getSelection(mSelected); 10384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mSelected.size() > 0) { 10484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode == null) { 10584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (DEBUG) Log.d(TAG, "Starting action mode."); 1065b0a2c187a9e446b683687817d22cbe443585223Steve McKay mActionMode = mActivity.startActionMode(this); 10784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 10884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan updateActionMenu(); 10984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } else { 11084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode != null) { 11184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (DEBUG) Log.d(TAG, "Finishing action mode."); 11284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mActionMode.finish(); 11384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 11484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 11584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 11684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (mActionMode != null) { 11784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan assert(!mSelected.isEmpty()); 1185b0a2c187a9e446b683687817d22cbe443585223Steve McKay final String title = mMessages.getQuantityString( 11984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan R.plurals.elements_selected, mSelected.size()); 12084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mActionMode.setTitle(title); 121c8739d979a0e3ca87a723cf8c499d163b27e1123Ben Lin mActivity.getWindow().setTitle(title); 12284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 12384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 12484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 12584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan // Called when the user exits the action mode 12684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 12784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public void onDestroyActionMode(ActionMode mode) { 1284f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay if (mActionMode == null) { 1294f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay if (DEBUG) Log.w(TAG, "Received call to destroy action mode on alien mode object."); 1304f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay } 1314f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay 1324f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay assert(mActionMode.equals(mode)); 1334f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay 13484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (DEBUG) Log.d(TAG, "Handling action mode destroyed."); 13584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mActionMode = null; 1364f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay mMenu = null; 1374f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay 13884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan // clear selection 13984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mSelectionMgr.clearSelection(); 14084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mSelected.clear(); 14184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 142859e42fc770d6046437e5e847db691368041f58bBen Lin // Reset window title back to activity title, i.e. Root name 143859e42fc770d6046437e5e847db691368041f58bBen Lin mActivity.getWindow().setTitle(mActivity.getTitle()); 144859e42fc770d6046437e5e847db691368041f58bBen Lin 14584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan // Re-enable TalkBack for the toolbars, as they are no longer covered by action mode. 146bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mScope.accessibilityImportanceSetter.setAccessibilityImportance( 14784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, R.id.toolbar, R.id.roots_toolbar); 14884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 14984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 15084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 15184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public boolean onCreateActionMode(ActionMode mode, Menu menu) { 15284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan int size = mSelectionMgr.getSelection().size(); 153ff7f3aeec1b4fc7e0b8ddb0e8b6b6e105140f68eBen Lin mode.getMenuInflater().inflate(R.menu.action_mode_menu, menu); 15484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mode.setTitle(TextUtils.formatSelectedCount(size)); 15584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 15684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (size > 0) { 15784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 15884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan // Hide the toolbars if action mode is enabled, so TalkBack doesn't navigate to 15984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan // these controls when using linear navigation. 160bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mScope.accessibilityImportanceSetter.setAccessibilityImportance( 16184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, 16284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan R.id.toolbar, 16384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan R.id.roots_toolbar); 16484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan return true; 16584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 16684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 16784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan return false; 16884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 16984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 17084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 17184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 17284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan mMenu = menu; 17384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan updateActionMenu(); 17484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan return true; 17584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 17684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 17784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private void updateActionMenu() { 17884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan assert(mMenu != null); 179bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mMenuManager.updateActionMenu(mMenu, mScope.selectionDetails); 18084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan Menus.disableHiddenItems(mMenu); 18184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 18284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 18384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @Override 18484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 185bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay return mScope.menuItemClicker.accept(item); 18684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 18784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 18884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private static void setImportantForAccessibility( 18984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan Activity activity, int accessibilityImportance, @IdRes int[] viewIds) { 19084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan for (final int id : viewIds) { 19184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan final View v = activity.findViewById(id); 19284bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan if (v != null) { 19384bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan v.setImportantForAccessibility(accessibilityImportance); 19484bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 19584bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 19684bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 19784bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan 19884bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan @FunctionalInterface 19984bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan private interface AccessibilityImportanceSetter { 20084bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan void setAccessibilityImportance(int accessibilityImportance, @IdRes int... viewIds); 20184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan } 202c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay 203bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay @Override 204bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay public void finishActionMode() { 205bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay if (mActionMode != null) { 206bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mActionMode.finish(); 207bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mActionMode = null; 208bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay } else { 209bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay Log.w(TAG, "Tried to finish a null action mode."); 210bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay } 211bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay } 212bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay 213bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay @Override 214c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay public void finishOnConfirmed(@Result int code) { 215c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay if (code == ConfirmationCallback.CONFIRM) { 216c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay finishActionMode(); 217c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay } 218c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay } 2195b0a2c187a9e446b683687817d22cbe443585223Steve McKay 2205b0a2c187a9e446b683687817d22cbe443585223Steve McKay public ActionModeController reset( 22111a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin SelectionDetails selectionDetails, EventHandler<MenuItem> menuItemClicker) { 2225b0a2c187a9e446b683687817d22cbe443585223Steve McKay assert(mActionMode == null); 2235b0a2c187a9e446b683687817d22cbe443585223Steve McKay assert(mMenu == null); 2245b0a2c187a9e446b683687817d22cbe443585223Steve McKay 225bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mScope.menuItemClicker = menuItemClicker; 226bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mScope.selectionDetails = selectionDetails; 227bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay mScope.accessibilityImportanceSetter = 2285b0a2c187a9e446b683687817d22cbe443585223Steve McKay (int accessibilityImportance, @IdRes int[] viewIds) -> { 2295b0a2c187a9e446b683687817d22cbe443585223Steve McKay setImportantForAccessibility( 2305b0a2c187a9e446b683687817d22cbe443585223Steve McKay mActivity, accessibilityImportance, viewIds); 2315b0a2c187a9e446b683687817d22cbe443585223Steve McKay }; 2325b0a2c187a9e446b683687817d22cbe443585223Steve McKay 2335b0a2c187a9e446b683687817d22cbe443585223Steve McKay return this; 2345b0a2c187a9e446b683687817d22cbe443585223Steve McKay } 2355b0a2c187a9e446b683687817d22cbe443585223Steve McKay 236bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay private static final class ContentScope { 2375b0a2c187a9e446b683687817d22cbe443585223Steve McKay private EventHandler<MenuItem> menuItemClicker; 2385b0a2c187a9e446b683687817d22cbe443585223Steve McKay private SelectionDetails selectionDetails; 2395b0a2c187a9e446b683687817d22cbe443585223Steve McKay private AccessibilityImportanceSetter accessibilityImportanceSetter; 2405b0a2c187a9e446b683687817d22cbe443585223Steve McKay } 24184bd0f13bd02ea26acc937b00c050884dc7546efGarfield Tan} 242