diff options
author | 2016-10-10 10:18:36 -0700 | |
---|---|---|
committer | 2016-10-10 11:16:30 -0700 | |
commit | bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26eb (patch) | |
tree | 6063a6c70fc461c058998fe5359fcf93ca3fd80d | |
parent | 5b0a2c187a9e446b683687817d22cbe443585223 (diff) |
Move full delete logic into ActionHandler.
Was spread across DirectoryFragment and UserInputHandlers.
Drop "android" test package in favor of the generic "testing".
Add an interface for ActionModeController (ActionModeAddons), so can be tested.
Moved ActionModeHandler out of dirlist ../up d dir.
Change-Id: Id915519656f163d3c413fe5d440d866c3ce4e2ca
26 files changed, 272 insertions, 205 deletions
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java index d626b708c..508814980 100644 --- a/src/com/android/documentsui/AbstractActionHandler.java +++ b/src/com/android/documentsui/AbstractActionHandler.java @@ -25,7 +25,6 @@ import android.os.Parcelable; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.base.BooleanConsumer; -import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.Lookup; @@ -34,7 +33,6 @@ import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; import com.android.documentsui.dirlist.AnimationView.AnimationType; import com.android.documentsui.dirlist.DocumentDetails; -import com.android.documentsui.dirlist.Model; import com.android.documentsui.files.LauncherActivity; import com.android.documentsui.files.OpenUriForViewTask; import com.android.documentsui.roots.LoadRootTask; @@ -153,7 +151,7 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> } @Override - public void deleteSelectedDocuments(Model model, ConfirmationCallback callback) { + public void deleteSelectedDocuments() { throw new UnsupportedOperationException("Delete not supported!"); } diff --git a/src/com/android/documentsui/ActionHandler.java b/src/com/android/documentsui/ActionHandler.java index 15ee5bc37..fe6be0e58 100644 --- a/src/com/android/documentsui/ActionHandler.java +++ b/src/com/android/documentsui/ActionHandler.java @@ -22,12 +22,10 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import com.android.documentsui.base.BooleanConsumer; -import com.android.documentsui.base.ConfirmationCallback; 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.dirlist.Model; public interface ActionHandler { @@ -67,7 +65,7 @@ public interface ActionHandler { void showChooserForDoc(DocumentInfo doc); - void deleteSelectedDocuments(Model model, ConfirmationCallback callback); + void deleteSelectedDocuments(); /** * Called when initial activity setup is complete. Implementations diff --git a/src/com/android/documentsui/ActionModeAddons.java b/src/com/android/documentsui/ActionModeAddons.java new file mode 100644 index 000000000..83eba78bb --- /dev/null +++ b/src/com/android/documentsui/ActionModeAddons.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2016 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; + +/** + * Extra ActionMode functionality required by ActionHandlers. + */ +public interface ActionModeAddons { + + void finishActionMode(); + + void finishOnConfirmed(int code); +} diff --git a/src/com/android/documentsui/dirlist/ActionModeController.java b/src/com/android/documentsui/ActionModeController.java index 03582f4bc..a6fe7f13c 100644 --- a/src/com/android/documentsui/dirlist/ActionModeController.java +++ b/src/com/android/documentsui/ActionModeController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.documentsui.dirlist; +package com.android.documentsui; import static com.android.documentsui.base.Shared.DEBUG; @@ -29,9 +29,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; -import com.android.documentsui.MenuManager; import com.android.documentsui.MenuManager.SelectionDetails; -import com.android.documentsui.R; import com.android.documentsui.base.ConfirmationCallback; import com.android.documentsui.base.ConfirmationCallback.Result; import com.android.documentsui.base.EventHandler; @@ -46,7 +44,8 @@ import java.util.function.IntConsumer; /** * A controller that listens to selection changes and manages life cycles of action modes. */ -public class ActionModeController implements SelectionManager.Callback, ActionMode.Callback { +public class ActionModeController + implements SelectionManager.Callback, ActionMode.Callback, ActionModeAddons { private static final String TAG = "ActionModeController"; @@ -55,7 +54,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo private final MenuManager mMenuManager; private final MessageBuilder mMessages; - private final Config mConfig = new Config(); + private final ContentScope mScope = new ContentScope(); private final Selection mSelected = new Selection(); private @Nullable ActionMode mActionMode; @@ -80,7 +79,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo if (mActionMode == null) { if (DEBUG) Log.d(TAG, "Starting action mode."); mActionMode = mActivity.startActionMode(this); - mConfig.hapticPerformer.accept(HapticFeedbackConstants.LONG_PRESS); + mScope.hapticPerformer.accept(HapticFeedbackConstants.LONG_PRESS); } updateActionMenu(); } else { @@ -95,7 +94,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo final String title = mMessages.getQuantityString( R.plurals.elements_selected, mSelected.size()); mActionMode.setTitle(title); - mConfig.accessibilityAnnouncer.accept(title); + mScope.accessibilityAnnouncer.accept(title); } } @@ -120,16 +119,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo final String title = mMessages.getQuantityString( R.plurals.elements_selected, mSelected.size()); mActionMode.setTitle(title); - mConfig.accessibilityAnnouncer.accept(title); - } - } - - void finishActionMode() { - if (mActionMode != null) { - mActionMode.finish(); - mActionMode = null; - } else { - Log.w(TAG, "Tried to finish a null action mode."); + mScope.accessibilityAnnouncer.accept(title); } } @@ -151,7 +141,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo mSelected.clear(); // Re-enable TalkBack for the toolbars, as they are no longer covered by action mode. - mConfig.accessibilityImportanceSetter.setAccessibilityImportance( + mScope.accessibilityImportanceSetter.setAccessibilityImportance( View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, R.id.toolbar, R.id.roots_toolbar); } @@ -165,7 +155,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo // Hide the toolbars if action mode is enabled, so TalkBack doesn't navigate to // these controls when using linear navigation. - mConfig.accessibilityImportanceSetter.setAccessibilityImportance( + mScope.accessibilityImportanceSetter.setAccessibilityImportance( View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, R.id.toolbar, R.id.roots_toolbar); @@ -184,13 +174,13 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo private void updateActionMenu() { assert(mMenu != null); - mMenuManager.updateActionMenu(mMenu, mConfig.selectionDetails); + mMenuManager.updateActionMenu(mMenu, mScope.selectionDetails); Menus.disableHiddenItems(mMenu); } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return mConfig.menuItemClicker.accept(item); + return mScope.menuItemClicker.accept(item); } private static void setImportantForAccessibility( @@ -208,6 +198,17 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo void setAccessibilityImportance(int accessibilityImportance, @IdRes int... viewIds); } + @Override + public void finishActionMode() { + if (mActionMode != null) { + mActionMode.finish(); + mActionMode = null; + } else { + Log.w(TAG, "Tried to finish a null action mode."); + } + } + + @Override public void finishOnConfirmed(@Result int code) { if (code == ConfirmationCallback.CONFIRM) { finishActionMode(); @@ -219,11 +220,11 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo assert(mActionMode == null); assert(mMenu == null); - mConfig.menuItemClicker = menuItemClicker; - mConfig.selectionDetails = selectionDetails; - mConfig.hapticPerformer = view::performHapticFeedback; - mConfig.accessibilityAnnouncer = view::announceForAccessibility; - mConfig.accessibilityImportanceSetter = + mScope.menuItemClicker = menuItemClicker; + mScope.selectionDetails = selectionDetails; + mScope.hapticPerformer = view::performHapticFeedback; + mScope.accessibilityAnnouncer = view::announceForAccessibility; + mScope.accessibilityImportanceSetter = (int accessibilityImportance, @IdRes int[] viewIds) -> { setImportantForAccessibility( mActivity, accessibilityImportance, viewIds); @@ -232,7 +233,7 @@ public class ActionModeController implements SelectionManager.Callback, ActionMo return this; } - private static final class Config { + private static final class ContentScope { private EventHandler<MenuItem> menuItemClicker; private SelectionDetails selectionDetails; private IntConsumer hapticPerformer; diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java index 0f285f51d..005f88795 100644 --- a/src/com/android/documentsui/BaseActivity.java +++ b/src/com/android/documentsui/BaseActivity.java @@ -64,7 +64,6 @@ import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; import com.android.documentsui.base.State.ViewMode; -import com.android.documentsui.dirlist.ActionModeController; import com.android.documentsui.dirlist.AnimationView; import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.dirlist.DocumentsAdapter; diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java index 5bf360fde..c6e95142f 100644 --- a/src/com/android/documentsui/MenuManager.java +++ b/src/com/android/documentsui/MenuManager.java @@ -27,7 +27,6 @@ import com.android.documentsui.base.Menus; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; -import com.android.documentsui.dirlist.ActionModeController; import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.sidebar.RootsFragment; import com.android.internal.annotations.VisibleForTesting; diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java index cb6ffbcba..306644d27 100644 --- a/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -61,6 +61,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.documentsui.ActionHandler; +import com.android.documentsui.ActionModeController; import com.android.documentsui.ActivityConfig; import com.android.documentsui.BaseActivity; import com.android.documentsui.BaseActivity.RetainedState; @@ -100,7 +101,6 @@ import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperationService.OpType; import com.android.documentsui.services.FileOperations; import com.android.documentsui.sorting.SortDimension; -import com.android.documentsui.sorting.SortDimension.SortDirection; import com.android.documentsui.sorting.SortModel; import com.android.documentsui.ui.DialogController; import com.android.documentsui.ui.Snackbars; @@ -182,7 +182,7 @@ public class DirectoryFragment extends Fragment private MessageBar mMessageBar; private View mProgressBar; - private Config mConfig; + private DirectoryState mLocalState; // Note, we use !null to indicate that selection was restored (from rotation). // So don't fiddle with this field unless you've got the bigger picture in mind. @@ -257,8 +257,8 @@ public class DirectoryFragment extends Fragment // Restore state if fragment recreated. Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; - mConfig = new Config(); - mConfig.restore(args); + mLocalState = new DirectoryState(); + mLocalState.restore(args); // Restore any selection we may have squirreled away in retained state. @Nullable RetainedState retained = getBaseActivity().getRetainedState(); @@ -298,7 +298,7 @@ public class DirectoryFragment extends Fragment final BaseActivity activity = getBaseActivity(); mSelectionMgr = activity.getSelectionManager(mAdapter, this::canSetSelectionState); mFocusManager = activity.getFocusManager(mRecView, mModel); - mActions = activity.getActionHandler(mModel, mConfig.mSearchMode); + mActions = activity.getActionHandler(mModel, mLocalState.mSearchMode); mMenuManager = activity.getMenuManager(); mDialogs = activity.getDialogController(); @@ -343,7 +343,6 @@ public class DirectoryFragment extends Fragment (MotionEvent t) -> MotionInputEvent.obtain(t, mRecView), this::canSelect, this::onRightClick, - (DocumentDetails ignored) -> onDeleteSelectedDocuments(), // delete handler mDragStartListener::onTouchDragEvent, gestureHandler); @@ -367,13 +366,13 @@ public class DirectoryFragment extends Fragment final ActivityManager am = (ActivityManager) context.getSystemService( Context.ACTIVITY_SERVICE); - boolean svelte = am.isLowRamDevice() && (mConfig.mType == TYPE_RECENT_OPEN); + boolean svelte = am.isLowRamDevice() && (mLocalState.mType == TYPE_RECENT_OPEN); mIconHelper.setThumbnailsEnabled(!svelte); // If mDocument is null, we sort it by last modified by default because it's in Recents. final boolean prefersLastModified = - (mConfig.mDocument != null) - ? (mConfig.mDocument.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0 + (mLocalState.mDocument != null) + ? (mLocalState.mDocument.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0 : true; // Call this before adding the listener to avoid restarting the loader one more time state.sortModel.setDefaultDimension( @@ -403,7 +402,7 @@ public class DirectoryFragment extends Fragment final SparseArray<Parcelable> container = new SparseArray<>(); getView().saveHierarchyState(container); final State state = getDisplayState(); - state.dirConfigs.put(mConfig.getConfigKey(), container); + state.dirConfigs.put(mLocalState.getConfigKey(), container); } public void retainState(RetainedState state) { @@ -414,7 +413,7 @@ public class DirectoryFragment extends Fragment public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - mConfig.save(outState); + mLocalState.save(outState); } @Override @@ -453,7 +452,7 @@ public class DirectoryFragment extends Fragment private void handleCopyResult(int resultCode, Intent data) { - FileOperation operation = mConfig.claimPendingOperation(); + FileOperation operation = mLocalState.claimPendingOperation(); if (resultCode == Activity.RESULT_CANCELED || data == null) { // User pressed the back button or otherwise cancelled the destination pick. Don't @@ -585,8 +584,7 @@ public class DirectoryFragment extends Fragment case R.id.menu_delete: // deleteDocuments will end action mode if the documents are deleted. // It won't end action mode if user cancels the delete. - mActions.deleteSelectedDocuments( - mModel, mActionModeController::finishOnConfirmed); + mActions.deleteSelectedDocuments(); return true; case R.id.menu_copy_to: @@ -726,15 +724,8 @@ public class DirectoryFragment extends Fragment startActivity(intent); } - private boolean onDeleteSelectedDocuments() { - if (mSelectionMgr.hasSelection()) { - mActions.deleteSelectedDocuments(mModel, mActionModeController::finishOnConfirmed); - } - return false; - } - private void transferDocuments(final Selection selected, final @OpType int mode) { - if(mode == FileOperationService.OPERATION_COPY) { + if (mode == FileOperationService.OPERATION_COPY) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_COPY_TO); } else if (mode == FileOperationService.OPERATION_MOVE) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_MOVE_TO); @@ -757,7 +748,7 @@ public class DirectoryFragment extends Fragment } Uri srcParent = getDisplayState().stack.peek().derivedUri; - mConfig.mPendingOperation = new FileOperation.Builder() + mLocalState.mPendingOperation = new FileOperation.Builder() .withOpType(mode) .withSrcParent(srcParent) .withSrcs(srcs) @@ -1146,7 +1137,7 @@ public class DirectoryFragment extends Fragment mProgressBar.setVisibility(mModel.isLoading() ? View.VISIBLE : View.GONE); if (mModel.isEmpty()) { - if (mConfig.mSearchMode) { + if (mLocalState.mSearchMode) { showNoResults(getDisplayState().stack.root); } else { showEmptyDirectory(); @@ -1201,7 +1192,7 @@ public class DirectoryFragment extends Fragment String query) { DirectoryFragment df = get(fm); - df.mConfig.update(root, doc, query); + df.mLocalState.update(root, doc, query); df.getLoaderManager().restartLoader(LOADER_ID, null, df); } @@ -1210,7 +1201,7 @@ public class DirectoryFragment extends Fragment if (DEBUG) Log.d(TAG, "Reloading directory: " + DocumentInfo.debugString(doc)); DirectoryFragment df = get(fm); - df.mConfig.update(type, root, doc, query); + df.mLocalState.update(type, root, doc, query); df.getLoaderManager().restartLoader(LOADER_ID, null, df); } @@ -1281,39 +1272,39 @@ public class DirectoryFragment extends Fragment State state = getDisplayState(); Uri contentsUri; - switch (mConfig.mType) { + switch (mLocalState.mType) { case TYPE_NORMAL: - contentsUri = mConfig.mSearchMode ? DocumentsContract.buildSearchDocumentsUri( - mConfig.mRoot.authority, mConfig.mRoot.rootId, mConfig.mQuery) + contentsUri = mLocalState.mSearchMode ? DocumentsContract.buildSearchDocumentsUri( + mLocalState.mRoot.authority, mLocalState.mRoot.rootId, mLocalState.mQuery) : DocumentsContract.buildChildDocumentsUri( - mConfig.mDocument.authority, mConfig.mDocument.documentId); + mLocalState.mDocument.authority, mLocalState.mDocument.documentId); if (mActivityConfig.managedModeEnabled(state.stack)) { contentsUri = DocumentsContract.setManageMode(contentsUri); } if (DEBUG) Log.d(TAG, "Creating new directory loader for: " - + DocumentInfo.debugString(mConfig.mDocument)); + + DocumentInfo.debugString(mLocalState.mDocument)); return new DirectoryLoader( - context, mConfig.mRoot, mConfig.mDocument, contentsUri, state.sortModel, - mConfig.mSearchMode); + context, mLocalState.mRoot, mLocalState.mDocument, contentsUri, state.sortModel, + mLocalState.mSearchMode); case TYPE_RECENT_OPEN: if (DEBUG) Log.d(TAG, "Creating new loader recents."); final RootsAccess roots = DocumentsApplication.getRootsCache(context); return new RecentsLoader(context, roots, state); default: - throw new IllegalStateException("Unknown type " + mConfig.mType); + throw new IllegalStateException("Unknown type " + mLocalState.mType); } } @Override public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { if (DEBUG) Log.d(TAG, "Loader has finished for: " - + DocumentInfo.debugString(mConfig.mDocument)); + + DocumentInfo.debugString(mLocalState.mDocument)); assert(result != null); if (!isAdded()) return; - if (mConfig.mSearchMode) { + if (mLocalState.mSearchMode) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SEARCH); } @@ -1332,22 +1323,22 @@ public class DirectoryFragment extends Fragment } // Restore any previous instance state - final SparseArray<Parcelable> container = state.dirConfigs.remove(mConfig.getConfigKey()); + final SparseArray<Parcelable> container = state.dirConfigs.remove(mLocalState.getConfigKey()); final int curSortedDimensionId = state.sortModel.getSortedDimensionId(); final SortDimension curSortedDimension = state.sortModel.getDimensionById(curSortedDimensionId); if (container != null && !getArguments().getBoolean(Shared.EXTRA_IGNORE_STATE, false)) { getView().restoreHierarchyState(container); - } else if (mConfig.mLastSortDimensionId != curSortedDimension.getId() - || mConfig.mLastSortDimensionId == SortModel.SORT_DIMENSION_ID_UNKNOWN - || mConfig.mLastSortDirection != curSortedDimension.getSortDirection()) { + } else if (mLocalState.mLastSortDimensionId != curSortedDimension.getId() + || mLocalState.mLastSortDimensionId == SortModel.SORT_DIMENSION_ID_UNKNOWN + || mLocalState.mLastSortDirection != curSortedDimension.getSortDirection()) { // Scroll to the top if the sort order actually changed. mRecView.smoothScrollToPosition(0); } - mConfig.mLastSortDimensionId = curSortedDimension.getId(); - mConfig.mLastSortDirection = curSortedDimension.getSortDirection(); + mLocalState.mLastSortDimensionId = curSortedDimension.getId(); + mLocalState.mLastSortDirection = curSortedDimension.getSortDirection(); if (mRefreshLayout.isRefreshing()) { new Handler().postDelayed( @@ -1359,81 +1350,9 @@ public class DirectoryFragment extends Fragment @Override public void onLoaderReset(Loader<DirectoryResult> loader) { if (DEBUG) Log.d(TAG, "Resetting loader for: " - + DocumentInfo.debugString(mConfig.mDocument)); + + DocumentInfo.debugString(mLocalState.mDocument)); mModel.onLoaderReset(); mRefreshLayout.setRefreshing(false); } - - private static final class Config { - - private static final String EXTRA_SORT_DIMENSION_ID = "sortDimensionId"; - private static final String EXTRA_SORT_DIRECTION = "sortDirection"; - - // Directory fragment state is defined by: root, document, query, type, selection - private @ResultType int mType = TYPE_NORMAL; - private RootInfo mRoot; - // Null when viewing Recents directory. - private @Nullable DocumentInfo mDocument; - private String mQuery = null; - // Here we save the clip details of moveTo/copyTo actions when picker shows up. - // This will be written to saved instance. - private @Nullable FileOperation mPendingOperation; - private boolean mSearchMode; - private int mLastSortDimensionId = SortModel.SORT_DIMENSION_ID_UNKNOWN; - private @SortDirection int mLastSortDirection; - - private String mConfigKey; - - public void restore(Bundle bundle) { - mRoot = bundle.getParcelable(Shared.EXTRA_ROOT); - mDocument = bundle.getParcelable(Shared.EXTRA_DOC); - mQuery = bundle.getString(Shared.EXTRA_QUERY); - mType = bundle.getInt(Shared.EXTRA_TYPE); - mSearchMode = bundle.getBoolean(Shared.EXTRA_SEARCH_MODE); - mPendingOperation = bundle.getParcelable(FileOperationService.EXTRA_OPERATION); - mLastSortDimensionId = bundle.getInt(EXTRA_SORT_DIMENSION_ID); - mLastSortDirection = bundle.getInt(EXTRA_SORT_DIRECTION); - } - - public void save(Bundle bundle) { - bundle.putInt(Shared.EXTRA_TYPE, mType); - bundle.putParcelable(Shared.EXTRA_ROOT, mRoot); - bundle.putParcelable(Shared.EXTRA_DOC, mDocument); - bundle.putString(Shared.EXTRA_QUERY, mQuery); - bundle.putBoolean(Shared.EXTRA_SEARCH_MODE, mSearchMode); - bundle.putParcelable(FileOperationService.EXTRA_OPERATION, mPendingOperation); - bundle.putInt(EXTRA_SORT_DIMENSION_ID, mLastSortDimensionId); - bundle.putInt(EXTRA_SORT_DIRECTION, mLastSortDirection); - } - - public FileOperation claimPendingOperation() { - FileOperation op = mPendingOperation; - mPendingOperation = null; - return op; - } - - public void update(int type, RootInfo root, DocumentInfo doc, String query) { - mType = type; - update(root, doc, query); - } - - public void update(RootInfo root, DocumentInfo doc, String query) { - mQuery = query; - mRoot = root; - mDocument = doc; - mSearchMode = query != null; - } - - private String getConfigKey() { - if (mConfigKey == null) { - final StringBuilder builder = new StringBuilder(); - builder.append(mRoot != null ? mRoot.authority : "null").append(';'); - builder.append(mRoot != null ? mRoot.rootId : "null").append(';'); - builder.append(mDocument != null ? mDocument.documentId : "null"); - mConfigKey = builder.toString(); - } - return mConfigKey; - } - } } diff --git a/src/com/android/documentsui/dirlist/DirectoryState.java b/src/com/android/documentsui/dirlist/DirectoryState.java new file mode 100644 index 000000000..6b849a2b4 --- /dev/null +++ b/src/com/android/documentsui/dirlist/DirectoryState.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2016 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.dirlist; + +import android.os.Bundle; + +import com.android.documentsui.base.DocumentInfo; +import com.android.documentsui.base.RootInfo; +import com.android.documentsui.base.Shared; +import com.android.documentsui.dirlist.DirectoryFragment.ResultType; +import com.android.documentsui.services.FileOperation; +import com.android.documentsui.services.FileOperationService; +import com.android.documentsui.sorting.SortModel; +import com.android.documentsui.sorting.SortDimension.SortDirection; + +import javax.annotation.Nullable; + +final class DirectoryState { + + private static final String EXTRA_SORT_DIMENSION_ID = "sortDimensionId"; + private static final String EXTRA_SORT_DIRECTION = "sortDirection"; + + // Directory fragment state is defined by: root, document, query, type, selection + @ResultType int mType = DirectoryFragment.TYPE_NORMAL; + RootInfo mRoot; + // Null when viewing Recents directory. + @Nullable DocumentInfo mDocument; + String mQuery = null; + // Here we save the clip details of moveTo/copyTo actions when picker shows up. + // This will be written to saved instance. + @Nullable FileOperation mPendingOperation; + boolean mSearchMode; + int mLastSortDimensionId = SortModel.SORT_DIMENSION_ID_UNKNOWN; + @SortDirection int mLastSortDirection; + + private String mConfigKey; + + public void restore(Bundle bundle) { + mRoot = bundle.getParcelable(Shared.EXTRA_ROOT); + mDocument = bundle.getParcelable(Shared.EXTRA_DOC); + mQuery = bundle.getString(Shared.EXTRA_QUERY); + mType = bundle.getInt(Shared.EXTRA_TYPE); + mSearchMode = bundle.getBoolean(Shared.EXTRA_SEARCH_MODE); + mPendingOperation = bundle.getParcelable(FileOperationService.EXTRA_OPERATION); + mLastSortDimensionId = bundle.getInt(EXTRA_SORT_DIMENSION_ID); + mLastSortDirection = bundle.getInt(EXTRA_SORT_DIRECTION); + } + + public void save(Bundle bundle) { + bundle.putInt(Shared.EXTRA_TYPE, mType); + bundle.putParcelable(Shared.EXTRA_ROOT, mRoot); + bundle.putParcelable(Shared.EXTRA_DOC, mDocument); + bundle.putString(Shared.EXTRA_QUERY, mQuery); + bundle.putBoolean(Shared.EXTRA_SEARCH_MODE, mSearchMode); + bundle.putParcelable(FileOperationService.EXTRA_OPERATION, mPendingOperation); + bundle.putInt(EXTRA_SORT_DIMENSION_ID, mLastSortDimensionId); + bundle.putInt(EXTRA_SORT_DIRECTION, mLastSortDirection); + } + + public FileOperation claimPendingOperation() { + FileOperation op = mPendingOperation; + mPendingOperation = null; + return op; + } + + public void update(int type, RootInfo root, DocumentInfo doc, String query) { + mType = type; + update(root, doc, query); + } + + public void update(RootInfo root, DocumentInfo doc, String query) { + mQuery = query; + mRoot = root; + mDocument = doc; + mSearchMode = query != null; + } + + String getConfigKey() { + if (mConfigKey == null) { + final StringBuilder builder = new StringBuilder(); + builder.append(mRoot != null ? mRoot.authority : "null").append(';'); + builder.append(mRoot != null ? mRoot.rootId : "null").append(';'); + builder.append(mDocument != null ? mDocument.documentId : "null"); + mConfigKey = builder.toString(); + } + return mConfigKey; + } +}
\ No newline at end of file diff --git a/src/com/android/documentsui/dirlist/UserInputHandler.java b/src/com/android/documentsui/dirlist/UserInputHandler.java index 4af1fcdfb..03d40fa38 100644 --- a/src/com/android/documentsui/dirlist/UserInputHandler.java +++ b/src/com/android/documentsui/dirlist/UserInputHandler.java @@ -45,14 +45,13 @@ public final class UserInputHandler<T extends InputEvent> private static final String TAG = "UserInputHandler"; - private ActionHandler mActionHandler; + private ActionHandler mActions; private final FocusHandler mFocusHandler; private final SelectionManager mSelectionMgr; private final Function<MotionEvent, T> mEventConverter; private final Predicate<DocumentDetails> mSelectable; private final EventHandler<InputEvent> mRightClickHandler; - private final EventHandler<DocumentDetails> mDeleteHandler; private final EventHandler<InputEvent> mTouchDragListener; private final EventHandler<InputEvent> mGestureSelectHandler; @@ -62,23 +61,21 @@ public final class UserInputHandler<T extends InputEvent> private final KeyInputHandler mKeyListener; public UserInputHandler( - ActionHandler actionHandler, + ActionHandler actions, FocusHandler focusHandler, SelectionManager selectionMgr, Function<MotionEvent, T> eventConverter, Predicate<DocumentDetails> selectable, EventHandler<InputEvent> rightClickHandler, - EventHandler<DocumentDetails> deleteHandler, EventHandler<InputEvent> touchDragListener, EventHandler<InputEvent> gestureSelectHandler) { - mActionHandler = actionHandler; + mActions = actions; mFocusHandler = focusHandler; mSelectionMgr = selectionMgr; mEventConverter = eventConverter; mSelectable = selectable; mRightClickHandler = rightClickHandler; - mDeleteHandler = deleteHandler; mTouchDragListener = touchDragListener; mGestureSelectHandler = gestureSelectHandler; @@ -246,7 +243,7 @@ public final class UserInputHandler<T extends InputEvent> // otherwise they activate. return doc.isInSelectionHotspot(event) ? selectDocument(doc) - : mActionHandler.openDocument(doc); + : mActions.openDocument(doc); } boolean onSingleTapConfirmed(T event) { @@ -380,7 +377,7 @@ public final class UserInputHandler<T extends InputEvent> } DocumentDetails doc = event.getDocumentDetails(); - return mActionHandler.viewDocument(doc); + return mActions.viewDocument(doc); } final void onLongPress(T event) { @@ -447,14 +444,14 @@ public final class UserInputHandler<T extends InputEvent> // For non-shifted enter keypresses, fall through. case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_BUTTON_A: - return mActionHandler.viewDocument(doc); + return mActions.viewDocument(doc); case KeyEvent.KEYCODE_SPACE: - return mActionHandler.previewDocument(doc); + return mActions.previewDocument(doc); case KeyEvent.KEYCODE_FORWARD_DEL: // This has to be handled here instead of in a keyboard shortcut, because // keyboard shortcuts all have to be modified with the 'Ctrl' key. if (mSelectionMgr.hasSelection()) { - mDeleteHandler.accept(doc); + mActions.deleteSelectedDocuments(); } // Always handle the key, even if there was nothing to delete. This is a // precaution to prevent other handlers from potentially picking up the event diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java index e31d58733..993af3641 100644 --- a/src/com/android/documentsui/files/ActionHandler.java +++ b/src/com/android/documentsui/files/ActionHandler.java @@ -27,6 +27,7 @@ import android.provider.DocumentsContract; import android.util.Log; import com.android.documentsui.AbstractActionHandler; +import com.android.documentsui.ActionModeAddons; import com.android.documentsui.ActivityConfig; import com.android.documentsui.DocumentsAccess; import com.android.documentsui.DocumentsApplication; @@ -69,6 +70,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa private static final String TAG = "ManagerActionHandler"; + private final ActionModeAddons mActionModeAddons; private final DialogController mDialogs; private final ActivityConfig mActConfig; private final DocumentClipper mClipper; @@ -82,6 +84,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa DocumentsAccess docs, SelectionManager selectionMgr, Lookup<String, Executor> executors, + ActionModeAddons actionModeAddons, DialogController dialogs, ActivityConfig tuner, DocumentClipper clipper, @@ -89,6 +92,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa super(activity, state, roots, docs, selectionMgr, executors); + mActionModeAddons = actionModeAddons; mDialogs = dialogs; mActConfig = tuner; mClipper = clipper; @@ -181,7 +185,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa } @Override - public void deleteSelectedDocuments(Model model, ConfirmationCallback callback) { + public void deleteSelectedDocuments() { assert(mSelectionMgr.hasSelection()); Metrics.logUserAction(mActivity, Metrics.USER_ACTION_DELETE); @@ -193,11 +197,11 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa assert(srcParent != null); // Model must be accessed in UI thread, since underlying cursor is not threadsafe. - List<DocumentInfo> docs = model.getDocuments(selection); + List<DocumentInfo> docs = mScope.model.getDocuments(selection); ConfirmationCallback result = (@Result int code) -> { // share the news with our caller, be it good or bad. - callback.accept(code); + mActionModeAddons.finishOnConfirmed(code); if (code != ConfirmationCallback.CONFIRM) { return; @@ -207,7 +211,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa try { srcs = UrisSupplier.create( selection, - model::getItemUri, + mScope.model::getItemUri, mClipStore); } catch (IOException e) { throw new RuntimeException("Failed to create uri supplier.", e); diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java index 448b7e9ac..500bcf74a 100644 --- a/src/com/android/documentsui/files/FilesActivity.java +++ b/src/com/android/documentsui/files/FilesActivity.java @@ -32,6 +32,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.android.documentsui.ActionModeController; import com.android.documentsui.ActivityConfig; import com.android.documentsui.BaseActivity; import com.android.documentsui.DocumentsAccess; @@ -49,7 +50,6 @@ import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; import com.android.documentsui.clipping.DocumentClipper; -import com.android.documentsui.dirlist.ActionModeController; import com.android.documentsui.dirlist.AnimationView.AnimationType; import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.dirlist.DocumentsAdapter; @@ -100,6 +100,13 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons }); mDialogs = DialogController.create(this, getMessages()); + + mActionModeController = new ActionModeController( + this, + mSelectionMgr, + mMenuManager, + getMessages()); + mActions = new ActionHandler<>( this, mState, @@ -107,17 +114,12 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons DocumentsAccess.create(this), mSelectionMgr, ProviderExecutor::forAuthority, + mActionModeController, mDialogs, mConfig, mClipper, DocumentsApplication.getClipStore(this)); - mActionModeController = new ActionModeController( - this, - mSelectionMgr, - mMenuManager, - getMessages()); - RootsFragment.show(getFragmentManager(), null); final Intent intent = getIntent(); diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java index 12dd19b18..42d32ae15 100644 --- a/src/com/android/documentsui/picker/PickActivity.java +++ b/src/com/android/documentsui/picker/PickActivity.java @@ -43,6 +43,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.android.documentsui.ActionModeController; import com.android.documentsui.ActivityConfig; import com.android.documentsui.BaseActivity; import com.android.documentsui.DocumentsAccess; @@ -58,7 +59,6 @@ import com.android.documentsui.base.PairedTask; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; -import com.android.documentsui.dirlist.ActionModeController; import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.dirlist.DocumentsAdapter; import com.android.documentsui.dirlist.Model; diff --git a/tests/common/com/android/documentsui/TestActionModeAddons.java b/tests/common/com/android/documentsui/TestActionModeAddons.java new file mode 100644 index 000000000..5e7b7d768 --- /dev/null +++ b/tests/common/com/android/documentsui/TestActionModeAddons.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 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 com.android.documentsui.testing.TestConfirmationCallback; + +/** + * + */ +public class TestActionModeAddons implements ActionModeAddons { + + public final TestConfirmationCallback finishOnConfimed = new TestConfirmationCallback(); + + @Override + public void finishActionMode() { + throw new UnsupportedOperationException(); + } + + @Override + public void finishOnConfirmed(int code) { + finishOnConfimed.accept(code); + } +} diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java index a2a7b55d5..9fc4fcaed 100644 --- a/tests/common/com/android/documentsui/TestActivity.java +++ b/tests/common/com/android/documentsui/TestActivity.java @@ -29,8 +29,8 @@ import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.RootInfo; import com.android.documentsui.testing.TestEventListener; -import com.android.documentsui.testing.android.TestPackageManager; -import com.android.documentsui.testing.android.TestResources; +import com.android.documentsui.testing.TestPackageManager; +import com.android.documentsui.testing.TestResources; import org.mockito.Mockito; diff --git a/tests/common/com/android/documentsui/testing/dirlist/SelectionProbe.java b/tests/common/com/android/documentsui/selection/SelectionProbe.java index 9cadf71b2..c0973d61b 100644 --- a/tests/common/com/android/documentsui/testing/dirlist/SelectionProbe.java +++ b/tests/common/com/android/documentsui/selection/SelectionProbe.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.documentsui.testing.dirlist; +package com.android.documentsui.selection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/tests/common/com/android/documentsui/testing/dirlist/TestSelectionListener.java b/tests/common/com/android/documentsui/selection/TestSelectionListener.java index 14eac8f09..62a86b0bd 100644 --- a/tests/common/com/android/documentsui/testing/dirlist/TestSelectionListener.java +++ b/tests/common/com/android/documentsui/selection/TestSelectionListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.documentsui.testing.dirlist; +package com.android.documentsui.selection; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/tests/common/com/android/documentsui/testing/android/TestPackageManager.java b/tests/common/com/android/documentsui/testing/TestPackageManager.java index a5b28b1f2..7b1d8dc32 100644 --- a/tests/common/com/android/documentsui/testing/android/TestPackageManager.java +++ b/tests/common/com/android/documentsui/testing/TestPackageManager.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.documentsui.testing.android; +package com.android.documentsui.testing; import android.annotation.UserIdInt; import android.content.Intent; diff --git a/tests/common/com/android/documentsui/testing/android/TestResources.java b/tests/common/com/android/documentsui/testing/TestResources.java index c962e77c0..206d46b88 100644 --- a/tests/common/com/android/documentsui/testing/android/TestResources.java +++ b/tests/common/com/android/documentsui/testing/TestResources.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.documentsui.testing.android; +package com.android.documentsui.testing; import android.annotation.BoolRes; import android.annotation.NonNull; diff --git a/tests/common/com/android/documentsui/testing/TestRootsAccess.java b/tests/common/com/android/documentsui/testing/TestRootsAccess.java index 734d52193..0a2fbd21b 100644 --- a/tests/common/com/android/documentsui/testing/TestRootsAccess.java +++ b/tests/common/com/android/documentsui/testing/TestRootsAccess.java @@ -18,7 +18,6 @@ package com.android.documentsui.testing; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.State; import com.android.documentsui.roots.RootsAccess; -import com.android.documentsui.testing.android.TestPackageManager; import java.util.ArrayList; import java.util.Collection; diff --git a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_KeyboardTest.java b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_KeyboardTest.java index 0777f2f49..98d3cc00c 100644 --- a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_KeyboardTest.java +++ b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_KeyboardTest.java @@ -23,13 +23,13 @@ import android.view.MotionEvent; import com.android.documentsui.base.Events.InputEvent; import com.android.documentsui.selection.SelectionManager; +import com.android.documentsui.selection.SelectionProbe; import com.android.documentsui.testing.SelectionManagers; import com.android.documentsui.testing.TestActionHandler; import com.android.documentsui.testing.TestEvent; +import com.android.documentsui.testing.TestEvent.Builder; import com.android.documentsui.testing.TestEventHandler; import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.TestEvent.Builder; -import com.android.documentsui.testing.dirlist.SelectionProbe; import org.junit.Before; import org.junit.Test; @@ -50,7 +50,6 @@ public final class UserInputHandler_KeyboardTest { private TestPredicate<DocumentDetails> mCanSelect; private TestEventHandler<InputEvent> mRightClickHandler; - private TestEventHandler<DocumentDetails> mDeleteHandler; private TestEventHandler<InputEvent> mDragAndDropHandler; private TestEventHandler<InputEvent> mGestureSelectHandler; @@ -65,7 +64,6 @@ public final class UserInputHandler_KeyboardTest { mFocusHandler = new TestFocusHandler(); mCanSelect = new TestPredicate<>(); mRightClickHandler = new TestEventHandler<>(); - mDeleteHandler = new TestEventHandler<>(); mDragAndDropHandler = new TestEventHandler<>(); mGestureSelectHandler = new TestEventHandler<>(); @@ -78,7 +76,6 @@ public final class UserInputHandler_KeyboardTest { }, mCanSelect, mRightClickHandler::accept, - mDeleteHandler::accept, mDragAndDropHandler::accept, mGestureSelectHandler::accept); diff --git a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java index 787652a80..8d7ba82f7 100644 --- a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java +++ b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java @@ -25,13 +25,13 @@ import android.view.MotionEvent; import com.android.documentsui.base.Events.InputEvent; import com.android.documentsui.selection.SelectionManager; +import com.android.documentsui.selection.SelectionProbe; import com.android.documentsui.testing.SelectionManagers; import com.android.documentsui.testing.TestActionHandler; import com.android.documentsui.testing.TestEvent; import com.android.documentsui.testing.TestEvent.Builder; import com.android.documentsui.testing.TestEventHandler; import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; import org.junit.Before; import org.junit.Test; @@ -50,7 +50,6 @@ public final class UserInputHandler_MouseTest { private SelectionProbe mSelection; private TestPredicate<DocumentDetails> mCanSelect; private TestEventHandler<InputEvent> mRightClickHandler; - private TestEventHandler<DocumentDetails> mDeleteHandler; private TestEventHandler<InputEvent> mDragAndDropHandler; private TestEventHandler<InputEvent> mGestureSelectHandler; @@ -65,7 +64,6 @@ public final class UserInputHandler_MouseTest { mSelection = new SelectionProbe(selectionMgr); mCanSelect = new TestPredicate<>(); mRightClickHandler = new TestEventHandler<>(); - mDeleteHandler = new TestEventHandler<>(); mDragAndDropHandler = new TestEventHandler<>(); mGestureSelectHandler = new TestEventHandler<>(); @@ -78,7 +76,6 @@ public final class UserInputHandler_MouseTest { }, mCanSelect, mRightClickHandler::accept, - mDeleteHandler::accept, mDragAndDropHandler::accept, mGestureSelectHandler::accept); diff --git a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java index c34322e91..f9ca6f603 100644 --- a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java +++ b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java @@ -22,13 +22,13 @@ import android.view.MotionEvent; import com.android.documentsui.base.Events.InputEvent; import com.android.documentsui.selection.SelectionManager; +import com.android.documentsui.selection.SelectionProbe; import com.android.documentsui.testing.SelectionManagers; import com.android.documentsui.testing.TestActionHandler; import com.android.documentsui.testing.TestEvent; import com.android.documentsui.testing.TestEvent.Builder; import com.android.documentsui.testing.TestEventHandler; import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; import org.junit.Before; import org.junit.Test; @@ -52,7 +52,6 @@ public final class UserInputHandler_RangeTest { private SelectionProbe mSelection; private TestPredicate<DocumentDetails> mCanSelect; private TestEventHandler<InputEvent> mRightClickHandler; - private TestEventHandler<DocumentDetails> mDeleteHandler; private TestEventHandler<InputEvent> mDragAndDropHandler; private TestEventHandler<InputEvent> mGestureSelectHandler; private Builder mEvent; @@ -66,7 +65,6 @@ public final class UserInputHandler_RangeTest { mSelection = new SelectionProbe(selectionMgr); mCanSelect = new TestPredicate<>(); mRightClickHandler = new TestEventHandler<>(); - mDeleteHandler = new TestEventHandler<>(); mDragAndDropHandler = new TestEventHandler<>(); mGestureSelectHandler = new TestEventHandler<>(); @@ -79,7 +77,6 @@ public final class UserInputHandler_RangeTest { }, mCanSelect, mRightClickHandler::accept, - mDeleteHandler::accept, mDragAndDropHandler::accept, mGestureSelectHandler::accept); diff --git a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java index f8ad916ed..797f11d1e 100644 --- a/tests/unit/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java +++ b/tests/unit/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java @@ -25,13 +25,13 @@ import android.view.MotionEvent; import com.android.documentsui.base.Events.InputEvent; import com.android.documentsui.selection.SelectionManager; +import com.android.documentsui.selection.SelectionProbe; import com.android.documentsui.testing.SelectionManagers; import com.android.documentsui.testing.TestActionHandler; import com.android.documentsui.testing.TestEvent; import com.android.documentsui.testing.TestEvent.Builder; import com.android.documentsui.testing.TestEventHandler; import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; import org.junit.Before; import org.junit.Test; @@ -51,7 +51,6 @@ public final class UserInputHandler_TouchTest { private SelectionProbe mSelection; private TestPredicate<DocumentDetails> mCanSelect; private TestEventHandler<InputEvent> mRightClickHandler; - private TestEventHandler<DocumentDetails> mDeleteHandler; private TestEventHandler<InputEvent> mDragAndDropHandler; private TestEventHandler<InputEvent> mGestureSelectHandler; @@ -66,7 +65,6 @@ public final class UserInputHandler_TouchTest { mSelection = new SelectionProbe(selectionMgr); mCanSelect = new TestPredicate<>(); mRightClickHandler = new TestEventHandler<>(); - mDeleteHandler = new TestEventHandler<>(); mDragAndDropHandler = new TestEventHandler<>(); mGestureSelectHandler = new TestEventHandler<>(); @@ -79,7 +77,6 @@ public final class UserInputHandler_TouchTest { }, mCanSelect, mRightClickHandler::accept, - mDeleteHandler::accept, mDragAndDropHandler::accept, mGestureSelectHandler::accept); diff --git a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java index 1583b4101..2620f14e9 100644 --- a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java +++ b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java @@ -27,6 +27,7 @@ import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; import com.android.documentsui.R; +import com.android.documentsui.TestActionModeAddons; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; @@ -47,6 +48,7 @@ public class ActionHandlerTest { private TestEnv mEnv; private TestActivity mActivity; + private TestActionModeAddons mActionModeAddons; private TestDialogController mDialogs; private TestConfirmationCallback mCallback; private ActionHandler<TestActivity> mHandler; @@ -55,6 +57,7 @@ public class ActionHandlerTest { public void setUp() { mEnv = TestEnv.create(); mActivity = TestActivity.create(); + mActionModeAddons = new TestActionModeAddons(); mDialogs = new TestDialogController(); mCallback = new TestConfirmationCallback(); mEnv.roots.configurePm(mActivity.packageMgr); @@ -66,6 +69,7 @@ public class ActionHandlerTest { mEnv.docs, mEnv.selectionMgr, mEnv::lookupExecutor, + mActionModeAddons, mDialogs, null, // tuner, not currently used. null, // clipper, only used in drag/drop @@ -106,10 +110,10 @@ public class ActionHandlerTest { public void testDeleteDocuments() { mEnv.populateStack(); - mHandler.deleteSelectedDocuments(mEnv.model, mCallback); + mHandler.deleteSelectedDocuments(); mDialogs.assertNoFileFailures(); mActivity.startService.assertCalled(); - mCallback.assertConfirmed(); + mActionModeAddons.finishOnConfimed.assertConfirmed(); } @Test @@ -117,10 +121,10 @@ public class ActionHandlerTest { mEnv.populateStack(); mDialogs.rejectNext(); - mHandler.deleteSelectedDocuments(mEnv.model, mCallback); + mHandler.deleteSelectedDocuments(); mDialogs.assertNoFileFailures(); mActivity.startService.assertNotCalled(); - mCallback.assertRejected(); + mActionModeAddons.finishOnConfimed.assertRejected(); } @Test diff --git a/tests/unit/com/android/documentsui/selection/SelectionManagerTest.java b/tests/unit/com/android/documentsui/selection/SelectionManagerTest.java index d522efdf2..d25395a7d 100644 --- a/tests/unit/com/android/documentsui/selection/SelectionManagerTest.java +++ b/tests/unit/com/android/documentsui/selection/SelectionManagerTest.java @@ -24,8 +24,6 @@ import com.android.documentsui.selection.SelectionManager; import com.android.documentsui.dirlist.TestData; import com.android.documentsui.selection.Selection; import com.android.documentsui.testing.SelectionManagers; -import com.android.documentsui.testing.dirlist.SelectionProbe; -import com.android.documentsui.testing.dirlist.TestSelectionListener; import org.junit.Before; import org.junit.Test; diff --git a/tests/unit/com/android/documentsui/selection/SelectionManager_SingleSelectTest.java b/tests/unit/com/android/documentsui/selection/SelectionManager_SingleSelectTest.java index d2a546c96..b25c1c072 100644 --- a/tests/unit/com/android/documentsui/selection/SelectionManager_SingleSelectTest.java +++ b/tests/unit/com/android/documentsui/selection/SelectionManager_SingleSelectTest.java @@ -25,8 +25,6 @@ import com.android.documentsui.dirlist.TestData; import com.android.documentsui.dirlist.TestDocumentsAdapter; import com.android.documentsui.selection.SelectionManager; import com.android.documentsui.testing.SelectionManagers; -import com.android.documentsui.testing.dirlist.SelectionProbe; -import com.android.documentsui.testing.dirlist.TestSelectionListener; import org.junit.Before; import org.junit.Test; |