diff options
-rw-r--r-- | res/menu/action_mode_menu.xml | 5 | ||||
-rw-r--r-- | res/values/config.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | src/com/android/documentsui/AbstractActionHandler.java | 5 | ||||
-rw-r--r-- | src/com/android/documentsui/ActionHandler.java | 4 | ||||
-rw-r--r-- | src/com/android/documentsui/ActivityConfig.java | 2 | ||||
-rw-r--r-- | src/com/android/documentsui/MenuManager.java | 6 | ||||
-rw-r--r-- | src/com/android/documentsui/Metrics.java | 1 | ||||
-rw-r--r-- | src/com/android/documentsui/base/Features.java | 6 | ||||
-rw-r--r-- | src/com/android/documentsui/dirlist/DirectoryFragment.java | 7 | ||||
-rw-r--r-- | src/com/android/documentsui/files/ActionHandler.java | 13 | ||||
-rw-r--r-- | src/com/android/documentsui/files/FilesActivity.java | 4 | ||||
-rw-r--r-- | src/com/android/documentsui/files/MenuManager.java | 7 | ||||
-rw-r--r-- | tests/common/com/android/documentsui/testing/TestFeatures.java | 6 | ||||
-rw-r--r-- | tests/common/com/android/documentsui/testing/TestMenu.java | 1 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/files/MenuManagerTest.java | 2 |
16 files changed, 63 insertions, 9 deletions
diff --git a/res/menu/action_mode_menu.xml b/res/menu/action_mode_menu.xml index f6fdb7e04..ba238163a 100644 --- a/res/menu/action_mode_menu.xml +++ b/res/menu/action_mode_menu.xml @@ -63,6 +63,11 @@ android:showAsAction="never" android:visible="false" /> <item + android:id="@+id/action_menu_inspector" + android:title="@string/menu_inspector" + android:showAsAction="never" + android:visible="false" /> + <item android:id="@+id/action_menu_view_in_owner" android:title="@string/menu_view_in_owner" android:showAsAction="never" diff --git a/res/values/config.xml b/res/values/config.xml index c7713e78f..4035c6558 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -48,6 +48,7 @@ <bool name="feature_remote_actions">true</bool> <bool name="feature_system_keyboard_navigation">true</bool> <bool name="feature_virtual_files_sharing">true</bool> + <bool name="feature_inspector">false</bool> <bool name="feature_debug_mode">false</bool> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index f25939f30..b0f198ccf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -67,6 +67,8 @@ <string name="menu_extract">Extract to\u2026</string> <!-- Menu item that renames the selected document [CHAR LIMIT=28] --> <string name="menu_rename">Rename</string> + <!--Menu item that displays properties about the selected document [CHAR LIMIT=28] --> + <string name="menu_inspector">Properties</string> <!-- Menu item that renames the selected document [CHAR LIMIT=28] --> <string name="menu_view_in_owner">View in <xliff:g id="source" example="Google Drive">%1$s</xliff:g></string> diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java index df4e38082..9c1a132ef 100644 --- a/src/com/android/documentsui/AbstractActionHandler.java +++ b/src/com/android/documentsui/AbstractActionHandler.java @@ -44,7 +44,6 @@ import com.android.documentsui.LoadDocStackTask.LoadDocStackCallback; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; -import com.android.documentsui.base.Features; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.Providers; import com.android.documentsui.base.RootInfo; @@ -231,6 +230,10 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> throw new UnsupportedOperationException("Can't open document."); } + public void showInspector(Selection selection, Context context) { + throw new UnsupportedOperationException("Can't open properties."); + } + @Override public void springOpenDirectory(DocumentInfo doc) { throw new UnsupportedOperationException("Can't spring open directories."); diff --git a/src/com/android/documentsui/ActionHandler.java b/src/com/android/documentsui/ActionHandler.java index e4abf7d0b..0a14b04ef 100644 --- a/src/com/android/documentsui/ActionHandler.java +++ b/src/com/android/documentsui/ActionHandler.java @@ -19,6 +19,7 @@ package com.android.documentsui; import android.annotation.IntDef; import android.app.PendingIntent; import android.content.ContentProvider; +import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.net.Uri; @@ -29,6 +30,7 @@ import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; import com.android.documentsui.dirlist.DocumentDetails; +import com.android.documentsui.selection.Selection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -101,6 +103,8 @@ public interface ActionHandler { void showCreateDirectoryDialog(); + void showInspector(Selection selection, Context context); + @Nullable DocumentInfo renameDocument(String name, DocumentInfo document); /** diff --git a/src/com/android/documentsui/ActivityConfig.java b/src/com/android/documentsui/ActivityConfig.java index 5b70fd5a3..6b0fa23f2 100644 --- a/src/com/android/documentsui/ActivityConfig.java +++ b/src/com/android/documentsui/ActivityConfig.java @@ -20,7 +20,7 @@ import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.State; /** - * Providers support for specializing the DirectoryFragment to the "host" Activity. + * Provides support for specializing the DirectoryFragment to the "host" Activity. * Feel free to expand the role of this class to handle other specializations. */ public abstract class ActivityConfig { diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java index d00d14b34..a8c97671c 100644 --- a/src/com/android/documentsui/MenuManager.java +++ b/src/com/android/documentsui/MenuManager.java @@ -28,7 +28,6 @@ import com.android.documentsui.base.Menus; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.State; import com.android.documentsui.dirlist.DirectoryFragment; -import com.android.documentsui.files.FilesActivity; import com.android.documentsui.queries.SearchViewManager; import com.android.documentsui.sidebar.RootsFragment; import com.android.internal.annotations.VisibleForTesting; @@ -64,6 +63,7 @@ public abstract class MenuManager { updateCompress(menu.findItem(R.id.action_menu_compress), selection); updateExtractTo(menu.findItem(R.id.action_menu_extract_to), selection); updateViewInOwner(menu.findItem(R.id.action_menu_view_in_owner), selection); + updateInspector(menu.findItem(R.id.action_menu_inspector), selection); Menus.disableHiddenItems(menu); } @@ -273,6 +273,10 @@ public abstract class MenuManager { rename.setVisible(false); } + protected void updateInspector(MenuItem properties, SelectionDetails selectionDetails) { + properties.setVisible(false); + } + protected void updateViewInOwner(MenuItem view, SelectionDetails selectionDetails) { view.setVisible(false); } diff --git a/src/com/android/documentsui/Metrics.java b/src/com/android/documentsui/Metrics.java index c30debd76..7c284c4d3 100644 --- a/src/com/android/documentsui/Metrics.java +++ b/src/com/android/documentsui/Metrics.java @@ -319,6 +319,7 @@ public final class Metrics { public static final int USER_ACTION_COMPRESS = 27; public static final int USER_ACTION_EXTRACT_TO = 28; public static final int USER_ACTION_VIEW_IN_APPLICATION = 29; + public static final int USER_ACTION_INSPECTOR = 30; @IntDef(flag = false, value = { USER_ACTION_OTHER, diff --git a/src/com/android/documentsui/base/Features.java b/src/com/android/documentsui/base/Features.java index 7a8fed69c..7a9936fb6 100644 --- a/src/com/android/documentsui/base/Features.java +++ b/src/com/android/documentsui/base/Features.java @@ -39,6 +39,7 @@ public interface Features { boolean isDebugSupportEnabled(); boolean isFoldersInSearchResultsEnabled(); boolean isGestureScaleEnabled(); + boolean isInspectorEnabled(); boolean isJobProgressDialogEnabled(); boolean isLaunchToDocumentEnabled(); boolean isNotificationChannelEnabled(); @@ -47,6 +48,7 @@ public interface Features { boolean isSystemKeyboardNavigationEnabled(); boolean isVirtualFilesSharingEnabled(); + /** * Call this to force-enable any particular feature known by this instance. * Note that all feature may not support being enabled at runtime as @@ -127,6 +129,10 @@ public interface Features { return isEnabled(R.bool.feature_gesture_scale); } + public boolean isInspectorEnabled() { + return isEnabled(R.bool.feature_inspector); + } + @Override public boolean isJobProgressDialogEnabled() { return isEnabled(R.bool.feature_job_progress_dialog); diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java index 4e97da7e5..0065004cb 100644 --- a/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -67,7 +67,6 @@ import com.android.documentsui.BaseActivity; import com.android.documentsui.BaseActivity.RetainedState; import com.android.documentsui.DirectoryReloadLock; import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.DragAndDropManager; import com.android.documentsui.FocusManager; import com.android.documentsui.Injector; import com.android.documentsui.Injector.ContentScoped; @@ -84,7 +83,6 @@ import com.android.documentsui.base.EventListener; import com.android.documentsui.base.Events.InputEvent; import com.android.documentsui.base.Events.MotionInputEvent; import com.android.documentsui.base.Features; -import com.android.documentsui.base.Lookup; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; @@ -684,6 +682,11 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On transferDocuments(selection, null, FileOperationService.OPERATION_MOVE); return true; + case R.id.action_menu_inspector: + mActionModeController.finishActionMode(); + mActions.showInspector(selection, getContext()); + return true; + case R.id.dir_menu_cut_to_clipboard: mActions.cutToClipboard(); return true; diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java index 6f39e51ef..b5df11545 100644 --- a/src/com/android/documentsui/files/ActionHandler.java +++ b/src/com/android/documentsui/files/ActionHandler.java @@ -23,6 +23,7 @@ import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ContentProviderClient; import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.DocumentsContract; @@ -32,7 +33,6 @@ import android.view.DragEvent; import com.android.documentsui.AbstractActionHandler; import com.android.documentsui.ActionModeAddons; import com.android.documentsui.ActivityConfig; -import com.android.documentsui.CreateDirectoryFragment; import com.android.documentsui.DocumentsAccess; import com.android.documentsui.DocumentsApplication; import com.android.documentsui.DragAndDropManager; @@ -63,7 +63,6 @@ import com.android.documentsui.roots.ProvidersAccess; import com.android.documentsui.selection.Selection; import com.android.documentsui.services.FileOperation; import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; import com.android.documentsui.services.FileOperations; import com.android.documentsui.ui.DialogController; import com.android.internal.annotations.VisibleForTesting; @@ -676,6 +675,16 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa return intent; } + @Override + public void showInspector(Selection selected, Context context) { + assert(selected.size() == 1); + Intent intent = new Intent(mActivity, FilesActivity.class); + DocumentInfo selectedDoc = mModel.getDocuments(selected).get(0); + intent.putExtra(Intent.ACTION_VIEW, selectedDoc.derivedUri); + Metrics.logUserAction(context, Metrics.USER_ACTION_INSPECTOR); + mActivity.startActivity(intent); + } + public interface Addons extends CommonAddons { } } diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java index aeef64573..cf0b36ea5 100644 --- a/src/com/android/documentsui/files/FilesActivity.java +++ b/src/com/android/documentsui/files/FilesActivity.java @@ -231,12 +231,12 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons super.onPostCreate(savedInstanceState); // This check avoids a flicker from "Recents" to "Home". // Only update action bar at this point if there is an active - // serach. Why? Because this avoid an early (undesired) load of + // search. Why? Because this avoid an early (undesired) load of // the recents root...which is the default root in other activities. // In Files app "Home" is the default, but it is loaded async. // update will be called once Home root is loaded. // Except while searching we need this call to ensure the - // search bits get layed out correctly. + // search bits get laid out correctly. if (mSearchManager.isSearching()) { mNavigator.update(); } diff --git a/src/com/android/documentsui/files/MenuManager.java b/src/com/android/documentsui/files/MenuManager.java index 5c48e02de..4754c6d27 100644 --- a/src/com/android/documentsui/files/MenuManager.java +++ b/src/com/android/documentsui/files/MenuManager.java @@ -265,6 +265,13 @@ public final class MenuManager extends com.android.documentsui.MenuManager { } @Override + protected void updateInspector(MenuItem properties, SelectionDetails selectionDetails) { + boolean visible = mFeatures.isInspectorEnabled(); + properties.setVisible(visible); + properties.setEnabled(visible && selectionDetails.size() == 1); + } + + @Override protected void updateViewInOwner(MenuItem view, SelectionDetails selectionDetails) { if (selectionDetails.canViewInOwner()) { view.setVisible(true); diff --git a/tests/common/com/android/documentsui/testing/TestFeatures.java b/tests/common/com/android/documentsui/testing/TestFeatures.java index 204e8d23e..39f88a0c2 100644 --- a/tests/common/com/android/documentsui/testing/TestFeatures.java +++ b/tests/common/com/android/documentsui/testing/TestFeatures.java @@ -28,6 +28,7 @@ public class TestFeatures implements Features { public boolean debugSupport = true; public boolean foldersInSearchResults = true; public boolean gestureScale = true; + public boolean inspector = true; public boolean jobProgressDialog = false; public boolean launchToDocument = true; public boolean notificationChannel = true; @@ -77,6 +78,11 @@ public class TestFeatures implements Features { } @Override + public boolean isInspectorEnabled() { + return inspector; + } + + @Override public boolean isLaunchToDocumentEnabled() { return launchToDocument; } diff --git a/tests/common/com/android/documentsui/testing/TestMenu.java b/tests/common/com/android/documentsui/testing/TestMenu.java index 7ddcf162f..9df06d9b7 100644 --- a/tests/common/com/android/documentsui/testing/TestMenu.java +++ b/tests/common/com/android/documentsui/testing/TestMenu.java @@ -64,6 +64,7 @@ public abstract class TestMenu implements Menu { R.id.action_menu_move_to, R.id.action_menu_compress, R.id.action_menu_rename, + R.id.action_menu_inspector, R.id.action_menu_view_in_owner, R.id.option_menu_search, R.id.option_menu_debug, diff --git a/tests/unit/com/android/documentsui/files/MenuManagerTest.java b/tests/unit/com/android/documentsui/files/MenuManagerTest.java index e3e12f1c2..342021085 100644 --- a/tests/unit/com/android/documentsui/files/MenuManagerTest.java +++ b/tests/unit/com/android/documentsui/files/MenuManagerTest.java @@ -87,6 +87,7 @@ public final class MenuManagerTest { private TestMenuItem actionModeCompress; private TestMenuItem actionModeRename; private TestMenuItem actionModeViewInOwner; + private TestMenuItem actionModeInspector; /* Option Menu items */ private TestMenuItem optionSearch; @@ -143,6 +144,7 @@ public final class MenuManagerTest { actionModeMoveTo = testMenu.findItem(R.id.action_menu_move_to); actionModeCompress = testMenu.findItem(R.id.action_menu_compress); actionModeRename = testMenu.findItem(R.id.action_menu_rename); + actionModeInspector = testMenu.findItem(R.id.action_menu_inspector); actionModeViewInOwner = testMenu.findItem(R.id.action_menu_view_in_owner); optionSearch = testMenu.findItem(R.id.option_menu_search); |