diff options
Diffstat (limited to 'espresso/espresso-lib/src/main/java/com/google/android/apps/common/testing/ui/espresso/action/GeneralClickAction.java')
-rw-r--r-- | espresso/espresso-lib/src/main/java/com/google/android/apps/common/testing/ui/espresso/action/GeneralClickAction.java | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/espresso/espresso-lib/src/main/java/com/google/android/apps/common/testing/ui/espresso/action/GeneralClickAction.java b/espresso/espresso-lib/src/main/java/com/google/android/apps/common/testing/ui/espresso/action/GeneralClickAction.java deleted file mode 100644 index 857501d..0000000 --- a/espresso/espresso-lib/src/main/java/com/google/android/apps/common/testing/ui/espresso/action/GeneralClickAction.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2014 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.google.android.apps.common.testing.ui.espresso.action; - -import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.isDisplayingAtLeast; -import static org.hamcrest.Matchers.allOf; - -import com.google.android.apps.common.testing.ui.espresso.PerformException; -import com.google.android.apps.common.testing.ui.espresso.UiController; -import com.google.android.apps.common.testing.ui.espresso.ViewAction; -import com.google.android.apps.common.testing.ui.espresso.util.HumanReadables; -import com.google.common.base.Optional; - -import android.view.View; -import android.view.ViewConfiguration; -import android.webkit.WebView; - -import org.hamcrest.Matcher; - -/** - * Enables clicking on views. - */ -public final class GeneralClickAction implements ViewAction { - - private final CoordinatesProvider coordinatesProvider; - private final Tapper tapper; - private final PrecisionDescriber precisionDescriber; - private final Optional<ViewAction> rollbackAction; - - public GeneralClickAction(Tapper tapper, CoordinatesProvider coordinatesProvider, - PrecisionDescriber precisionDescriber) { - this(tapper, coordinatesProvider, precisionDescriber, null); - } - - public GeneralClickAction(Tapper tapper, CoordinatesProvider coordinatesProvider, - PrecisionDescriber precisionDescriber, ViewAction rollbackAction) { - this.coordinatesProvider = coordinatesProvider; - this.tapper = tapper; - this.precisionDescriber = precisionDescriber; - this.rollbackAction = Optional.fromNullable(rollbackAction); - } - - @Override - @SuppressWarnings("unchecked") - public Matcher<View> getConstraints() { - Matcher<View> standardConstraint = isDisplayingAtLeast(90); - if (rollbackAction.isPresent()) { - return allOf(standardConstraint, rollbackAction.get().getConstraints()); - } else { - return standardConstraint; - } - } - - @Override - public void perform(UiController uiController, View view) { - float[] coordinates = coordinatesProvider.calculateCoordinates(view); - float[] precision = precisionDescriber.describePrecision(); - - Tapper.Status status = Tapper.Status.FAILURE; - int loopCount = 0; - // Native event injection is quite a tricky process. A tap is actually 2 - // seperate motion events which need to get injected into the system. Injection - // makes an RPC call from our app under test to the Android system server, the - // system server decides which window layer to deliver the event to, the system - // server makes an RPC to that window layer, that window layer delivers the event - // to the correct UI element, activity, or window object. Now we need to repeat - // that 2x. for a simple down and up. Oh and the down event triggers timers to - // detect whether or not the event is a long vs. short press. The timers are - // removed the moment the up event is received (NOTE: the possibility of eventTime - // being in the future is totally ignored by most motion event processors). - // - // Phew. - // - // The net result of this is sometimes we'll want to do a regular tap, and for - // whatever reason the up event (last half) of the tap is delivered after long - // press timeout (depending on system load) and the long press behaviour is - // displayed (EG: show a context menu). There is no way to avoid or handle this more - // gracefully. Also the longpress behavour is app/widget specific. So if you have - // a seperate long press behaviour from your short press, you can pass in a - // 'RollBack' ViewAction which when executed will undo the effects of long press. - - while (status != Tapper.Status.SUCCESS && loopCount < 3) { - try { - status = tapper.sendTap(uiController, coordinates, precision); - } catch (RuntimeException re) { - throw new PerformException.Builder() - .withActionDescription(this.getDescription()) - .withViewDescription(HumanReadables.describe(view)) - .withCause(re) - .build(); - } - - // ensures that all work enqueued to process the tap has been run. - uiController.loopMainThreadForAtLeast(ViewConfiguration.getPressedStateDuration()); - if (status == Tapper.Status.WARNING) { - if (rollbackAction.isPresent()) { - rollbackAction.get().perform(uiController, view); - } else { - break; - } - } - loopCount++; - } - if (status == Tapper.Status.FAILURE) { - throw new PerformException.Builder() - .withActionDescription(this.getDescription()) - .withViewDescription(HumanReadables.describe(view)) - .withCause(new RuntimeException(String.format("Couldn't " - + "click at: %s,%s precision: %s, %s . Tapper: %s coordinate provider: %s precision " + - "describer: %s. Tried %s times. With Rollback? %s", coordinates[0], coordinates[1], - precision[0], precision[1], tapper, coordinatesProvider, precisionDescriber, loopCount, - rollbackAction.isPresent()))) - .build(); - } - - if (tapper == Tap.SINGLE && view instanceof WebView) { - // WebViews will not process click events until double tap - // timeout. Not the best place for this - but good for now. - uiController.loopMainThreadForAtLeast(ViewConfiguration.getDoubleTapTimeout()); - } - } - - @Override - public String getDescription() { - return tapper.toString().toLowerCase() + " click"; - } -} |