blob: 974a5bf24b3abb143586a067906fc2246b8b7080 [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
19import android.view.Menu;
Ben Linebf2a172016-06-03 13:46:52 -070020import android.view.MenuItem;
Ben Lin7c35b032016-05-31 13:24:01 -070021
Steve McKayd0805062016-09-15 14:30:38 -070022import com.android.documentsui.base.RootInfo;
Ben Lin5668b862016-06-28 17:12:52 -070023
Ben Linebf2a172016-06-03 13:46:52 -070024public abstract class MenuManager {
Ben Lin7c35b032016-05-31 13:24:01 -070025
Ben Lin25679912016-06-17 11:48:57 -070026 final State mState;
27 final SearchViewManager mSearchManager;
28
29 public MenuManager(SearchViewManager searchManager, State displayState) {
30 mSearchManager = searchManager;
31 mState = displayState;
32 }
33
Ben Linebf2a172016-06-03 13:46:52 -070034 /** @See DirectoryFragment.SelectionModeListener#updateActionMenu */
35 public void updateActionMenu(Menu menu, SelectionDetails selection) {
36 updateOpen(menu.findItem(R.id.menu_open), selection);
37 updateDelete(menu.findItem(R.id.menu_delete), selection);
38 updateShare(menu.findItem(R.id.menu_share), selection);
39 updateRename(menu.findItem(R.id.menu_rename), selection);
40 updateSelectAll(menu.findItem(R.id.menu_select_all), selection);
41 updateMoveTo(menu.findItem(R.id.menu_move_to), selection);
42 updateCopyTo(menu.findItem(R.id.menu_copy_to), selection);
Ben Lin7c35b032016-05-31 13:24:01 -070043
Ben Linebf2a172016-06-03 13:46:52 -070044 Menus.disableHiddenItems(menu);
45 }
Ben Lin7c35b032016-05-31 13:24:01 -070046
Ben Linebf2a172016-06-03 13:46:52 -070047 /** @See Activity#onPrepareOptionsMenu */
Ben Lin25679912016-06-17 11:48:57 -070048 public void updateOptionMenu(Menu menu, DirectoryDetails directoryDetails) {
49 updateCreateDir(menu.findItem(R.id.menu_create_dir), directoryDetails);
50 updateSettings(menu.findItem(R.id.menu_settings), directoryDetails);
51 updateNewWindow(menu.findItem(R.id.menu_new_window), directoryDetails);
Ben Lin25679912016-06-17 11:48:57 -070052 updateModePicker(menu.findItem(
53 R.id.menu_grid), menu.findItem(R.id.menu_list), directoryDetails);
Garfield, Tan11d23482016-08-05 09:33:29 -070054 // Sort menu item is managed by SortMenuManager
Ben Lin25679912016-06-17 11:48:57 -070055 updateAdvanced(menu.findItem(R.id.menu_advanced), directoryDetails);
Ben Lin7c35b032016-05-31 13:24:01 -070056
Ben Linebf2a172016-06-03 13:46:52 -070057 Menus.disableHiddenItems(menu);
58 }
Ben Lin7c35b032016-05-31 13:24:01 -070059
Ben Linb2dfa122016-08-11 17:42:57 -070060 /** @See DirectoryFragment.onCreateContextMenu
61 *
62 * Called when user tries to generate a context menu anchored to a file.
63 * */
64 public void updateContextMenuForFile(
65 Menu menu,
66 SelectionDetails selectionDetails,
Ben Linebf2a172016-06-03 13:46:52 -070067 DirectoryDetails directoryDetails) {
Ben Linb2dfa122016-08-11 17:42:57 -070068 assert(selectionDetails != null);
69
70 MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard);
71 MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard);
72 MenuItem pasteInto = menu.findItem(R.id.menu_paste_into_folder);
73 MenuItem delete = menu.findItem(R.id.menu_delete);
74 MenuItem rename = menu.findItem(R.id.menu_rename);
75
76 copy.setEnabled(!selectionDetails.containsPartialFiles());
77 cut.setEnabled(
78 !selectionDetails.containsPartialFiles() && selectionDetails.canDelete());
79 updatePasteInto(pasteInto, selectionDetails);
80 updateRename(rename, selectionDetails);
81 updateDelete(delete, selectionDetails);
82
83 updateContextMenu(menu, directoryDetails);
84 }
85
86 /** @See DirectoryFragment.onCreateContextMenu
87 *
88 * Called when user tries to generate a context menu anchored to an empty pane.
89 * */
90 public void updateContextMenuForContainer(Menu menu, DirectoryDetails directoryDetails) {
91 MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard);
92 MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard);
93 MenuItem pasteInto = menu.findItem(R.id.menu_paste_into_folder);
94 MenuItem delete = menu.findItem(R.id.menu_delete);
95 MenuItem rename = menu.findItem(R.id.menu_rename);
96
97 cut.setEnabled(false);
98 copy.setEnabled(false);
99 pasteInto.setEnabled(false);
100 rename.setEnabled(false);
101 delete.setEnabled(false);
102
103 updateContextMenu(menu, directoryDetails);
104 }
105
106 private void updateContextMenu(Menu menu, DirectoryDetails directoryDetails) {
Ben Lin7c35b032016-05-31 13:24:01 -0700107
Ben Linebf2a172016-06-03 13:46:52 -0700108 MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard);
109 MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard);
110 MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);
Ben Linb2dfa122016-08-11 17:42:57 -0700111 MenuItem pasteInto = menu.findItem(R.id.menu_paste_into_folder);
Ben Linebf2a172016-06-03 13:46:52 -0700112 MenuItem delete = menu.findItem(R.id.menu_delete);
Ben Linebf2a172016-06-03 13:46:52 -0700113 MenuItem createDir = menu.findItem(R.id.menu_create_dir);
Ben Lin7c35b032016-05-31 13:24:01 -0700114
Ben Linebf2a172016-06-03 13:46:52 -0700115 updateCreateDir(createDir, directoryDetails);
Ben Linb2dfa122016-08-11 17:42:57 -0700116 paste.setEnabled(directoryDetails.hasItemsToPaste());
Ben Lin7c35b032016-05-31 13:24:01 -0700117
Ben Linb2dfa122016-08-11 17:42:57 -0700118 //Cut, Copy and Delete should always be visible
Ben Linebf2a172016-06-03 13:46:52 -0700119 cut.setVisible(true);
120 copy.setVisible(true);
Ben Linebf2a172016-06-03 13:46:52 -0700121 delete.setVisible(true);
Ben Linb2dfa122016-08-11 17:42:57 -0700122
123 // PasteInto should only show if it is enabled. If it's not enabled, Paste shows (regardless
124 // of whether it is enabled or not).
125 // Paste then hides itself whenever PasteInto is enabled/visible
126 pasteInto.setVisible(pasteInto.isEnabled());
127 paste.setVisible(!pasteInto.isVisible());
Ben Linebf2a172016-06-03 13:46:52 -0700128 }
Ben Lin7c35b032016-05-31 13:24:01 -0700129
Ben Lin5668b862016-06-28 17:12:52 -0700130 public void updateRootContextMenu(Menu menu, RootInfo root) {
131 MenuItem settings = menu.findItem(R.id.menu_settings);
132 MenuItem eject = menu.findItem(R.id.menu_eject_root);
133
134 updateSettings(settings, root);
135 updateEject(eject, root);
136 }
137
Ben Lin25679912016-06-17 11:48:57 -0700138 void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
139 grid.setVisible(mState.derivedMode != State.MODE_GRID);
140 list.setVisible(mState.derivedMode != State.MODE_LIST);
141 }
142
Ben Lin25679912016-06-17 11:48:57 -0700143 void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
144 advanced.setVisible(mState.showAdvancedOption);
145 advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced
146 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
147 }
148
149 void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
150 settings.setVisible(false);
151 }
152
Ben Lin5668b862016-06-28 17:12:52 -0700153 void updateSettings(MenuItem settings, RootInfo root) {
154 settings.setVisible(false);
155 }
156
157 void updateEject(MenuItem eject, RootInfo root) {
158 eject.setVisible(false);
159 }
160
Ben Lin25679912016-06-17 11:48:57 -0700161 void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
162 newWindow.setVisible(false);
163 }
164
165 void updateOpen(MenuItem open, SelectionDetails selectionDetails) {
166 open.setVisible(false);
167 }
168
169 void updateShare(MenuItem share, SelectionDetails selectionDetails) {
170 share.setVisible(false);
171 }
172
173 void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
174 delete.setVisible(false);
175 }
176
177 void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
178 rename.setVisible(false);
179 }
180
181 void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
182 moveTo.setVisible(false);
183 }
184
185 void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
186 copyTo.setVisible(false);
187 }
188
Ben Linb2dfa122016-08-11 17:42:57 -0700189 void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
190 pasteInto.setEnabled(false);
191 }
192
Ben Linebf2a172016-06-03 13:46:52 -0700193 abstract void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails);
194 abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
Ben Lin7c35b032016-05-31 13:24:01 -0700195
Ben Linebf2a172016-06-03 13:46:52 -0700196 /**
197 * Access to meta data about the selection.
198 */
199 public interface SelectionDetails {
200 boolean containsDirectories();
201
202 boolean containsPartialFiles();
203
204 // TODO: Update these to express characteristics instead of answering concrete questions,
205 // since the answer to those questions is (or can be) activity specific.
206 boolean canDelete();
207
208 boolean canRename();
Ben Linb2dfa122016-08-11 17:42:57 -0700209
210 boolean canPasteInto();
Ben Linebf2a172016-06-03 13:46:52 -0700211 }
212
213 public static class DirectoryDetails {
214 private final BaseActivity mActivity;
215
216 public DirectoryDetails(BaseActivity activity) {
217 mActivity = activity;
218 }
219
220 public boolean shouldShowFancyFeatures() {
221 return Shared.shouldShowFancyFeatures(mActivity);
222 }
223
224 public boolean hasRootSettings() {
225 return mActivity.getCurrentRoot().hasSettings();
226 }
227
228 public boolean hasItemsToPaste() {
229 return false;
230 }
231
232 public boolean isInRecents() {
233 return mActivity.getCurrentDirectory() == null;
234 }
235
236 public boolean canCreateDirectory() {
237 return mActivity.canCreateDirectory();
238 }
239 }
240}