Loading src/com/android/documentsui/dirlist/DocsSelectionPredicate.java +8 −3 Original line number Diff line number Diff line Loading @@ -16,15 +16,16 @@ package com.android.documentsui.dirlist; import static androidx.core.util.Preconditions.checkArgument; import static com.android.documentsui.base.DocumentInfo.getCursorInt; import static com.android.documentsui.base.DocumentInfo.getCursorString; import android.database.Cursor; import android.provider.DocumentsContract.Document; import android.util.Log; import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate; import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import com.android.documentsui.ActivityConfig; import com.android.documentsui.Model; Loading Loading @@ -89,9 +90,13 @@ final class DocsSelectionPredicate extends SelectionPredicate<String> { // The band selection model only operates on documents and directories. // Exclude other types of adapter items like whitespace and dividers. RecyclerView.ViewHolder vh = mRecView.findViewHolderForAdapterPosition(position); final RecyclerView.ViewHolder vh = mRecView.findViewHolderForAdapterPosition(position); if (vh == null) { return false; } else { return ModelBackedDocumentsAdapter.isContentType(vh.getItemViewType()); } } @Override public boolean canSelectMultiple() { Loading tests/common/com/android/documentsui/bots/GestureBot.java +26 −9 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ public class GestureBot extends Bots.BaseBot { private static final int STEPS_INBETWEEN_POINTS = 2; // Inserted after each motion event injection. private static final int MOTION_EVENT_INJECTION_DELAY_MILLIS = 5; private static final int LONG_PRESS_EVENT_INJECTION_DELAY_MILIS = 1000; private final String mDirContainerId; private final String mDirListId; private final UiAutomation mAutomation; Loading Loading @@ -82,10 +83,21 @@ public class GestureBot extends Bots.BaseBot { bandSelection(start, end, BAND_SELECTION_DEFAULT_STEPS); } public void fingerSelection(Point start, Point end) throws Exception { fingerSelection(start, end, BAND_SELECTION_DEFAULT_STEPS); } public void bandSelection(Point start, Point end, int steps) throws Exception { int toolType = Configurator.getInstance().getToolType(); Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY, false); Configurator.getInstance().setToolType(toolType); } private void fingerSelection(Point start, Point end, int steps) throws Exception { int toolType = Configurator.getInstance().getToolType(); Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY, true); Configurator.getInstance().setToolType(toolType); } Loading @@ -100,20 +112,25 @@ public class GestureBot extends Bots.BaseBot { return mDevice.findObject(docList.childSelector(new UiSelector().text(label))); } private void swipe(int downX, int downY, int upX, int upY, int steps, int button) { private void swipe(int downX, int downY, int upX, int upY, int steps, int button, boolean fingerSelection) { int swipeSteps = steps; double xStep = 0; double yStep = 0; // avoid a divide by zero if(swipeSteps == 0) if (swipeSteps == 0) { swipeSteps = 1; } xStep = ((double) (upX - downX)) / swipeSteps; yStep = ((double) (upY - downY)) / swipeSteps; // first touch starts exactly at the point requested touchDown(downX, downY, button); if (fingerSelection) { SystemClock.sleep(LONG_PRESS_EVENT_INJECTION_DELAY_MILIS); } for (int i = 1; i < swipeSteps; i++) { touchMove(downX + (int) (xStep * i), downY + (int) (yStep * i), button); // set some known constant delay between steps as without it this Loading tests/functional/com/android/documentsui/FingerSelectionUiTest.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.graphics.Point; import android.graphics.Rect; import androidx.test.filters.LargeTest; import com.android.documentsui.files.FilesActivity; @LargeTest public class FingerSelectionUiTest extends ActivityTest<FilesActivity> { public FingerSelectionUiTest() { super(FilesActivity.class); } @Override public void setUp() throws Exception { super.setUp(); initTestFiles(); bots.roots.closeDrawer(); } public void testFingerSelection_outOfRange() throws Exception { bots.main.switchToGridMode(); Rect dirListBounds = bots.directory.findDocumentsList().getBounds(); Rect firstDoc = bots.directory.findDocument(fileName1).getBounds(); // Start from list right bottom. Point start = new Point(firstDoc.centerX(), firstDoc.centerY()); // End is center of file1 Point end = new Point(dirListBounds.right, dirListBounds.bottom); bots.gesture.fingerSelection(start, end); bots.directory.assertSelection(3); } } Loading
src/com/android/documentsui/dirlist/DocsSelectionPredicate.java +8 −3 Original line number Diff line number Diff line Loading @@ -16,15 +16,16 @@ package com.android.documentsui.dirlist; import static androidx.core.util.Preconditions.checkArgument; import static com.android.documentsui.base.DocumentInfo.getCursorInt; import static com.android.documentsui.base.DocumentInfo.getCursorString; import android.database.Cursor; import android.provider.DocumentsContract.Document; import android.util.Log; import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate; import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import com.android.documentsui.ActivityConfig; import com.android.documentsui.Model; Loading Loading @@ -89,9 +90,13 @@ final class DocsSelectionPredicate extends SelectionPredicate<String> { // The band selection model only operates on documents and directories. // Exclude other types of adapter items like whitespace and dividers. RecyclerView.ViewHolder vh = mRecView.findViewHolderForAdapterPosition(position); final RecyclerView.ViewHolder vh = mRecView.findViewHolderForAdapterPosition(position); if (vh == null) { return false; } else { return ModelBackedDocumentsAdapter.isContentType(vh.getItemViewType()); } } @Override public boolean canSelectMultiple() { Loading
tests/common/com/android/documentsui/bots/GestureBot.java +26 −9 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ public class GestureBot extends Bots.BaseBot { private static final int STEPS_INBETWEEN_POINTS = 2; // Inserted after each motion event injection. private static final int MOTION_EVENT_INJECTION_DELAY_MILLIS = 5; private static final int LONG_PRESS_EVENT_INJECTION_DELAY_MILIS = 1000; private final String mDirContainerId; private final String mDirListId; private final UiAutomation mAutomation; Loading Loading @@ -82,10 +83,21 @@ public class GestureBot extends Bots.BaseBot { bandSelection(start, end, BAND_SELECTION_DEFAULT_STEPS); } public void fingerSelection(Point start, Point end) throws Exception { fingerSelection(start, end, BAND_SELECTION_DEFAULT_STEPS); } public void bandSelection(Point start, Point end, int steps) throws Exception { int toolType = Configurator.getInstance().getToolType(); Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY, false); Configurator.getInstance().setToolType(toolType); } private void fingerSelection(Point start, Point end, int steps) throws Exception { int toolType = Configurator.getInstance().getToolType(); Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); swipe(start.x, start.y, end.x, end.y, steps, MotionEvent.BUTTON_PRIMARY, true); Configurator.getInstance().setToolType(toolType); } Loading @@ -100,20 +112,25 @@ public class GestureBot extends Bots.BaseBot { return mDevice.findObject(docList.childSelector(new UiSelector().text(label))); } private void swipe(int downX, int downY, int upX, int upY, int steps, int button) { private void swipe(int downX, int downY, int upX, int upY, int steps, int button, boolean fingerSelection) { int swipeSteps = steps; double xStep = 0; double yStep = 0; // avoid a divide by zero if(swipeSteps == 0) if (swipeSteps == 0) { swipeSteps = 1; } xStep = ((double) (upX - downX)) / swipeSteps; yStep = ((double) (upY - downY)) / swipeSteps; // first touch starts exactly at the point requested touchDown(downX, downY, button); if (fingerSelection) { SystemClock.sleep(LONG_PRESS_EVENT_INJECTION_DELAY_MILIS); } for (int i = 1; i < swipeSteps; i++) { touchMove(downX + (int) (xStep * i), downY + (int) (yStep * i), button); // set some known constant delay between steps as without it this Loading
tests/functional/com/android/documentsui/FingerSelectionUiTest.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.graphics.Point; import android.graphics.Rect; import androidx.test.filters.LargeTest; import com.android.documentsui.files.FilesActivity; @LargeTest public class FingerSelectionUiTest extends ActivityTest<FilesActivity> { public FingerSelectionUiTest() { super(FilesActivity.class); } @Override public void setUp() throws Exception { super.setUp(); initTestFiles(); bots.roots.closeDrawer(); } public void testFingerSelection_outOfRange() throws Exception { bots.main.switchToGridMode(); Rect dirListBounds = bots.directory.findDocumentsList().getBounds(); Rect firstDoc = bots.directory.findDocument(fileName1).getBounds(); // Start from list right bottom. Point start = new Point(firstDoc.centerX(), firstDoc.centerY()); // End is center of file1 Point end = new Point(dirListBounds.right, dirListBounds.bottom); bots.gesture.fingerSelection(start, end); bots.directory.assertSelection(3); } }