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