blob: 505cb3727ed561eb85f8a3e746c96c96dab1d282 [file] [log] [blame]
Ben Lin7c35b032016-05-31 13:24:01 -07001/*
2 * Copyright (C) 2016 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
17package com.android.documentsui;
18
Steve McKay92ae43d2016-11-08 12:06:58 -080019import android.view.KeyboardShortcutGroup;
Ben Lin7c35b032016-05-31 13:24:01 -070020import android.view.Menu;
Garfield Tan239ab972016-09-16 13:33:48 -070021import android.view.MenuInflater;
Ben Linebf2a172016-06-03 13:46:52 -070022import android.view.MenuItem;
Garfield Tan239ab972016-09-16 13:33:48 -070023import android.view.View;
Ben Lin7c35b032016-05-31 13:24:01 -070024
Tony Huangfdbab1a2019-04-08 18:10:27 +080025import androidx.annotation.VisibleForTesting;
26import androidx.fragment.app.Fragment;
27
Ben Lin8e912582016-09-23 14:25:14 -070028import com.android.documentsui.base.DocumentInfo;
Steve McKayd9caa6a2016-09-15 16:36:45 -070029import com.android.documentsui.base.Menus;
Steve McKayd0805062016-09-15 14:30:38 -070030import com.android.documentsui.base.RootInfo;
Steve McKayd9caa6a2016-09-15 16:36:45 -070031import com.android.documentsui.base.State;
Garfield Tan06c4b112016-09-14 11:05:58 -070032import com.android.documentsui.dirlist.DirectoryFragment;
Steve McKay3a268232016-10-19 11:15:47 -070033import com.android.documentsui.queries.SearchViewManager;
Garfield Tanb285b402016-09-21 17:12:18 -070034import com.android.documentsui.sidebar.RootsFragment;
Ben Lin5668b862016-06-28 17:12:52 -070035
Steve McKay92ae43d2016-11-08 12:06:58 -080036import java.util.List;
37import java.util.function.IntFunction;
Tony Huang76c6c9d2019-08-12 18:04:06 +080038import java.util.function.IntSupplier;
Steve McKay92ae43d2016-11-08 12:06:58 -080039
Ben Linebf2a172016-06-03 13:46:52 -070040public abstract class MenuManager {
shawnlindbfc9c22018-09-25 14:26:52 +080041 private final static String TAG = "MenuManager";
Ben Lin7c35b032016-05-31 13:24:01 -070042
Tony Huang76c6c9d2019-08-12 18:04:06 +080043 protected final SearchViewManager mSearchManager;
44 protected final State mState;
45 protected final DirectoryDetails mDirDetails;
46 protected final IntSupplier mFilesCountSupplier;
Ben Lin25679912016-06-17 11:48:57 -070047
shawnlindbfc9c22018-09-25 14:26:52 +080048 protected Menu mOptionMenu;
49
Steve McKaye5d6ca22016-09-19 20:27:24 -070050 public MenuManager(
51 SearchViewManager searchManager,
52 State displayState,
Tony Huang76c6c9d2019-08-12 18:04:06 +080053 DirectoryDetails dirDetails,
54 IntSupplier filesCountSupplier) {
Ben Lin25679912016-06-17 11:48:57 -070055 mSearchManager = searchManager;
56 mState = displayState;
Steve McKaye5d6ca22016-09-19 20:27:24 -070057 mDirDetails = dirDetails;
Tony Huang76c6c9d2019-08-12 18:04:06 +080058 mFilesCountSupplier = filesCountSupplier;
Ben Lin25679912016-06-17 11:48:57 -070059 }
60
Garfield Tan06c4b112016-09-14 11:05:58 -070061 /** @see ActionModeController */
Ben Linebf2a172016-06-03 13:46:52 -070062 public void updateActionMenu(Menu menu, SelectionDetails selection) {
Ben Linff7f3ae2017-04-25 16:08:52 -070063 updateOpenWith(menu.findItem(R.id.action_menu_open_with), selection);
64 updateDelete(menu.findItem(R.id.action_menu_delete), selection);
65 updateShare(menu.findItem(R.id.action_menu_share), selection);
66 updateRename(menu.findItem(R.id.action_menu_rename), selection);
Bill Linfd235cf2018-05-23 18:48:31 +080067 updateSelect(menu.findItem(R.id.action_menu_select), selection);
Tony Huang76c6c9d2019-08-12 18:04:06 +080068 updateSelectAll(menu.findItem(R.id.action_menu_select_all), selection);
69 updateDeselectAll(menu.findItem(R.id.action_menu_deselect_all), selection);
Ben Linff7f3ae2017-04-25 16:08:52 -070070 updateMoveTo(menu.findItem(R.id.action_menu_move_to), selection);
71 updateCopyTo(menu.findItem(R.id.action_menu_copy_to), selection);
72 updateCompress(menu.findItem(R.id.action_menu_compress), selection);
73 updateExtractTo(menu.findItem(R.id.action_menu_extract_to), selection);
Steve McKay0c7ad032017-08-09 11:50:10 -070074 updateInspect(menu.findItem(R.id.action_menu_inspect), selection);
Ben Linff7f3ae2017-04-25 16:08:52 -070075 updateViewInOwner(menu.findItem(R.id.action_menu_view_in_owner), selection);
Tony Huang243cf9c2018-10-16 16:15:18 +080076 updateSort(menu.findItem(R.id.action_menu_sort));
Ben Lin7c35b032016-05-31 13:24:01 -070077
Ben Linebf2a172016-06-03 13:46:52 -070078 Menus.disableHiddenItems(menu);
79 }
Ben Lin7c35b032016-05-31 13:24:01 -070080
Garfield Tan06c4b112016-09-14 11:05:58 -070081 /** @see BaseActivity#onPrepareOptionsMenu */
Steve McKaye5d6ca22016-09-19 20:27:24 -070082 public void updateOptionMenu(Menu menu) {
shawnlindbfc9c22018-09-25 14:26:52 +080083 mOptionMenu = menu;
84 updateOptionMenu();
85 }
86
87 public void updateOptionMenu() {
88 if (mOptionMenu == null) {
89 return;
90 }
91 updateCreateDir(mOptionMenu.findItem(R.id.option_menu_create_dir));
92 updateSettings(mOptionMenu.findItem(R.id.option_menu_settings));
93 updateSelectAll(mOptionMenu.findItem(R.id.option_menu_select_all));
94 updateNewWindow(mOptionMenu.findItem(R.id.option_menu_new_window));
shawnlindbfc9c22018-09-25 14:26:52 +080095 updateAdvanced(mOptionMenu.findItem(R.id.option_menu_advanced));
96 updateDebug(mOptionMenu.findItem(R.id.option_menu_debug));
97 updateInspect(mOptionMenu.findItem(R.id.option_menu_inspect));
Tony Huang243cf9c2018-10-16 16:15:18 +080098 updateSort(mOptionMenu.findItem(R.id.option_menu_sort));
Tony Huang94fc11a2019-10-30 18:00:20 +080099 updateLauncher(mOptionMenu.findItem(R.id.option_menu_launcher));
Tony Huang243cf9c2018-10-16 16:15:18 +0800100
shawnlindbfc9c22018-09-25 14:26:52 +0800101 Menus.disableHiddenItems(mOptionMenu);
shawnlin142e27b2018-10-03 16:40:24 +0800102 mSearchManager.updateMenu();
Ben Linebf2a172016-06-03 13:46:52 -0700103 }
Ben Lin7c35b032016-05-31 13:24:01 -0700104
Tony Huangadce72b2019-01-31 15:21:55 +0800105 public void updateSubMenu(Menu menu) {
106 updateModePicker(menu.findItem(R.id.sub_menu_grid), menu.findItem(R.id.sub_menu_list));
107 }
108
Tony Huang166cd7c2019-03-11 16:31:57 +0800109 public void updateModel(Model model) {}
110
Garfield Tan06c4b112016-09-14 11:05:58 -0700111 /**
Garfield Tan239ab972016-09-16 13:33:48 -0700112 * Called when we needs {@link MenuManager} to ask Android to show context menu for us.
113 * {@link MenuManager} can choose to defeat this request.
114 *
115 * {@link #inflateContextMenuForDocs} and {@link #inflateContextMenuForContainer} are called
116 * afterwards when Android asks us to provide the content of context menus, so they're not
117 * correct locations to suppress context menus.
118 */
119 public void showContextMenu(Fragment f, View v, float x, float y) {
120 // Pickers don't have any context menu at this moment.
121 }
122
Tony Huang76c6c9d2019-08-12 18:04:06 +0800123 /**
124 * Called when container context menu needs to be inflated.
125 *
126 * @param menu context menu from activity or fragment
127 * @param inflater the MenuInflater
128 * @param selectionDetails selection of files
129 */
130 public void inflateContextMenuForContainer(
131 Menu menu, MenuInflater inflater, SelectionDetails selectionDetails) {
Garfield Tan239ab972016-09-16 13:33:48 -0700132 throw new UnsupportedOperationException("Pickers don't allow context menu.");
133 }
134
135 public void inflateContextMenuForDocs(
136 Menu menu, MenuInflater inflater, SelectionDetails selectionDetails) {
137 throw new UnsupportedOperationException("Pickers don't allow context menu.");
138 }
139
140 /**
Garfield Tan06c4b112016-09-14 11:05:58 -0700141 * @see DirectoryFragment#onCreateContextMenu
Ben Linb2dfa122016-08-11 17:42:57 -0700142 *
Garfield Tan06c4b112016-09-14 11:05:58 -0700143 * Called when user tries to generate a context menu anchored to a file when the selection
144 * doesn't contain any folder.
145 *
146 * @param selectionDetails
147 * containsFiles may return false because this may be called when user right clicks on an
148 * unselectable item in pickers
149 */
Garfield Tan239ab972016-09-16 13:33:48 -0700150 @VisibleForTesting
Garfield Tan25676032016-09-19 13:52:35 -0700151 public void updateContextMenuForFiles(Menu menu, SelectionDetails selectionDetails) {
Steve McKay0c7ad032017-08-09 11:50:10 -0700152 assert selectionDetails != null;
Garfield Tan06c4b112016-09-14 11:05:58 -0700153
Ben Linff7f3ae2017-04-25 16:08:52 -0700154 MenuItem share = menu.findItem(R.id.dir_menu_share);
155 MenuItem open = menu.findItem(R.id.dir_menu_open);
156 MenuItem openWith = menu.findItem(R.id.dir_menu_open_with);
157 MenuItem rename = menu.findItem(R.id.dir_menu_rename);
158 MenuItem viewInOwner = menu.findItem(R.id.dir_menu_view_in_owner);
Garfield Tan06c4b112016-09-14 11:05:58 -0700159
160 updateShare(share, selectionDetails);
161 updateOpenInContextMenu(open, selectionDetails);
162 updateOpenWith(openWith, selectionDetails);
163 updateRename(rename, selectionDetails);
Jon Mann253a9922017-03-21 18:53:27 -0700164 updateViewInOwner(viewInOwner, selectionDetails);
Garfield Tan06c4b112016-09-14 11:05:58 -0700165
166 updateContextMenu(menu, selectionDetails);
167 }
168
169 /**
170 * @see DirectoryFragment#onCreateContextMenu
171 *
172 * Called when user tries to generate a context menu anchored to a folder when the selection
173 * doesn't contain any file.
174 *
175 * @param selectionDetails
176 * containDirectories may return false because this may be called when user right clicks on
177 * an unselectable item in pickers
178 */
Garfield Tan239ab972016-09-16 13:33:48 -0700179 @VisibleForTesting
Garfield Tan25676032016-09-19 13:52:35 -0700180 public void updateContextMenuForDirs(Menu menu, SelectionDetails selectionDetails) {
Steve McKay0c7ad032017-08-09 11:50:10 -0700181 assert selectionDetails != null;
Garfield Tan06c4b112016-09-14 11:05:58 -0700182
Ben Linff7f3ae2017-04-25 16:08:52 -0700183 MenuItem openInNewWindow = menu.findItem(R.id.dir_menu_open_in_new_window);
184 MenuItem rename = menu.findItem(R.id.dir_menu_rename);
185 MenuItem pasteInto = menu.findItem(R.id.dir_menu_paste_into_folder);
Garfield Tan06c4b112016-09-14 11:05:58 -0700186
187 updateOpenInNewWindow(openInNewWindow, selectionDetails);
188 updateRename(rename, selectionDetails);
189 updatePasteInto(pasteInto, selectionDetails);
190
191 updateContextMenu(menu, selectionDetails);
192 }
193
194 /**
195 * @see DirectoryFragment#onCreateContextMenu
196 *
197 * Update shared context menu items of both files and folders context menus.
198 */
Garfield Tan239ab972016-09-16 13:33:48 -0700199 @VisibleForTesting
Garfield Tan25676032016-09-19 13:52:35 -0700200 public void updateContextMenu(Menu menu, SelectionDetails selectionDetails) {
Steve McKay0c7ad032017-08-09 11:50:10 -0700201 assert selectionDetails != null;
Ben Linb2dfa122016-08-11 17:42:57 -0700202
Ben Linff7f3ae2017-04-25 16:08:52 -0700203 MenuItem cut = menu.findItem(R.id.dir_menu_cut_to_clipboard);
204 MenuItem copy = menu.findItem(R.id.dir_menu_copy_to_clipboard);
205 MenuItem delete = menu.findItem(R.id.dir_menu_delete);
Steve McKay0c7ad032017-08-09 11:50:10 -0700206 MenuItem inspect = menu.findItem(R.id.dir_menu_inspect);
Ben Linb2dfa122016-08-11 17:42:57 -0700207
Garfield Tan06c4b112016-09-14 11:05:58 -0700208 final boolean canCopy =
209 selectionDetails.size() > 0 && !selectionDetails.containsPartialFiles();
210 final boolean canDelete = selectionDetails.canDelete();
211 cut.setEnabled(canCopy && canDelete);
212 copy.setEnabled(canCopy);
213 delete.setEnabled(canDelete);
Steve McKay0c7ad032017-08-09 11:50:10 -0700214
215 inspect.setEnabled(selectionDetails.size() == 1);
Ben Linb2dfa122016-08-11 17:42:57 -0700216 }
217
Garfield Tan06c4b112016-09-14 11:05:58 -0700218 /**
219 * @see DirectoryFragment#onCreateContextMenu
Ben Linb2dfa122016-08-11 17:42:57 -0700220 *
221 * Called when user tries to generate a context menu anchored to an empty pane.
Garfield Tan06c4b112016-09-14 11:05:58 -0700222 */
Garfield Tan239ab972016-09-16 13:33:48 -0700223 @VisibleForTesting
Tony Huang76c6c9d2019-08-12 18:04:06 +0800224 public void updateContextMenuForContainer(Menu menu, SelectionDetails selectionDetails) {
Ben Linff7f3ae2017-04-25 16:08:52 -0700225 MenuItem paste = menu.findItem(R.id.dir_menu_paste_from_clipboard);
226 MenuItem selectAll = menu.findItem(R.id.dir_menu_select_all);
Tony Huang76c6c9d2019-08-12 18:04:06 +0800227 MenuItem deselectAll = menu.findItem(R.id.dir_menu_deselect_all);
Ben Linff7f3ae2017-04-25 16:08:52 -0700228 MenuItem createDir = menu.findItem(R.id.dir_menu_create_dir);
Steve McKay0c7ad032017-08-09 11:50:10 -0700229 MenuItem inspect = menu.findItem(R.id.dir_menu_inspect);
Ben Lin7c35b032016-05-31 13:24:01 -0700230
Steve McKaye5d6ca22016-09-19 20:27:24 -0700231 paste.setEnabled(mDirDetails.hasItemsToPaste() && mDirDetails.canCreateDoc());
Tony Huang76c6c9d2019-08-12 18:04:06 +0800232 updateSelectAll(selectAll, selectionDetails);
233 updateDeselectAll(deselectAll, selectionDetails);
Garfield Tand3307272016-10-10 13:33:25 -0700234 updateCreateDir(createDir);
Steve McKayc6d63242017-08-14 11:29:42 -0700235 updateInspect(inspect);
Ben Linebf2a172016-06-03 13:46:52 -0700236 }
Ben Lin7c35b032016-05-31 13:24:01 -0700237
Garfield Tan06c4b112016-09-14 11:05:58 -0700238 /**
239 * @see RootsFragment#onCreateContextMenu
240 */
Ben Lin8e912582016-09-23 14:25:14 -0700241 public void updateRootContextMenu(Menu menu, RootInfo root, DocumentInfo docInfo) {
Ben Linff7f3ae2017-04-25 16:08:52 -0700242 MenuItem eject = menu.findItem(R.id.root_menu_eject_root);
243 MenuItem pasteInto = menu.findItem(R.id.root_menu_paste_into_folder);
244 MenuItem openInNewWindow = menu.findItem(R.id.root_menu_open_in_new_window);
245 MenuItem settings = menu.findItem(R.id.root_menu_settings);
Ben Lin5668b862016-06-28 17:12:52 -0700246
Ben Lin5668b862016-06-28 17:12:52 -0700247 updateEject(eject, root);
Ben Lin8e912582016-09-23 14:25:14 -0700248 updatePasteInto(pasteInto, root, docInfo);
Garfield Tanb285b402016-09-21 17:12:18 -0700249 updateOpenInNewWindow(openInNewWindow, root);
250 updateSettings(settings, root);
Ben Lin5668b862016-06-28 17:12:52 -0700251 }
252
Steve McKay92ae43d2016-11-08 12:06:58 -0800253 public abstract void updateKeyboardShortcutsMenu(
254 List<KeyboardShortcutGroup> data, IntFunction<String> stringSupplier);
255
Steve McKaye5d6ca22016-09-19 20:27:24 -0700256 protected void updateModePicker(MenuItem grid, MenuItem list) {
Ben Lin25679912016-06-17 11:48:57 -0700257 grid.setVisible(mState.derivedMode != State.MODE_GRID);
258 list.setVisible(mState.derivedMode != State.MODE_LIST);
259 }
260
Steve McKaye5d6ca22016-09-19 20:27:24 -0700261 protected void updateAdvanced(MenuItem advanced) {
Steve McKay01996bc2016-10-21 13:38:49 -0700262 advanced.setVisible(mState.showDeviceStorageOption);
263 advanced.setTitle(mState.showDeviceStorageOption && mState.showAdvanced
Ben Lin25679912016-06-17 11:48:57 -0700264 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
265 }
266
Tony Huang243cf9c2018-10-16 16:15:18 +0800267 protected void updateSort(MenuItem sort) {
268 sort.setVisible(true);
269 }
270
Jon Manneb1d11b2017-04-01 15:36:59 -0700271 protected void updateDebug(MenuItem debug) {
272 debug.setVisible(mState.debugMode);
273 }
274
Steve McKaye5d6ca22016-09-19 20:27:24 -0700275 protected void updateSettings(MenuItem settings) {
Ben Lin25679912016-06-17 11:48:57 -0700276 settings.setVisible(false);
277 }
278
Garfield Tan25676032016-09-19 13:52:35 -0700279 protected void updateSettings(MenuItem settings, RootInfo root) {
Ben Lin5668b862016-06-28 17:12:52 -0700280 settings.setVisible(false);
281 }
282
Garfield Tan25676032016-09-19 13:52:35 -0700283 protected void updateEject(MenuItem eject, RootInfo root) {
Ben Lin5668b862016-06-28 17:12:52 -0700284 eject.setVisible(false);
285 }
286
Steve McKaye5d6ca22016-09-19 20:27:24 -0700287 protected void updateNewWindow(MenuItem newWindow) {
Ben Lin25679912016-06-17 11:48:57 -0700288 newWindow.setVisible(false);
289 }
290
Bill Linfd235cf2018-05-23 18:48:31 +0800291 protected void updateSelect(MenuItem select, SelectionDetails selectionDetails) {
292 select.setVisible(false);
293 }
294
Garfield Tan25676032016-09-19 13:52:35 -0700295 protected void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
Garfield Tan06c4b112016-09-14 11:05:58 -0700296 openWith.setVisible(false);
297 }
298
Garfield Tan25676032016-09-19 13:52:35 -0700299 protected void updateOpenInNewWindow(
300 MenuItem openInNewWindow, SelectionDetails selectionDetails) {
Garfield Tan06c4b112016-09-14 11:05:58 -0700301 openInNewWindow.setVisible(false);
302 }
303
Garfield Tanb285b402016-09-21 17:12:18 -0700304 protected void updateOpenInNewWindow(
305 MenuItem openInNewWindow, RootInfo root) {
306 openInNewWindow.setVisible(false);
307 }
308
Garfield Tan25676032016-09-19 13:52:35 -0700309 protected void updateShare(MenuItem share, SelectionDetails selectionDetails) {
Ben Lin25679912016-06-17 11:48:57 -0700310 share.setVisible(false);
311 }
312
Garfield Tan25676032016-09-19 13:52:35 -0700313 protected void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
Ben Lin25679912016-06-17 11:48:57 -0700314 delete.setVisible(false);
315 }
316
Garfield Tan25676032016-09-19 13:52:35 -0700317 protected void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
Ben Lin25679912016-06-17 11:48:57 -0700318 rename.setVisible(false);
319 }
320
Steve McKayefd10ac2017-07-25 13:33:57 -0700321 /**
322 * This method is called for standard activity option menu as opposed
323 * to when there is a selection.
324 */
Steve McKayc6d63242017-08-14 11:29:42 -0700325 protected void updateInspect(MenuItem inspector) {
Steve McKayefd10ac2017-07-25 13:33:57 -0700326 inspector.setVisible(false);
327 }
328
329 /**
330 * This method is called for action mode, when a selection exists.
331 */
Steve McKay0c7ad032017-08-09 11:50:10 -0700332 protected void updateInspect(MenuItem inspect, SelectionDetails selectionDetails) {
333 inspect.setVisible(false);
Dooper3975fa22017-06-02 10:32:00 -0700334 }
335
Jon Mann253a9922017-03-21 18:53:27 -0700336 protected void updateViewInOwner(MenuItem view, SelectionDetails selectionDetails) {
337 view.setVisible(false);
338 }
339
Garfield Tan25676032016-09-19 13:52:35 -0700340 protected void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
Ben Lin25679912016-06-17 11:48:57 -0700341 moveTo.setVisible(false);
342 }
343
Garfield Tan25676032016-09-19 13:52:35 -0700344 protected void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
Ben Lin25679912016-06-17 11:48:57 -0700345 copyTo.setVisible(false);
346 }
347
Tomasz Mikolajewski26640ab2017-02-06 10:37:59 +0900348 protected void updateCompress(MenuItem compress, SelectionDetails selectionDetails) {
349 compress.setVisible(false);
350 }
351
Tomasz Mikolajewski5a8e3782017-01-24 12:40:55 +0900352 protected void updateExtractTo(MenuItem extractTo, SelectionDetails selectionDetails) {
353 extractTo.setVisible(false);
354 }
355
Garfield Tan25676032016-09-19 13:52:35 -0700356 protected void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
Garfield Tan06c4b112016-09-14 11:05:58 -0700357 pasteInto.setVisible(false);
Ben Linb2dfa122016-08-11 17:42:57 -0700358 }
359
Ben Lin8e912582016-09-23 14:25:14 -0700360 protected void updatePasteInto(MenuItem pasteInto, RootInfo root, DocumentInfo docInfo) {
Garfield Tanb285b402016-09-21 17:12:18 -0700361 pasteInto.setVisible(false);
362 }
363
wilsonshih08d4d052018-05-16 14:36:56 +0800364 protected void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
365 open.setVisible(false);
366 }
367
Tony Huang94fc11a2019-10-30 18:00:20 +0800368 protected void updateLauncher(MenuItem launcher) {
369 launcher.setVisible(false);
370 }
371
Garfield Tan25676032016-09-19 13:52:35 -0700372 protected abstract void updateSelectAll(MenuItem selectAll);
Tony Huang76c6c9d2019-08-12 18:04:06 +0800373 protected abstract void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails);
374 protected abstract void updateDeselectAll(
375 MenuItem deselectAll, SelectionDetails selectionDetails);
Steve McKaye5d6ca22016-09-19 20:27:24 -0700376 protected abstract void updateCreateDir(MenuItem createDir);
Ben Lin7c35b032016-05-31 13:24:01 -0700377
Ben Linebf2a172016-06-03 13:46:52 -0700378 /**
379 * Access to meta data about the selection.
380 */
381 public interface SelectionDetails {
382 boolean containsDirectories();
383
Garfield Tan06c4b112016-09-14 11:05:58 -0700384 boolean containsFiles();
385
386 int size();
387
Ben Linebf2a172016-06-03 13:46:52 -0700388 boolean containsPartialFiles();
389
Ben Lin7f7ee102017-05-26 14:22:58 -0700390 boolean containsFilesInArchive();
391
Ben Linebf2a172016-06-03 13:46:52 -0700392 // TODO: Update these to express characteristics instead of answering concrete questions,
393 // since the answer to those questions is (or can be) activity specific.
394 boolean canDelete();
395
396 boolean canRename();
Ben Linb2dfa122016-08-11 17:42:57 -0700397
398 boolean canPasteInto();
Tomasz Mikolajewski5a8e3782017-01-24 12:40:55 +0900399
400 boolean canExtract();
Tomasz Mikolajewskiac3e63e2017-02-13 10:08:58 +0900401
402 boolean canOpenWith();
Jon Mann253a9922017-03-21 18:53:27 -0700403
404 boolean canViewInOwner();
Ben Linebf2a172016-06-03 13:46:52 -0700405 }
406
407 public static class DirectoryDetails {
Steve McKay92ae43d2016-11-08 12:06:58 -0800408 private final BaseActivity mActivity;
Ben Linebf2a172016-06-03 13:46:52 -0700409
Steve McKay92ae43d2016-11-08 12:06:58 -0800410 public DirectoryDetails(BaseActivity activity) {
Ben Linebf2a172016-06-03 13:46:52 -0700411 mActivity = activity;
412 }
413
Ben Linebf2a172016-06-03 13:46:52 -0700414 public boolean hasRootSettings() {
415 return mActivity.getCurrentRoot().hasSettings();
416 }
417
418 public boolean hasItemsToPaste() {
419 return false;
420 }
421
Garfield Tan06c4b112016-09-14 11:05:58 -0700422 public boolean canCreateDoc() {
423 return isInRecents() ? false : mActivity.getCurrentDirectory().isCreateSupported();
424 }
425
Ben Linebf2a172016-06-03 13:46:52 -0700426 public boolean isInRecents() {
Tony Huangfdbab1a2019-04-08 18:10:27 +0800427 return mActivity.isInRecents();
Ben Linebf2a172016-06-03 13:46:52 -0700428 }
429
430 public boolean canCreateDirectory() {
431 return mActivity.canCreateDirectory();
432 }
Takamasa Kuramitsu59710522018-06-29 18:42:21 +0900433
434 public boolean canInspectDirectory() {
Tony Huangfdbab1a2019-04-08 18:10:27 +0800435 return mActivity.canInspectDirectory() && !isInRecents();
Takamasa Kuramitsu59710522018-06-29 18:42:21 +0900436 }
Ben Linebf2a172016-06-03 13:46:52 -0700437 }
438}