From 496c3ef021f60bcc28862115ff26740939705904 Mon Sep 17 00:00:00 2001 From: Marc Bonnici Date: Tue, 7 Nov 2017 09:48:20 +0000 Subject: [PATCH] Framework/Uiauto: Adds UxPerfUiAutomation related functionality Adds various methods that are used in UxPerf workloads and additional helper class for UxPerf specific functions. Adds a class to contain UxPerf specific functions. --- .../com/arm/wa/uiauto/BaseUiAutomation.java | 150 +++++++++++++++++- .../com/arm/wa/uiauto/UxPerfUiAutomation.java | 55 +++++++ wa/framework/uiauto/uiauto.aar | Bin 10491 -> 15361 bytes 3 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/UxPerfUiAutomation.java diff --git a/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java index b91e7bd7..22165a2a 100644 --- a/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java +++ b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java @@ -17,12 +17,15 @@ package com.arm.wa.uiauto; import android.app.Instrumentation; import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; import android.os.SystemClock; import android.support.test.InstrumentationRegistry; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObjectNotFoundException; import android.support.test.uiautomator.UiSelector; +import android.support.test.uiautomator.UiWatcher; import org.junit.Before; import org.junit.Test; @@ -38,13 +41,14 @@ import java.util.concurrent.TimeoutException; public class BaseUiAutomation { - public enum FindByCriteria {BY_ID, BY_TEXT, BY_DESC} + public enum FindByCriteria { BY_ID, BY_TEXT, BY_DESC }; + public enum Direction { UP, DOWN, LEFT, RIGHT, NULL }; + public enum ScreenOrientation { RIGHT, NATURAL, LEFT }; + public enum PinchType { IN, OUT, NULL }; // Time in milliseconds public long uiAutoTimeout = 4 * 1000; - public enum Direction { UP, DOWN, LEFT, RIGHT, NULL }; - public static final int CLICK_REPEAT_INTERVAL_MINIMUM = 5; public static final int CLICK_REPEAT_INTERVAL_DEFAULT = 50; @@ -157,6 +161,44 @@ public class BaseUiAutomation { } } + public void registerWatcher(String name, UiWatcher watcher) { + mDevice.registerWatcher(name, watcher); + } + + public void runWatchers() { + mDevice.runWatchers(); + } + + public void removeWatcher(String name) { + mDevice.removeWatcher(name); + } + + public void setScreenOrientation(ScreenOrientation orientation) throws Exception { + switch (orientation) { + case RIGHT: + mDevice.setOrientationRight(); + break; + case NATURAL: + mDevice.setOrientationNatural(); + break; + case LEFT: + mDevice.setOrientationLeft(); + break; + default: + throw new Exception("No orientation specified"); + } + } + + public void unsetScreenOrientation() throws Exception { + mDevice.unfreezeRotation(); + } + + public void uiObjectPerformLongClick(UiObject view, int steps) throws Exception { + Rect rect = view.getBounds(); + mDevice.swipe(rect.centerX(), rect.centerY(), + rect.centerX(), rect.centerY(), steps); + } + public int getDisplayHeight() { return mDevice.getDisplayHeight(); } @@ -173,6 +215,108 @@ public class BaseUiAutomation { return getDisplayHeight() / 2; } + public void tapDisplayCentre() { + tapDisplay(getDisplayCentreWidth(), getDisplayCentreHeight()); + } + + public void tapDisplay(int x, int y) { + mDevice.click(x, y); + } + + public void pressEnter() { + mDevice.pressEnter(); + } + + public void pressHome() { + mDevice.pressHome(); + } + + public void pressBack() { + mDevice.pressBack(); + } + + public void uiObjectSwipe(UiObject view, Direction direction, int steps) throws Exception { + switch (direction) { + case UP: + view.swipeUp(steps); + break; + case DOWN: + view.swipeDown(steps); + break; + case LEFT: + view.swipeLeft(steps); + break; + case RIGHT: + view.swipeRight(steps); + break; + case NULL: + throw new Exception("No direction specified"); + default: + break; + } + } + + public void uiObjectVertPinchIn(UiObject view, int steps, int percent) throws Exception { + final int FINGER_TOUCH_HALF_WIDTH = 20; + + // Make value between 1 and 100 + int nPercent = (percent < 0) ? 1 : (percent > 100) ? 100 : percent; + float percentage = nPercent / 100f; + + Rect rect = view.getVisibleBounds(); + + if (rect.width() <= FINGER_TOUCH_HALF_WIDTH * 2) { + throw new IllegalStateException("Object width is too small for operation"); + } + + // Start at the top-center and bottom-center of the control + Point startPoint1 = new Point(rect.centerX(), rect.centerY() + + (int) ((rect.height() / 2) * percentage)); + Point startPoint2 = new Point(rect.centerX(), rect.centerY() + - (int) ((rect.height() / 2) * percentage)); + + // End at the same point at the center of the control + Point endPoint1 = new Point(rect.centerX(), rect.centerY() + FINGER_TOUCH_HALF_WIDTH); + Point endPoint2 = new Point(rect.centerX(), rect.centerY() - FINGER_TOUCH_HALF_WIDTH); + + view.performTwoPointerGesture(startPoint1, startPoint2, endPoint1, endPoint2, steps); + } + + public void uiObjectVertPinchOut(UiObject view, int steps, int percent) throws Exception { + final int FINGER_TOUCH_HALF_WIDTH = 20; + + // Make value between 1 and 100 + int nPercent = (percent < 0) ? 1 : (percent > 100) ? 100 : percent; + float percentage = nPercent / 100f; + + Rect rect = view.getVisibleBounds(); + + if (rect.width() <= FINGER_TOUCH_HALF_WIDTH * 2) { + throw new IllegalStateException("Object width is too small for operation"); + } + + // Start from the same point at the center of the control + Point startPoint1 = new Point(rect.centerX(), rect.centerY() + FINGER_TOUCH_HALF_WIDTH); + Point startPoint2 = new Point(rect.centerX(), rect.centerY() - FINGER_TOUCH_HALF_WIDTH); + + // End at the top-center and bottom-center of the control + Point endPoint1 = new Point(rect.centerX(), rect.centerY() + + (int) ((rect.height() / 2) * percentage)); + Point endPoint2 = new Point(rect.centerX(), rect.centerY() + - (int) ((rect.height() / 2) * percentage)); + + view.performTwoPointerGesture(startPoint1, startPoint2, endPoint1, endPoint2, steps); + } + + public void uiObjectVertPinch(UiObject view, PinchType direction, + int steps, int percent) throws Exception { + if (direction.equals(PinchType.IN)) { + uiObjectVertPinchIn(view, steps, percent); + } else if (direction.equals(PinchType.OUT)) { + uiObjectVertPinchOut(view, steps, percent); + } + } + public void uiDeviceSwipeUp(int steps) { mDevice.swipe( getDisplayCentreWidth(), diff --git a/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/UxPerfUiAutomation.java b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/UxPerfUiAutomation.java new file mode 100644 index 00000000..c0572b08 --- /dev/null +++ b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/UxPerfUiAutomation.java @@ -0,0 +1,55 @@ +/* Copyright 2013-2016 ARM Limited + * + * 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.arm.wa.uiauto; + +import android.os.Bundle; + +import java.util.logging.Logger; + +import com.arm.wa.uiauto.BaseUiAutomation.Direction; +import com.arm.wa.uiauto.BaseUiAutomation.PinchType; + + +public class UxPerfUiAutomation { + + private Logger logger = Logger.getLogger(UxPerfUiAutomation.class.getName()); + + public enum GestureType { UIDEVICE_SWIPE, UIOBJECT_SWIPE, PINCH }; + + public static class GestureTestParams { + public GestureType gestureType; + public Direction gestureDirection; + public PinchType pinchType; + public int percent; + public int steps; + + public GestureTestParams(GestureType gesture, Direction direction, int steps) { + this.gestureType = gesture; + this.gestureDirection = direction; + this.pinchType = PinchType.NULL; + this.steps = steps; + this.percent = 0; + } + + public GestureTestParams(GestureType gesture, PinchType pinchType, int steps, int percent) { + this.gestureType = gesture; + this.gestureDirection = Direction.NULL; + this.pinchType = pinchType; + this.steps = steps; + this.percent = percent; + } + } +} diff --git a/wa/framework/uiauto/uiauto.aar b/wa/framework/uiauto/uiauto.aar index 01caa1326694f0290154200e2a4f09cbcfdc7e62..34e53d1c172db47ec5306a8a8cbbcc28e296d01f 100644 GIT binary patch delta 14801 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 delta 9947 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

;ACr{Z_3WX6oZcIbB_2 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