blob: 0edd18e5b4c12843f543cdf749781108e0ee8870 [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
Ben Linebf2a172016-06-03 13:46:52 -070019import android.annotation.Nullable;
Ben Lin7c35b032016-05-31 13:24:01 -070020import android.view.Menu;
Ben Linebf2a172016-06-03 13:46:52 -070021import android.view.MenuItem;
Ben Lin7c35b032016-05-31 13:24:01 -070022
Ben Lin5668b862016-06-28 17:12:52 -070023import com.android.documentsui.model.RootInfo;
24
Ben Linebf2a172016-06-03 13:46:52 -070025public abstract class MenuManager {
Ben Lin7c35b032016-05-31 13:24:01 -070026
Ben Lin25679912016-06-17 11:48:57 -070027 final State mState;
28 final SearchViewManager mSearchManager;
29
30 public MenuManager(SearchViewManager searchManager, State displayState) {
31 mSearchManager = searchManager;
32 mState = displayState;
33 }
34
Ben Linebf2a172016-06-03 13:46:52 -070035 /** @See DirectoryFragment.SelectionModeListener#updateActionMenu */
36 public void updateActionMenu(Menu menu, SelectionDetails selection) {
37 updateOpen(menu.findItem(R.id.menu_open), selection);
38 updateDelete(menu.findItem(R.id.menu_delete), selection);
39 updateShare(menu.findItem(R.id.menu_share), selection);
40 updateRename(menu.findItem(R.id.menu_rename), selection);
41 updateSelectAll(menu.findItem(R.id.menu_select_all), selection);
42 updateMoveTo(menu.findItem(R.id.menu_move_to), selection);
43 updateCopyTo(menu.findItem(R.id.menu_copy_to), selection);
Ben Lin7c35b032016-05-31 13:24:01 -070044
Ben Linebf2a172016-06-03 13:46:52 -070045 Menus.disableHiddenItems(menu);
46 }
Ben Lin7c35b032016-05-31 13:24:01 -070047
Ben Linebf2a172016-06-03 13:46:52 -070048 /** @See Activity#onPrepareOptionsMenu */
Ben Lin25679912016-06-17 11:48:57 -070049 public void updateOptionMenu(Menu menu, DirectoryDetails directoryDetails) {
50 updateCreateDir(menu.findItem(R.id.menu_create_dir), directoryDetails);
51 updateSettings(menu.findItem(R.id.menu_settings), directoryDetails);
52 updateNewWindow(menu.findItem(R.id.menu_new_window), directoryDetails);
53 updateFileSize(menu.findItem(R.id.menu_file_size), directoryDetails);
54 updateModePicker(menu.findItem(
55 R.id.menu_grid), menu.findItem(R.id.menu_list), directoryDetails);
56 updateSort(menu.findItem(R.id.menu_sort),
57 menu.findItem(R.id.menu_sort_size),
58 directoryDetails);
59 updateAdvanced(menu.findItem(R.id.menu_advanced), directoryDetails);
Ben Lin7c35b032016-05-31 13:24:01 -070060
Ben Linebf2a172016-06-03 13:46:52 -070061 Menus.disableHiddenItems(menu);
62 }
Ben Lin7c35b032016-05-31 13:24:01 -070063
Ben Linebf2a172016-06-03 13:46:52 -070064 /** @See DirectoryFragment.onCreateContextMenu */
65 public void updateContextMenu(Menu menu,
66 @Nullable SelectionDetails selectionDetails,
67 DirectoryDetails directoryDetails) {
Ben Lin7c35b032016-05-31 13:24:01 -070068
Ben Linebf2a172016-06-03 13:46:52 -070069 MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard);
70 MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard);
71 MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);
72 MenuItem delete = menu.findItem(R.id.menu_delete);
73 MenuItem rename = menu.findItem(R.id.menu_rename);
74 MenuItem createDir = menu.findItem(R.id.menu_create_dir);
Ben Lin7c35b032016-05-31 13:24:01 -070075
Ben Linebf2a172016-06-03 13:46:52 -070076 if (selectionDetails == null) {
77 cut.setEnabled(false);
78 copy.setEnabled(false);
79 rename.setEnabled(false);
80 delete.setEnabled(false);
81 } else {
82 copy.setEnabled(!selectionDetails.containsPartialFiles());
83 cut.setEnabled(
84 !selectionDetails.containsPartialFiles() && selectionDetails.canDelete());
85 updateRename(rename, selectionDetails);
86 updateDelete(delete, selectionDetails);
87 }
88 menu.findItem(R.id.menu_paste_from_clipboard)
89 .setEnabled(directoryDetails.hasItemsToPaste());
90 updateCreateDir(createDir, directoryDetails);
Ben Lin7c35b032016-05-31 13:24:01 -070091
Ben Linebf2a172016-06-03 13:46:52 -070092 //Cut, Copy, Paste and Delete should always be visible
93 cut.setVisible(true);
94 copy.setVisible(true);
95 paste.setVisible(true);
96 delete.setVisible(true);
97 }
Ben Lin7c35b032016-05-31 13:24:01 -070098
Ben Lin5668b862016-06-28 17:12:52 -070099 public void updateRootContextMenu(Menu menu, RootInfo root) {
100 MenuItem settings = menu.findItem(R.id.menu_settings);
101 MenuItem eject = menu.findItem(R.id.menu_eject_root);
102
103 updateSettings(settings, root);
104 updateEject(eject, root);
105 }
106
Ben Lin25679912016-06-17 11:48:57 -0700107 void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
108 grid.setVisible(mState.derivedMode != State.MODE_GRID);
109 list.setVisible(mState.derivedMode != State.MODE_LIST);
110 }
111
112 void updateFileSize(MenuItem fileSize, DirectoryDetails directoryDetails) {
113 fileSize.setVisible(!mState.forceSize);
114 fileSize.setTitle(directoryDetails.getDisplayFileSize()
115 ? R.string.menu_file_size_hide : R.string.menu_file_size_show);
116 }
117
118 void updateSort(MenuItem sort, MenuItem sortSize, DirectoryDetails directoryDetails) {
119 // Search uses backend ranking; no sorting, recents doesn't support sort.
120 sort.setEnabled(!directoryDetails.isInRecents() && !mSearchManager.isSearching());
121 sort.setVisible(true);
Garfield, Tan171e6f52016-07-29 14:44:58 -0700122 sortSize.setVisible(mState.getShowSize()); // Only sort by size when file sizes are visible
Ben Lin25679912016-06-17 11:48:57 -0700123 }
124
125 void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
126 advanced.setVisible(mState.showAdvancedOption);
127 advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced
128 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
129 }
130
131 void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
132 settings.setVisible(false);
133 }
134
Ben Lin5668b862016-06-28 17:12:52 -0700135 void updateSettings(MenuItem settings, RootInfo root) {
136 settings.setVisible(false);
137 }
138
139 void updateEject(MenuItem eject, RootInfo root) {
140 eject.setVisible(false);
141 }
142
Ben Lin25679912016-06-17 11:48:57 -0700143 void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
144 newWindow.setVisible(false);
145 }
146
147 void updateOpen(MenuItem open, SelectionDetails selectionDetails) {
148 open.setVisible(false);
149 }
150
151 void updateShare(MenuItem share, SelectionDetails selectionDetails) {
152 share.setVisible(false);
153 }
154
155 void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
156 delete.setVisible(false);
157 }
158
159 void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
160 rename.setVisible(false);
161 }
162
163 void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
164 moveTo.setVisible(false);
165 }
166
167 void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
168 copyTo.setVisible(false);
169 }
170
Ben Linebf2a172016-06-03 13:46:52 -0700171 abstract void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails);
172 abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
Ben Lin7c35b032016-05-31 13:24:01 -0700173
Ben Linebf2a172016-06-03 13:46:52 -0700174 /**
175 * Access to meta data about the selection.
176 */
177 public interface SelectionDetails {
178 boolean containsDirectories();
179
180 boolean containsPartialFiles();
181
182 // TODO: Update these to express characteristics instead of answering concrete questions,
183 // since the answer to those questions is (or can be) activity specific.
184 boolean canDelete();
185
186 boolean canRename();
187 }
188
189 public static class DirectoryDetails {
190 private final BaseActivity mActivity;
191
192 public DirectoryDetails(BaseActivity activity) {
193 mActivity = activity;
194 }
195
196 public boolean shouldShowFancyFeatures() {
197 return Shared.shouldShowFancyFeatures(mActivity);
198 }
199
200 public boolean hasRootSettings() {
201 return mActivity.getCurrentRoot().hasSettings();
202 }
203
204 public boolean hasItemsToPaste() {
205 return false;
206 }
207
208 public boolean isInRecents() {
209 return mActivity.getCurrentDirectory() == null;
210 }
211
212 public boolean canCreateDirectory() {
213 return mActivity.canCreateDirectory();
214 }
Ben Lin25679912016-06-17 11:48:57 -0700215
216 public boolean getDisplayFileSize() {
217 return LocalPreferences.getDisplayFileSize(mActivity);
218 }
Ben Linebf2a172016-06-03 13:46:52 -0700219 }
220}