diff options
13 files changed, 163 insertions, 103 deletions
diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml index 673a254f63f5..7e0649be722d 100644 --- a/packages/DocumentsUI/res/menu/activity.xml +++ b/packages/DocumentsUI/res/menu/activity.xml @@ -23,13 +23,6 @@ android:actionViewClass="android.widget.SearchView" android:imeOptions="actionSearch" /> <item - android:id="@+id/menu_create_dir" - android:title="@string/menu_create_dir" - android:icon="@drawable/ic_menu_new_folder" - android:alphabeticShortcut="e" - android:showAsAction="always" - android:visible="false" /> - <item android:id="@+id/menu_sort" android:title="@string/menu_sort" android:icon="@drawable/ic_menu_sortby" @@ -63,6 +56,13 @@ android:showAsAction="never" android:visible="false" /> <item + android:id="@+id/menu_create_dir" + android:title="@string/menu_create_dir" + android:icon="@drawable/ic_menu_new_folder" + android:alphabeticShortcut="e" + android:showAsAction="always" + android:visible="false" /> + <item android:id="@+id/menu_paste_from_clipboard" android:title="@string/menu_paste_from_clipboard" android:alphabeticShortcut="v" @@ -70,11 +70,11 @@ android:visible="false" /> <!-- Copy action is defined in mode_directory.xml --> <item - android:id="@+id/menu_advanced" + android:id="@+id/menu_file_size" android:showAsAction="never" android:visible="false" /> <item - android:id="@+id/menu_file_size" + android:id="@+id/menu_advanced" android:showAsAction="never" android:visible="false" /> <item diff --git a/packages/DocumentsUI/res/values/config.xml b/packages/DocumentsUI/res/values/config.xml index ce5b17432e8e..ed7820b01b48 100644 --- a/packages/DocumentsUI/res/values/config.xml +++ b/packages/DocumentsUI/res/values/config.xml @@ -15,5 +15,5 @@ --> <resources> - <bool name="productivity_device">false</bool> + <bool name="productivity_device">true</bool> </resources> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index a4acb604c1ef..d21b5eec7d4f 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -27,7 +27,7 @@ <string name="title_save">Save to</string> <!-- Menu item that creates a new directory/folder at the current location [CHAR LIMIT=24] --> - <string name="menu_create_dir">Create folder</string> + <string name="menu_create_dir">New folder</string> <!-- Menu item that switches view to show documents as a large-format grid of thumbnails [CHAR LIMIT=24] --> <string name="menu_grid">Grid view</string> <!-- Menu item that switches view to show documents as a list [CHAR LIMIT=24] --> diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index ab0f666ef5d3..caaa2b9be0a3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -128,10 +128,10 @@ abstract class BaseActivity extends Activity { @Override public boolean onPrepareOptionsMenu(Menu menu) { - boolean shown = super.onPrepareOptionsMenu(menu); + super.onPrepareOptionsMenu(menu); final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); + final boolean inRecents = getCurrentDirectory() == null; final MenuItem sort = menu.findItem(R.id.menu_sort); final MenuItem sortSize = menu.findItem(R.id.menu_sort_size); @@ -141,24 +141,28 @@ abstract class BaseActivity extends Activity { final MenuItem fileSize = menu.findItem(R.id.menu_file_size); final MenuItem settings = menu.findItem(R.id.menu_settings); - mSearchManager.update(root); + // I'm thinkin' this isn't necesary here. If it is...'cuz of a bug.... + // then uncomment the linke and let's get a proper bug reference here. + // mSearchManager.update(root); // Search uses backend ranking; no sorting - sort.setVisible(cwd != null && !mSearchManager.isSearching()); + sort.setVisible(!inRecents && !mSearchManager.isSearching()); + + // grid/list is effectively a toggle. + grid.setVisible(mState.derivedMode != State.MODE_GRID); + list.setVisible(mState.derivedMode != State.MODE_LIST); + + sortSize.setVisible(mState.showSize); // Only sort by size when visible + fileSize.setVisible(!mState.forceSize); + advanced.setVisible(!mState.forceAdvanced); + settings.setVisible((root.flags & Root.FLAG_HAS_SETTINGS) != 0); advanced.setTitle(LocalPreferences.getDisplayAdvancedDevices(this) ? R.string.menu_advanced_hide : R.string.menu_advanced_show); fileSize.setTitle(LocalPreferences.getDisplayFileSize(this) ? R.string.menu_file_size_hide : R.string.menu_file_size_show); - sortSize.setVisible(mState.showSize); // Only sort by size when visible - fileSize.setVisible(!mState.showSize); - grid.setVisible(mState.derivedMode != State.MODE_GRID); - list.setVisible(mState.derivedMode != State.MODE_LIST); - advanced.setVisible(!mState.showAdvanced); - settings.setVisible((root.flags & Root.FLAG_HAS_SETTINGS) != 0); - - return shown; + return true; } State buildDefaultState() { @@ -277,6 +281,7 @@ abstract class BaseActivity extends Activity { return cwd != null && cwd.isCreateSupported() && !mSearchManager.isSearching() + && !root.isRecents() && !root.isDownloads(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java index 362052c58d53..66f8acd3fc50 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java @@ -119,7 +119,7 @@ public class CopyService extends IntentService { int toastMessage = (mode == TRANSFER_MODE_COPY) ? R.plurals.copy_begin : R.plurals.move_begin; - Shared.makeSnackbar(activity, + Snackbars.makeSnackbar(activity, res.getQuantityString(toastMessage, srcDocs.size(), srcDocs.size()), Snackbar.LENGTH_SHORT).show(); activity.startService(copyIntent); diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index 9f4451663706..c6425a6e41f2 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -147,7 +147,7 @@ public class CreateDirectoryFragment extends DialogFragment { // Navigate into newly created child mActivity.onDirectoryCreated(result); } else { - Shared.makeSnackbar(mActivity, R.string.create_error, Snackbar.LENGTH_SHORT).show(); + Snackbars.makeSnackbar(mActivity, R.string.create_error, Snackbar.LENGTH_SHORT).show(); } mActivity.setPending(false); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index b3ce103b4c63..0abbf4e4996f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -44,7 +44,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.Loader; -import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -54,7 +53,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.CancellationSignal; -import android.os.Handler; import android.os.Looper; import android.os.OperationCanceledException; import android.os.Parcelable; @@ -134,8 +132,6 @@ public class DirectoryFragment extends Fragment { private Model mModel; private Model.UpdateListener mModelUpdateListener = new ModelUpdateListener(); - private final Handler mHandler = new Handler(Looper.getMainLooper()); - private View mEmptyView; private RecyclerView mRecView; @@ -217,8 +213,6 @@ public class DirectoryFragment extends Fragment { @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final Context context = inflater.getContext(); - final Resources res = context.getResources(); final View view = inflater.inflate(R.layout.fragment_directory, container, false); mMessageBar = MessageBar.create(getChildFragmentManager()); @@ -678,6 +672,7 @@ public class DirectoryFragment extends Fragment { checkNotNull(mMenu); // Delegate update logic to our owning action, since specialized logic is desired. mFragmentTuner.updateActionMenu(mMenu, mType, mNoDeleteCount == 0); + Menus.disableHiddenItems(mMenu); } @Override @@ -799,13 +794,12 @@ public class DirectoryFragment extends Fragment { private void deleteDocuments(final Selection selected) { Context context = getActivity(); - ContentResolver resolver = context.getContentResolver(); String message = Shared.getQuantityString(context, R.plurals.deleting, selected.size()); mModel.markForDeletion(selected); final Activity activity = getActivity(); - Shared.makeSnackbar(activity, message, Snackbar.LENGTH_LONG) + Snackbars.makeSnackbar(activity, message, Snackbar.LENGTH_LONG) .setAction( R.string.undo, new android.view.View.OnClickListener() { @@ -823,7 +817,7 @@ public class DirectoryFragment extends Fragment { new Model.DeletionListener() { @Override public void onError() { - Shared.makeSnackbar( + Snackbars.makeSnackbar( activity, R.string.toast_failed_delete, Snackbar.LENGTH_LONG) @@ -1244,7 +1238,7 @@ public class DirectoryFragment extends Fragment { private void copyDocuments(final List<DocumentInfo> docs, final DocumentInfo destination) { if (!canCopy(docs, destination)) { - Shared.makeSnackbar( + Snackbars.makeSnackbar( getActivity(), R.string.clipboard_files_cannot_paste, Snackbar.LENGTH_SHORT) @@ -1298,7 +1292,7 @@ public class DirectoryFragment extends Fragment { void onDocumentsReady(List<DocumentInfo> docs) { mClipper.clipDocuments(docs); Activity activity = getActivity(); - Shared.makeSnackbar(activity, + Snackbars.makeSnackbar(activity, activity.getResources().getQuantityString( R.plurals.clipboard_files_clipped, docs.size(), docs.size()), Snackbar.LENGTH_SHORT).show(); @@ -1608,23 +1602,25 @@ public class DirectoryFragment extends Fragment { @Override public void updateActionMenu(Menu menu, int dirType, boolean canDelete) { + boolean copyEnabled = mManaging && dirType != TYPE_RECENT_OPEN; + // TODO: The selection needs to be deletable. + boolean moveEnabled = + SystemProperties.getBoolean("debug.documentsui.enable_move", false); + menu.findItem(R.id.menu_copy_to_clipboard).setEnabled(copyEnabled); final MenuItem open = menu.findItem(R.id.menu_open); final MenuItem share = menu.findItem(R.id.menu_share); final MenuItem delete = menu.findItem(R.id.menu_delete); final MenuItem copyTo = menu.findItem(R.id.menu_copy_to); final MenuItem moveTo = menu.findItem(R.id.menu_move_to); - final MenuItem copyToClipboard = menu.findItem(R.id.menu_copy_to_clipboard); open.setVisible(!mManaging); share.setVisible(mManaging); delete.setVisible(mManaging && canDelete); - // Disable copying from the Recents view. - copyTo.setVisible(mManaging && dirType != TYPE_RECENT_OPEN); - moveTo.setVisible(SystemProperties.getBoolean("debug.documentsui.enable_move", false)); - - // Only shown in files mode. - copyToClipboard.setVisible(false); + copyTo.setVisible(copyEnabled); + copyTo.setEnabled(copyEnabled); + moveTo.setVisible(moveEnabled); + moveTo.setEnabled(moveEnabled); } @Override @@ -1638,13 +1634,14 @@ public class DirectoryFragment extends Fragment { @Override public void updateActionMenu(Menu menu, int dirType, boolean canDelete) { + menu.findItem(R.id.menu_copy_to_clipboard).setEnabled(dirType != TYPE_RECENT_OPEN); + menu.findItem(R.id.menu_share).setVisible(true); menu.findItem(R.id.menu_delete).setVisible(canDelete); - menu.findItem(R.id.menu_copy_to_clipboard).setVisible(true); menu.findItem(R.id.menu_open).setVisible(false); - menu.findItem(R.id.menu_copy_to).setVisible(false); - menu.findItem(R.id.menu_move_to).setVisible(false); + menu.findItem(R.id.menu_copy_to).setVisible(true); + menu.findItem(R.id.menu_move_to).setVisible(true); } @Override diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index ced03cc83451..6b428f58441c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -89,8 +89,6 @@ public class DocumentsActivity extends BaseActivity { setTheme(R.style.DocumentsNonDialogTheme); } - final Context context = this; - if (mShowAsDialog) { mDrawer = DrawerController.createDummy(); @@ -314,42 +312,36 @@ public class DocumentsActivity extends BaseActivity { public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - final RootInfo root = getCurrentRoot(); final DocumentInfo cwd = getCurrentDirectory(); final MenuItem createDir = menu.findItem(R.id.menu_create_dir); final MenuItem grid = menu.findItem(R.id.menu_grid); final MenuItem list = menu.findItem(R.id.menu_list); - final MenuItem advanced = menu.findItem(R.id.menu_advanced); final MenuItem fileSize = menu.findItem(R.id.menu_file_size); final MenuItem settings = menu.findItem(R.id.menu_settings); - boolean fileSizeVisible = mState.showSize && !mState.forceSize; - if (mState.action == ACTION_CREATE + boolean recents = cwd == null; + boolean picking = mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE - || mState.action == ACTION_OPEN_COPY_DESTINATION) { - createDir.setVisible(cwd != null && cwd.isCreateSupported()); - mSearchManager.showMenu(false); - - // No display options in recent directories - if (cwd == null) { - grid.setVisible(false); - list.setVisible(false); - fileSizeVisible = false; - } + || mState.action == ACTION_OPEN_COPY_DESTINATION; - if (mState.action == ACTION_CREATE) { - final FragmentManager fm = getFragmentManager(); - SaveFragment.get(fm).setSaveEnabled(cwd != null && cwd.isCreateSupported()); - } - } else { - createDir.setVisible(false); - } + createDir.setVisible(picking && !recents && cwd.isCreateSupported()); + mSearchManager.showMenu(!picking); - advanced.setVisible(!mState.forceAdvanced); - fileSize.setVisible(fileSizeVisible); + // No display options in recent directories + grid.setVisible(!(picking && recents)); + list.setVisible(!(picking && recents)); + + fileSize.setVisible(fileSize.isVisible() && !picking); settings.setVisible(false); + if (mState.action == ACTION_CREATE) { + final FragmentManager fm = getFragmentManager(); + SaveFragment.get(fm).setSaveEnabled(cwd != null && cwd.isCreateSupported()); + } + + Menus.disableHiddenItems(menu); + return true; } @@ -611,7 +603,7 @@ public class DocumentsActivity extends BaseActivity { if (result != null) { onTaskFinished(result); } else { - Shared.makeSnackbar( + Snackbars.makeSnackbar( DocumentsActivity.this, R.string.save_error, Snackbar.LENGTH_SHORT).show(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java index f6a5131c8244..70ddf5916f2c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java @@ -225,30 +225,23 @@ public class FilesActivity extends BaseActivity { @Override public boolean onPrepareOptionsMenu(Menu menu) { - boolean shown = super.onPrepareOptionsMenu(menu); - - menu.findItem(R.id.menu_file_size).setVisible(true); - menu.findItem(R.id.menu_advanced).setVisible(true); + super.onPrepareOptionsMenu(menu); final MenuItem createDir = menu.findItem(R.id.menu_create_dir); final MenuItem newWindow = menu.findItem(R.id.menu_new_window); final MenuItem pasteFromCb = menu.findItem(R.id.menu_paste_from_clipboard); - boolean canCreateDir = canCreateDirectory(); - createDir.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - createDir.setVisible(canCreateDir); - createDir.setEnabled(canCreateDir); + createDir.setVisible(true); + createDir.setEnabled(canCreateDirectory()); + + pasteFromCb.setEnabled(mClipper.hasItemsToPaste()); newWindow.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); newWindow.setVisible(mProductivityDevice); - newWindow.setEnabled(mProductivityDevice); - - pasteFromCb.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - pasteFromCb.setVisible(true); - pasteFromCb.setEnabled(mClipper.hasItemsToPaste()); - return shown; + Menus.disableHiddenItems(menu, pasteFromCb); + return true; } @Override @@ -347,7 +340,7 @@ public class FilesActivity extends BaseActivity { try { startActivity(intent); } catch (ActivityNotFoundException ex2) { - Shared.makeSnackbar(this, R.string.toast_no_application, Snackbar.LENGTH_SHORT).show(); + Snackbars.makeSnackbar(this, R.string.toast_no_application, Snackbar.LENGTH_SHORT).show(); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java b/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java index ed7333d31149..14a33f9c1cc1 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java @@ -140,6 +140,7 @@ public class ManageRootActivity extends BaseActivity { @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); + Menus.disableHiddenItems(menu); return true; } @@ -184,7 +185,7 @@ public class ManageRootActivity extends BaseActivity { try { startActivity(view); } catch (ActivityNotFoundException ex2) { - Shared.makeSnackbar(this, R.string.toast_no_application, Snackbar.LENGTH_SHORT) + Snackbars.makeSnackbar(this, R.string.toast_no_application, Snackbar.LENGTH_SHORT) .show(); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/Menus.java b/packages/DocumentsUI/src/com/android/documentsui/Menus.java new file mode 100644 index 000000000000..3f43a3d30c8d --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/Menus.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.view.Menu; +import android.view.MenuItem; + +final class Menus { + + private Menus() {} + + /** + * Disables hidden menu items so that they are not invokable via command shortcuts + */ + static void disableHiddenItems(Menu menu, MenuItem... exclusions) { + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + if (item.isVisible()) { + continue; + } + if (contains(exclusions, item)) { + continue; + } + item.setEnabled(false); + } + } + + private static boolean contains(MenuItem[] exclusions, MenuItem item) { + for (int x = 0; x < exclusions.length; x++) { + if (exclusions[x] == item) { + return true; + } + } + return false; + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java index e06d6a52e004..a4d6dc57cd34 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java @@ -16,12 +16,7 @@ package com.android.documentsui; -import static com.android.internal.util.Preconditions.checkNotNull; - -import android.app.Activity; import android.content.Context; -import android.support.design.widget.Snackbar; -import android.view.View; /** @hide */ public final class Shared { @@ -35,14 +30,4 @@ public final class Shared { public static final String getQuantityString(Context context, int resourceId, int quantity) { return context.getResources().getQuantityString(resourceId, quantity, quantity); } - - public static final Snackbar makeSnackbar(Activity activity, int messageId, int duration) { - return makeSnackbar(activity, activity.getResources().getText(messageId), duration); - } - - public static final Snackbar makeSnackbar(Activity activity, CharSequence message, int duration) - { - final View view = checkNotNull(activity.findViewById(R.id.coordinator_layout)); - return Snackbar.make(view, message, duration); - } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java b/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java new file mode 100644 index 000000000000..f48b298a4f2f --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.app.Activity; +import android.support.design.widget.Snackbar; +import android.view.View; + +final class Snackbars { + private Snackbars() {} + + public static final Snackbar makeSnackbar(Activity activity, int messageId, int duration) { + return Snackbars.makeSnackbar(activity, activity.getResources().getText(messageId), duration); + } + + public static final Snackbar makeSnackbar(Activity activity, CharSequence message, int duration) + { + final View view = checkNotNull(activity.findViewById(R.id.coordinator_layout)); + return Snackbar.make(view, message, duration); + } +} |