diff --git a/wlauto/common/android/BaseUiAutomation$1.class b/wlauto/common/android/BaseUiAutomation$1.class index fea7e68c..b93b764f 100644 Binary files a/wlauto/common/android/BaseUiAutomation$1.class and b/wlauto/common/android/BaseUiAutomation$1.class differ diff --git a/wlauto/common/android/BaseUiAutomation$AppLaunch.class b/wlauto/common/android/BaseUiAutomation$AppLaunch.class new file mode 100644 index 00000000..ca020dcd Binary files /dev/null and b/wlauto/common/android/BaseUiAutomation$AppLaunch.class differ diff --git a/wlauto/common/android/BaseUiAutomation.class b/wlauto/common/android/BaseUiAutomation.class index 1f6f8cdd..d84d4922 100644 Binary files a/wlauto/common/android/BaseUiAutomation.class and b/wlauto/common/android/BaseUiAutomation.class differ diff --git a/wlauto/common/android/workload.py b/wlauto/common/android/workload.py index 8c1b0067..6c91bdc5 100644 --- a/wlauto/common/android/workload.py +++ b/wlauto/common/android/workload.py @@ -635,6 +635,10 @@ class AndroidUxPerfWorkload(AndroidUiAutoBenchmark): super(AndroidUxPerfWorkload, self).validate() self.uiauto_params['package'] = self.package self.uiauto_params['markers_enabled'] = self.markers_enabled + if not self.activity: + self.uiauto_params['launch_activity'] = "None" + else: + self.uiauto_params['launch_activity'] = self.activity def setup(self, context): super(AndroidUxPerfWorkload, self).setup(context) diff --git a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java index 772cea5a..30779424 100644 --- a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java +++ b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java @@ -99,6 +99,88 @@ public class BaseUiAutomation extends UiAutomatorTestCase { } } } + /* + * AppLaunch class implements methods that facilitates launching applications from the uiautomator. + * ActionLogger class is instantiated within the class for measuring applaunch time. + * launch_main(): starts the application launch. + * launch_end(UiObject,int): marks the end of application launch, to measure the correct applaunch end time. + * @param Uiobject: is a workload specific object to search in the screen that potentially marks the beginning of user interaction. + * @param int: speficies the number of seconds to wait for the object to appear on screen, throws Uiobject not found exception. + */ + public class AppLaunch { + + private String packageName; + private String activityName; + public String testTag = "applaunch"; + public Bundle parameters; + public ActionLogger logger; + + public AppLaunch(String packageName, + String activityName, + Bundle parameters) { + this.packageName = packageName; + this.activityName = activityName; + this.parameters = parameters; + this.logger = new ActionLogger(testTag, parameters); + } + + //Called by launch_main() to check if app launch is successful + public void launch_validate(Process launch_p) throws Exception { + BufferedReader reader = new BufferedReader(new InputStreamReader(launch_p.getInputStream())); + String line = null; + while ((line = reader.readLine()) != null) { + if (line.contains("Error:")) { + throw new Exception("Application could not be launched"); + } + } + } + + //Marks the end of applaunch of the workload. + public void launch_end(UiObject launch_end_resource, int launch_timeout) throws Exception{ + waitObject(launch_end_resource, launch_timeout); + logger.stop(); + } + + //Launches the application. + public void launch_main() throws Exception{ + Process launch_p; + Process stop_app; + stop_app = Runtime.getRuntime().exec(String.format("am force-stop %s", + packageName)); + logger.start(); + if(activityName.equals("None")) { + launch_p = Runtime.getRuntime().exec(String.format("am start -W %s", + packageName)); + Log.d("Launched without activity", activityName); + } + else { + launch_p = Runtime.getRuntime().exec(String.format("am start -W -n %s/%s", + packageName, activityName)); + Log.d("Launched with activity", activityName); + } + + launch_validate(launch_p); + stop_app.destroy(); + launch_p.destroy(); + } + //Launches the Skype application + public void launch_main(String actionName, String dataURI) throws Exception{ + Process launch_p; + Process stop_app; + sleep(2); + stop_app = Runtime.getRuntime().exec(String.format("am force-stop %s", + packageName)); + logger.start(); + stop_app.waitFor(); + launch_p = Runtime.getRuntime().exec(String.format("am start -W -a %s -d %s", + actionName, dataURI)); + + launch_p.waitFor(); + launch_validate(launch_p); + stop_app.destroy(); + launch_p.destroy(); + } + } public void sleep(int second) { super.sleep(second * 1000); diff --git a/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar b/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar index f91c97fe..9cc92c2e 100644 Binary files a/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar and b/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar differ diff --git a/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index 11f10536..abae96ca 100755 --- a/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -39,6 +39,8 @@ public class UiAutomation extends UxPerfUiAutomation { protected Bundle parameters; protected String packageName; protected String packageID; + public String activityName; + public Boolean applaunch_enabled; private long networkTimeout = TimeUnit.SECONDS.toMillis(20); private long searchTimeout = TimeUnit.SECONDS.toMillis(20); @@ -46,15 +48,28 @@ public class UiAutomation extends UxPerfUiAutomation { public void runUiAutomation() throws Exception { parameters = getParams(); packageName = parameters.getString("package"); + activityName = parameters.getString("launch_activity"); packageID = packageName + ":id/"; + applaunch_enabled = Boolean.parseBoolean(parameters.getString("markers_enabled")); String filename = parameters.getString("filename").replace("0space0", " "); String[] searchStrings = parameters.getString("search_string_list").replace("0space0", " ").split("0newline0"); + //Applaunch object for launching an application and measuring the time taken + AppLaunch applaunch = new AppLaunch(packageName, activityName, parameters); + //Widget on the screen that marks the application ready for user interaction + UiObject userBeginObject = + new UiObject(new UiSelector().textContains("RECENT") + .className("android.widget.TextView")); setScreenOrientation(ScreenOrientation.NATURAL); - dismissWelcomeView(); + if(applaunch_enabled) { + applaunch.launch_main();//launch the application + } + if(applaunch_enabled) { + applaunch.launch_end(userBeginObject,5);//mark the end of launch + } openFile(filename); gesturesTest(); searchPdfTest(searchStrings); diff --git a/wlauto/workloads/googlephotos/com.arm.wlauto.uiauto.googlephotos.jar b/wlauto/workloads/googlephotos/com.arm.wlauto.uiauto.googlephotos.jar index 57bac152..fc11ed43 100644 Binary files a/wlauto/workloads/googlephotos/com.arm.wlauto.uiauto.googlephotos.jar and b/wlauto/workloads/googlephotos/com.arm.wlauto.uiauto.googlephotos.jar differ diff --git a/wlauto/workloads/googlephotos/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/googlephotos/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index b3c81954..d849eacc 100755 --- a/wlauto/workloads/googlephotos/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/googlephotos/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -23,6 +23,7 @@ import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.core.UiScrollable; +import com.android.uiautomator.core.UiWatcher; import com.arm.wlauto.uiauto.UxPerfUiAutomation; @@ -41,18 +42,41 @@ public class UiAutomation extends UxPerfUiAutomation { public Bundle parameters; public String packageName; public String packageID; + public String activityName; + public Boolean applaunch_enabled; private long viewTimeout = TimeUnit.SECONDS.toMillis(10); public void runUiAutomation() throws Exception { parameters = getParams(); packageName = parameters.getString("package"); + activityName = parameters.getString("launch_activity"); packageID = packageName + ":id/"; + applaunch_enabled = Boolean.parseBoolean(parameters.getString("markers_enabled")); + + //Applaunch object for launching an application and measuring the time taken + AppLaunch applaunch = new AppLaunch(packageName, activityName, parameters); + //Widget on the screen that marks the application ready for user interaction + UiObject userBeginObject = + new UiObject(new UiSelector().textContains("Photos") + .className("android.widget.TextView")); + //Watcher that takes care of backup popup during warm start + UiWatcher backupPopUpWatcher = createBackupPopUpWatcher(); + registerWatcher("backupPopUpWatcher", backupPopUpWatcher); + runWatchers(); + - sleep(5); // Pause while splash screen loads setScreenOrientation(ScreenOrientation.NATURAL); dismissWelcomeView(); closePromotionPopUp(); + + if(applaunch_enabled) { + applaunch.launch_main();//launch the application + } + + if(applaunch_enabled) { + applaunch.launch_end(userBeginObject,5);//mark the end of launch + } selectWorkingGallery("wa-1"); gesturesTest(); @@ -435,4 +459,26 @@ public class UiAutomation extends UxPerfUiAutomation { break; } } + // Creates a watcher for when a pop up dialog appears with a signin/close button. + private UiWatcher createBackupPopUpWatcher() throws Exception { + UiWatcher backupPopUpWatcher = new UiWatcher() { + @Override + public boolean checkForCondition() { + UiObject closeButton = + new UiObject(new UiSelector().resourceId(packageID + "promo_close_button")); + + if (closeButton.exists()) { + try { + closeButton.click(); + } catch (UiObjectNotFoundException e) { + e.printStackTrace(); + } + + return closeButton.waitUntilGone(TimeUnit.SECONDS.toMillis(10)); + } + return false; + } + }; + return backupPopUpWatcher; + } } diff --git a/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar b/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar index 9166516c..6adc3782 100644 Binary files a/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar and b/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar differ diff --git a/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index 0303cd3e..3d5f6917 100755 --- a/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -43,6 +43,8 @@ public class UiAutomation extends UxPerfUiAutomation { protected Bundle parameters; protected String packageName; protected String packageID; + public String activityName; + public Boolean applaunch_enabled; private int viewTimeoutSecs = 10; private long viewTimeout = TimeUnit.SECONDS.toMillis(viewTimeoutSecs); @@ -53,7 +55,9 @@ public class UiAutomation extends UxPerfUiAutomation { parameters = getParams(); packageName = parameters.getString("package"); + activityName = parameters.getString("launch_activity"); packageID = packageName + ":id/"; + applaunch_enabled = Boolean.parseBoolean(parameters.getString("markers_enabled")); String searchBookTitle = parameters.getString("search_book_title").replace("0space0", " "); String libraryBookTitle = parameters.getString("library_book_title").replace("0space0", " "); @@ -62,6 +66,12 @@ public class UiAutomation extends UxPerfUiAutomation { String noteText = "This is a test note"; String account = parameters.getString("account"); + //Applaunch object for launching an application and measuring the time taken + AppLaunch applaunch = new AppLaunch(packageName, activityName, parameters); + //Widget on the screen that marks the application ready for user interaction + UiObject userBeginObject = + new UiObject(new UiSelector().resourceId(packageID + "menu_search")); + setScreenOrientation(ScreenOrientation.NATURAL); chooseAccount(account); @@ -69,6 +79,13 @@ public class UiAutomation extends UxPerfUiAutomation { dismissSendBooksAsGiftsDialog(); dismissSync(); + if(applaunch_enabled) { + applaunch.launch_main();//launch the application + } + if(applaunch_enabled) { + applaunch.launch_end(userBeginObject,5);//mark the end of launch + } + searchForBook(searchBookTitle); addToLibrary(); openMyLibrary(); diff --git a/wlauto/workloads/skype/com.arm.wlauto.uiauto.skype.jar b/wlauto/workloads/skype/com.arm.wlauto.uiauto.skype.jar index 84275874..0779eb2e 100644 Binary files a/wlauto/workloads/skype/com.arm.wlauto.uiauto.skype.jar and b/wlauto/workloads/skype/com.arm.wlauto.uiauto.skype.jar differ diff --git a/wlauto/workloads/skype/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/skype/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index 1dd57b16..aeb2518a 100755 --- a/wlauto/workloads/skype/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/skype/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -36,6 +36,10 @@ public class UiAutomation extends UxPerfUiAutomation { public Bundle parameters; public String packageName; public String packageID; + public String activityName; + public String actionName = "android.intent.action.VIEW"; //required for launching skype + public String dataURI = "skype:dummy?dummy"; // required for launching skype + public Boolean applaunch_enabled; public static final String ACTION_VOICE = "voice"; public static final String ACTION_VIDEO = "video"; @@ -46,7 +50,9 @@ public class UiAutomation extends UxPerfUiAutomation { parameters = getParams(); packageName = parameters.getString("package"); + activityName = parameters.getString("launch_activity"); packageID = packageName + ":id/"; + applaunch_enabled = Boolean.parseBoolean(parameters.getString("markers_enabled")); String loginName = parameters.getString("my_id"); String loginPass = parameters.getString("my_pwd"); @@ -54,6 +60,13 @@ public class UiAutomation extends UxPerfUiAutomation { int callDuration = Integer.parseInt(parameters.getString("duration")); String callType = parameters.getString("action"); String resultsFile = parameters.getString("results_file"); + + //Applaunch object for launching an application and measuring the time taken + AppLaunch applaunch = new AppLaunch(packageName, activityName, parameters); + //Widget on the screen that marks the application ready for user interaction + UiObject userBeginObject = + new UiObject(new UiSelector().resourceId(packageID + "menu_search")); + setScreenOrientation(ScreenOrientation.NATURAL); @@ -64,6 +77,12 @@ public class UiAutomation extends UxPerfUiAutomation { // Run tests handleLoginScreen(loginName, loginPass); dismissUpdatePopupIfPresent(); + if(applaunch_enabled) { + applaunch.launch_main(actionName,dataURI);//launch the application + } + if(applaunch_enabled) { + applaunch.launch_end(userBeginObject,5);//mark the end of launch + } searchForContact(contactName); if (ACTION_VOICE.equalsIgnoreCase(callType)) { @@ -165,6 +184,29 @@ public class UiAutomation extends UxPerfUiAutomation { return infoPopUpWatcher; } + // Creates a watcher for when a pop up dialog appears with a continue button. + private UiWatcher createUpdatePopUpWatcher() throws Exception { + UiWatcher updatePopUpWatcher = new UiWatcher() { + @Override + public boolean checkForCondition() { + UiObject continueButton = + new UiObject(new UiSelector().resourceId(packageID + "button2")); + + if (continueButton.exists()) { + try { + continueButton.click(); + } catch (UiObjectNotFoundException e) { + e.printStackTrace(); + } + + return continueButton.waitUntilGone(TimeUnit.SECONDS.toMillis(10)); + } + return false; + } + }; + return updatePopUpWatcher; + } + private void voiceCallTest(int duration) throws Exception { String testTag = "call_voice"; ActionLogger logger = new ActionLogger(testTag, parameters); diff --git a/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar b/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar index 9aad9634..99fe660f 100644 Binary files a/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar and b/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar differ diff --git a/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index 44313008..b9ed224b 100755 --- a/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -17,6 +17,7 @@ package com.arm.wlauto.uiauto.youtube; import android.os.Bundle; import android.os.SystemClock; +import android.util.Log; // Import the uiautomator libraries import com.android.uiautomator.core.UiObject; @@ -34,6 +35,8 @@ public class UiAutomation extends UxPerfUiAutomation { public Bundle parameters; public String packageName; public String packageID; + public String activityName; + public Boolean applaunch_enabled; public static final String SOURCE_MY_VIDEOS = "my_videos"; public static final String SOURCE_SEARCH = "search"; @@ -46,7 +49,9 @@ public class UiAutomation extends UxPerfUiAutomation { public void runUiAutomation() throws Exception { parameters = getParams(); packageName = parameters.getString("package"); + activityName = parameters.getString("launch_activity"); packageID = packageName + ":id/"; + applaunch_enabled = Boolean.parseBoolean(parameters.getString("markers_enabled")); String videoSource = parameters.getString("video_source"); String searchTerm = parameters.getString("search_term"); @@ -54,10 +59,22 @@ public class UiAutomation extends UxPerfUiAutomation { searchTerm = searchTerm.replace("0space0", " "); } + //Applaunch object for launching an application and measuring the time taken + AppLaunch applaunch = new AppLaunch(packageName, activityName, parameters); + //Widget on the screen that marks the application ready for user interaction + UiObject userBeginObject = + new UiObject(new UiSelector().textContains("Home") + .className("android.widget.TextView")); setScreenOrientation(ScreenOrientation.NATURAL); clearFirstRunDialogues(); disableAutoplay(); + if(applaunch_enabled) { + applaunch.launch_main();//launch the application + } + if(applaunch_enabled) { + applaunch.launch_end(userBeginObject,5);//mark the end of launch + } testPlayVideo(videoSource, searchTerm); dismissAdvert(); checkPlayerError();