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