From 544c498eb6638c56387542bef9ca631afaa917e5 Mon Sep 17 00:00:00 2001 From: Sebastian Goscik Date: Mon, 16 May 2016 14:17:37 +0100 Subject: [PATCH 1/3] UiAutomatorWorkload: Added quotes around uiautomator parameters Some characters would be interpreted by the shell thus breaking the command. Adding quotes around the parameters solved this. N.B Space still needs to be replaced. --- wlauto/common/android/workload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wlauto/common/android/workload.py b/wlauto/common/android/workload.py index 61b6d290..97650d15 100644 --- a/wlauto/common/android/workload.py +++ b/wlauto/common/android/workload.py @@ -87,7 +87,7 @@ class UiAutomatorWorkload(Workload): params_dict['workdir'] = self.device.working_directory params = '' for k, v in self.uiauto_params.iteritems(): - params += ' -e {} {}'.format(k, v) + params += ' -e {} "{}"'.format(k, v) self.command = 'uiautomator runtest {}{} -c {}'.format(self.device_uiauto_file, params, method_string) self.device.push_file(self.uiauto_file, self.device_uiauto_file) self.device.killall('uiautomator') From 46cd26e7748a994310ed7e5e717280de89063fb4 Mon Sep 17 00:00:00 2001 From: Sebastian Goscik Date: Mon, 16 May 2016 17:17:26 +0100 Subject: [PATCH 2/3] BaseUiAutomation: Added functions for checking version strings Added splitVersion and compareVersions functions allow versions strings like "3.2.045" to be compared. Also fixed the build script to now copy to the correct folder --- wlauto/common/android/BaseUiAutomation.class | Bin 4182 -> 5862 bytes wlauto/external/uiauto/build.sh | 2 +- .../arm/wlauto/uiauto/BaseUiAutomation.java | 39 ++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/wlauto/common/android/BaseUiAutomation.class b/wlauto/common/android/BaseUiAutomation.class index 2683f4534b2f27d2ea696527c87283c81637d3e8..353201f68d9295455a1c15c45c20dfba64ff3b31 100644 GIT binary patch literal 5862 zcmb7IcVHXU9sZsr`Q-D3U?q0qI0+(T*p_WI6L27qgcuwgC&d{UT+)klu`iKz=5)%S zqzh>2V$(Lv7HHFvQs|IfToSsVrF%ekOEDDfqnH`htoM z+#kiGDjvfZ6?{p>a%sS0cwEJo@fEpzRW4ssu?An4%QxheZz}j!6yH{{O6s&6-%;>{ zd_Jk*x+uP@;(PeMy!-b5Dr{mrm5Wab2#ds5bLQn!bbdoz08v66YyeXP-Q#ujrmcZPMxw6ZG& zBDsuVj8INNQXJ@vAS+w${3MGl5Il;yWApW;(R(8 zl#nYa@p4IA%j%@GEm_CR^jbxs{|5&KwKkP8bi2nIOzDn-9}BoFyDWdpi$W#Ou6J>p zAz*2AjyzIB-etuxhYc&w;EDADH91GOoz2{m5w@+Ak#iAH#>XaalfJ9A4LxlzN;5r_ znHJHpbEjb&>5JSG-lNbNP(KYT(jp+t&B@m^ldv zF5i*M z8ZHBsUgVa^6X#$tRjBEH4{w&38*YFoSui&p5{)WFZ z<1%hC$JN?afNH z*+VqZBx2MmK>!xcE7ax=?u3?4|IPAebz!;9RFvZSWvls}=Y74a8k!E|&}4zo=`d)E%> zcAs&1-pHm57b{9yX0)}Ru=k3Oz?ne;AG*Ot?v>7!K_{00?ls@zryDkJrr(I$?O!6T zjwhsR6t}#|X>Msyvx%m75f9Lpr=sI@@{fp!ou?J2z}U0MuMZ;R-fUW6dWPLrL6^oHnhdU1w?xJUOf(_zkM9h{!!E<3Q%LU zTnf-eF{OZ$4tIvbhsi?Y@AV|6`ZhGUtU93gA>f!=UezE0e@(+&AfaNtM5j7kc zr3jsD!hFth8Sn5JU&B4=gVV-QM{{GnI-NX#f;8yYh!qJ0W-@YJzLMF z$W{Ck@(g^ks+#?Ow4wnR6yfxm_LqL{eIMAO^i6bK)dG@V?Xz3*#j{$ z06{*5FrQ0+cQ8uQ`nbooWPK8z8WQ@R^+8K_BSRHse7i{}6{;;Mbjo3V2Ge6>KtOFt zKy68Yhwv&g9A>_GusMTIK|bmj;;~Z;n76HLg6F|L)G#RJ#8Z9FMK!aew=m-I6I~3h zMt;|h;k47klIeUh?PS6%pyw9$H&z$0XcWz(Xz5hsotn^!+J>5juo1uI4lHSn6wunJ z6p-lej6RB3W0Wp#J9zB5@QT_)2-VjfMD-!mx`c<0JubPm`_#9iVH_R(vE;Ty=wZBK z42wsxBoL7Gh*7U?)bC=ZWIyIJnOc}gZA_vSOrw>ASQmECx)cjanpI$kSz+?VZbC3i zWQ@SU<#;o4t~Ungm$d}-<-8S@7MDDJEo?WR4$=D7(^@`lX5fy9xvBX?tAY+Y}AgqY|LCC1Rz*B_?uy84I^`fpW#`zX#m z8d^0capWE(5_6UmaDJP+-iJu|aB$-uM5+#79iq#g2$hqsgW&?DE0nL|?QCuDKr60i zg};Fn??!^;CIaea+I&4NyVdoCtbr=xye;c^8>@r#iOlbTl1~Q6=Q>&>_paxgOw=3r IRfQY>2Sdu>ssI20 delta 1468 zcmZ{k>r+)_6vlu1oCABG%`Qb|YzCOZgba{F4i~jhG13CmN-l|!gq$NDAdb;7v@$YM zu`I3K&F=RrrG`Oi+5KjH?pt4*KJ*tfP1Eyk5Y9ByhqK=IUGG}Y^Q`r*eSWX_wP@u0 zKWEMX%lO5mnm%LtU8)#xxWi?TlsW9OxzlFI#W4{McR8fZy4%I(ZkJ*9*z7ft_t@O) zl1rb>eP-R~aKBkcT=ICpMC>=a2W>_j9&#DUvxAs{7$9-Ye99S% z=s>Esr#oF#(c^KJ&ul*TIL8_!6jWR6tZf%g+Jb%N8$y`X5Y^iLSSSlnY zrb(>~P^#r!CZua=Afl+MS-dK)W1Voa6uqA772~ml8{`Yi+eni8)eb5^4!pt zN#@U$=d#M&RBOg-GBihLIifTN92*oB5o&&bym1D3zu%I3Rl-!TAkel#I4dboe=b*d zOb?8DSUiijcm~h-OgBQxC}0yeN@IccH*vF>AoMV%YpYbMqVKy1YiQ_5Y)|RT$QP zFxqAm@AexP)CE1iSd6Hr7paRebGUG9=Hd9$Uw}{7dxKViqEvLLN zH~h!W1Cv}fu4Cp1HDwT#WX{9|hUw`D32}>t(o|fLSCBDRn~17Qb93mo@yzU;!@!+r9&KB^-i6doZE!EO;KI6(IanMo*g7e(nmjO z1~{ZYNWs#*|}b(fGCrDYRasquj1-MAUofX1hM7VuAPQXG=zx WD7pl=RB$`!)#s5}%1%LrNd60Zm(9Nb diff --git a/wlauto/external/uiauto/build.sh b/wlauto/external/uiauto/build.sh index 96b8b7f2..074f245a 100755 --- a/wlauto/external/uiauto/build.sh +++ b/wlauto/external/uiauto/build.sh @@ -18,4 +18,4 @@ ant build -cp bin/classes/com/arm/wlauto/uiauto/BaseUiAutomation.class ../../common +cp bin/classes/com/arm/wlauto/uiauto/BaseUiAutomation.class ../../common/android 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 4d26100b..8fd35df6 100644 --- a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java +++ b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java @@ -20,6 +20,10 @@ import java.io.File; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.concurrent.TimeoutException; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import android.app.Activity; import android.os.Bundle; @@ -109,5 +113,40 @@ public class BaseUiAutomation extends UiAutomatorTestCase { throw new TimeoutException("Timed out waiting for Logcat text \"%s\"".format(searchText)); } } + + public Integer[] splitVersion(String versionString) { + String pattern = "(\\d+).(\\d+).(\\d+)"; + Pattern r = Pattern.compile(pattern); + ArrayList result = new ArrayList(); + + Matcher m = r.matcher(versionString); + if (m.find() && m.groupCount() > 0) { + for(int i=1; i<=m.groupCount(); i++) { + result.add(Integer.parseInt(m.group(i))); + } + } else { + throw new IllegalArgumentException(versionString + " - unknown format"); + } + return result.toArray(new Integer[result.size()]); + } + + //Return values: + // -1 = a lower than b + // 0 = a and b equal + // 1 = a greater than b + public int compareVersions(Integer[] a, Integer[] b) { + if (a.length != b.length) { + String msg = "Versions do not match format:\n %1$s\n %1$s"; + msg = String.format(msg, Arrays.toString(a), Arrays.toString(b)); + throw new IllegalArgumentException(msg); + } + for(int i=0; i b[i]) + return 1; + else if(a[i] < b[i]) + return -1; + } + return 0; + } } From 5a1c8c7a7e53ef848eaa653b7eae00944055eec7 Mon Sep 17 00:00:00 2001 From: Sebastian Goscik Date: Fri, 13 May 2016 14:52:22 +0100 Subject: [PATCH 3/3] cameracapture & camerarecord: Updated workloads to work with Android M+ The stock camera app as of Android M has changed. This commit updates the ui automation to work with this new app. As part of this change it was required to bump the API level of the ui automation to 18. Also made the teardown of the capture workload close the app like the record workload. --- wlauto/utils/types.py | 30 ++++- wlauto/workloads/cameracapture/__init__.py | 17 ++- .../com.arm.wlauto.uiauto.cameracapture.jar | Bin 3125 -> 4499 bytes .../cameracapture/uiauto/project.properties | 2 +- .../com/arm/wlauto/uiauto/UiAutomation.java | 113 ++++++++++++++---- wlauto/workloads/camerarecord/__init__.py | 14 +++ .../com.arm.wlauto.uiauto.camerarecord.jar | Bin 3053 -> 4437 bytes .../camerarecord/uiauto/project.properties | 2 +- .../com/arm/wlauto/uiauto/UiAutomation.java | 68 ++++++++++- 9 files changed, 211 insertions(+), 35 deletions(-) diff --git a/wlauto/utils/types.py b/wlauto/utils/types.py index 419fcb0c..e9a49fb9 100644 --- a/wlauto/utils/types.py +++ b/wlauto/utils/types.py @@ -111,7 +111,6 @@ def list_of_numbers(value): """ Value must be iterable. All elements will be converted to numbers (either ``ints`` or ``float``\ s depending on the elements). - """ if not isiterable(value): raise ValueError(value) @@ -300,3 +299,32 @@ class arguments(list): def __str__(self): return ' '.join(self) + +class range_dict(dict): + """ + This dict allows you to specify mappings with a range. + + If a key is not in the dict it will search downward until + the next key and return its value. E.g: + + If: + a[5] = "Hello" + a[10] = "There" + + Then: + a[2] == None + a[7] == "Hello" + a[999] == "There" + + """ + def __getitem__(self, i): + key = int(i) + while key not in self and key > 0: + key -= 1 + if key <= 0: + raise KeyError(i) + return dict.__getitem__(self, key) + + def __setitem__(self, i, v): + i = int(i) + super(range_dict, self).__setitem__(i, v) diff --git a/wlauto/workloads/cameracapture/__init__.py b/wlauto/workloads/cameracapture/__init__.py index de72acea..7e7e2aab 100644 --- a/wlauto/workloads/cameracapture/__init__.py +++ b/wlauto/workloads/cameracapture/__init__.py @@ -16,6 +16,7 @@ # pylint: disable=E1101 from wlauto import UiAutomatorWorkload, Parameter +from wlauto.utils.types import range_dict class Cameracapture(UiAutomatorWorkload): @@ -28,6 +29,10 @@ class Cameracapture(UiAutomatorWorkload): package = 'com.google.android.gallery3d' activity = 'com.android.camera.CameraActivity' + api_packages = range_dict() + api_packages[1] = 'com.google.android.gallery3d' + api_packages[23] = 'com.google.android.GoogleCamera' + parameters = [ Parameter('no_of_captures', kind=int, default=5, description='Number of photos to be taken.'), @@ -40,12 +45,18 @@ class Cameracapture(UiAutomatorWorkload): self.uiauto_params['no_of_captures'] = self.no_of_captures self.uiauto_params['time_between_captures'] = self.time_between_captures + def initialize(self, context): + api = self.device.get_sdk_version() + self.uiauto_params['api_level'] = api + self.package = self.api_packages[api] + version = self.device.get_installed_package_version(self.package) + version = version.replace(' ', '_') + self.uiauto_params['version'] = version + def setup(self, context): super(Cameracapture, self).setup(context) self.device.execute('am start -n {}/{}'.format(self.package, self.activity)) - def update_result(self, context): - pass - def teardown(self, context): + self.device.execute('am force-stop {}'.format(self.package)) super(Cameracapture, self).teardown(context) diff --git a/wlauto/workloads/cameracapture/com.arm.wlauto.uiauto.cameracapture.jar b/wlauto/workloads/cameracapture/com.arm.wlauto.uiauto.cameracapture.jar index 0d37d0b26211dfe5b5daef5e289abcbe4ece4062..52bf4b49d54932e216ede27d615321771995d5c6 100644 GIT binary patch delta 4253 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 delta 2869 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 T3IG7`6O&#MF9vA~00000(G#52 diff --git a/wlauto/workloads/cameracapture/uiauto/project.properties b/wlauto/workloads/cameracapture/uiauto/project.properties index a3ee5ab6..ce39f2d0 100644 --- a/wlauto/workloads/cameracapture/uiauto/project.properties +++ b/wlauto/workloads/cameracapture/uiauto/project.properties @@ -11,4 +11,4 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-17 +target=android-18 diff --git a/wlauto/workloads/cameracapture/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/cameracapture/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index a5497468..9c9a2dea 100644 --- a/wlauto/workloads/cameracapture/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/cameracapture/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -16,6 +16,8 @@ package com.arm.wlauto.uiauto.cameracapture; +import java.util.concurrent.TimeUnit; + import android.app.Activity; import android.os.Bundle; import android.util.Log; @@ -32,37 +34,98 @@ import com.arm.wlauto.uiauto.BaseUiAutomation; public class UiAutomation extends BaseUiAutomation { public static String TAG = "cameracapture"; + int timeDurationBetweenEachCapture = 0; + int sleepTime = 2; + int iterations = 0; + int api = 0; + Integer[] version = {0,0,0}; public void runUiAutomation() throws Exception { - int timeDurationBetweenEachCapture = 0; - int sleepTime = 2; - Bundle parameters = getParams(); - String noOfCaptures = ""; - int iterations = 0; + Bundle parameters = getParams(); + if (parameters.size() > 0) { + iterations = Integer.parseInt(parameters + .getString("no_of_captures")); + timeDurationBetweenEachCapture = Integer.parseInt(parameters + .getString("time_between_captures")); + api = Integer.parseInt(parameters.getString("api_level")); + String versionString = parameters.getString("version"); + version = splitVersion(versionString); + } + + // Pre Android M UI + if(api < 23) + takePhotosAosp(); + else + { + if(compareVersions(version, new Integer[]{3,2,0}) >= 0) + takePhotosGoogleV3_2(); + else + takePhotosGoogle(); + } + } - if (parameters.size() > 0) { - iterations = Integer.parseInt(parameters - .getString("no_of_captures")); - timeDurationBetweenEachCapture = Integer.parseInt(parameters - .getString("time_between_captures")); - } - // switch to camera capture mode - UiObject clickModes = new UiObject(new UiSelector().descriptionMatches("Camera, video or panorama selector")); - clickModes.click(); - sleep(sleepTime); + private void takePhotosAosp() throws Exception + { + // switch to camera capture mode + UiObject clickModes = new UiObject(new UiSelector().descriptionMatches("Camera, video or panorama selector")); + clickModes.click(); + sleep(sleepTime); - UiObject changeModeToCapture = new UiObject(new UiSelector().descriptionMatches("Switch to photo")); + UiObject changeModeToCapture = new UiObject(new UiSelector().descriptionMatches("Switch to photo")); - changeModeToCapture.click(); - sleep(sleepTime); + changeModeToCapture.click(); + sleep(sleepTime); - // click to capture photos - UiObject clickCaptureButton = new UiObject(new UiSelector().descriptionMatches("Shutter button")); + // click to capture photos + UiObject clickCaptureButton = new UiObject(new UiSelector().descriptionMatches("Shutter button")); - for (int i = 0; i < iterations; i++) { - clickCaptureButton.longClick(); - sleep(timeDurationBetweenEachCapture); - } - getUiDevice().pressBack(); + for (int i = 0; i < iterations; i++) { + clickCaptureButton.longClick(); + sleep(timeDurationBetweenEachCapture); + } + getUiDevice().pressBack(); + } + + private void takePhotosGoogleV3_2() throws Exception + { + // clear tutorial if needed + UiObject tutorialText = new UiObject(new UiSelector().resourceId("com.android.camera2:id/photoVideoSwipeTutorialText")); + if (tutorialText.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + tutorialText.swipeLeft(5); + sleep(sleepTime); + tutorialText.swipeRight(5); + } + + // ensure we are in photo mode + UiObject viewFinder = new UiObject(new UiSelector().resourceId("com.android.camera2:id/viewfinder_frame")); + viewFinder.swipeRight(5); + + // click to capture photos + UiObject clickCaptureButton = new UiObject(new UiSelector().resourceId("com.android.camera2:id/photo_video_button")); + + for (int i = 0; i < iterations; i++) { + clickCaptureButton.longClick(); + sleep(timeDurationBetweenEachCapture); + } + } + + private void takePhotosGoogle() throws Exception + { + // open mode select menu + UiObject swipeScreen = new UiObject(new UiSelector().resourceId("com.android.camera2:id/mode_options_overlay")); + swipeScreen.swipeRight(5); + + // switch to video mode + UiObject changeModeToCapture = new UiObject(new UiSelector().descriptionMatches("Switch to Camera Mode")); + changeModeToCapture.click(); + sleep(sleepTime); + + // click to capture photos + UiObject clickCaptureButton = new UiObject(new UiSelector().descriptionMatches("Shutter")); + + for (int i = 0; i < iterations; i++) { + clickCaptureButton.longClick(); + sleep(timeDurationBetweenEachCapture); + } } } diff --git a/wlauto/workloads/camerarecord/__init__.py b/wlauto/workloads/camerarecord/__init__.py index 7f237f2f..b39ab143 100644 --- a/wlauto/workloads/camerarecord/__init__.py +++ b/wlauto/workloads/camerarecord/__init__.py @@ -14,6 +14,7 @@ # from wlauto import UiAutomatorWorkload, Parameter +from wlauto.utils.types import range_dict class Camerarecord(UiAutomatorWorkload): @@ -28,6 +29,10 @@ class Camerarecord(UiAutomatorWorkload): activity = 'com.android.camera.CameraActivity' run_timeout = 0 + api_packages = range_dict() + api_packages[1] = 'com.google.android.gallery3d' + api_packages[23] = 'com.google.android.GoogleCamera' + parameters = [ Parameter('recording_time', kind=int, default=60, description='The video recording time in seconds.'), @@ -36,8 +41,17 @@ class Camerarecord(UiAutomatorWorkload): def __init__(self, device, **kwargs): super(Camerarecord, self).__init__(device) self.uiauto_params['recording_time'] = self.recording_time # pylint: disable=E1101 + self.uiauto_params['version'] = "button" self.run_timeout = 3 * self.uiauto_params['recording_time'] + def initialize(self, context): + api = self.device.get_sdk_version() + self.uiauto_params['api_level'] = api + self.package = self.api_packages[api] + version = self.device.get_installed_package_version(self.package) + version = version.replace(' ', '_') + self.uiauto_params['version'] = version + def setup(self, context): super(Camerarecord, self).setup(context) self.device.execute('am start -n {}/{}'.format(self.package, self.activity)) diff --git a/wlauto/workloads/camerarecord/com.arm.wlauto.uiauto.camerarecord.jar b/wlauto/workloads/camerarecord/com.arm.wlauto.uiauto.camerarecord.jar index 7de7cfcff84c135d7cc7ab9dbe42aaef68abe585..d52f2d4d49f5ffa1800731c46b1a8431ce28eeb2 100644 GIT binary patch delta 4199 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 M^a+tXf>c5^x5`CQA$5FcKds@8<#o8G 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 diff --git a/wlauto/workloads/camerarecord/uiauto/project.properties b/wlauto/workloads/camerarecord/uiauto/project.properties index a3ee5ab6..ce39f2d0 100644 --- a/wlauto/workloads/camerarecord/uiauto/project.properties +++ b/wlauto/workloads/camerarecord/uiauto/project.properties @@ -11,4 +11,4 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-17 +target=android-18 diff --git a/wlauto/workloads/camerarecord/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/camerarecord/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index c030a078..4b504460 100644 --- a/wlauto/workloads/camerarecord/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/camerarecord/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -16,6 +16,8 @@ package com.arm.wlauto.uiauto.camerarecord; +import java.util.concurrent.TimeUnit; + import android.app.Activity; import android.os.Bundle; import android.util.Log; @@ -32,18 +34,36 @@ import com.arm.wlauto.uiauto.BaseUiAutomation; public class UiAutomation extends BaseUiAutomation { public static String TAG = "camerarecord"; + int timeToRecord = 0; + int timeout = 4; + int sleepTime = 2; + int recordingTime = 0; + int api = 0; + Integer[] version = {0,0,0}; public void runUiAutomation() throws Exception { Bundle parameters = getParams(); - int timeToRecord = 0; - int timeout = 4; - int sleepTime = 2; - int recordingTime = 0; if (parameters.size() > 0) { recordingTime = Integer.parseInt(parameters .getString("recording_time")); + api = Integer.parseInt(parameters.getString("api_level")); + String versionString = parameters.getString("version"); + version = splitVersion(versionString); } + //Pre Android M UI + if (api < 23) + recordVideoAosp(); + else + { + if(compareVersions(version, new Integer[]{3,2,0}) >= 0) + recordVideoGoogleV3_2(); + else + recordVideoGoogle(); + } + } + + void recordVideoAosp() throws Exception { // switch to camera capture mode UiObject clickModes = new UiObject(new UiSelector().descriptionMatches("Camera, video or panorama selector")); clickModes.click(); @@ -62,4 +82,44 @@ public class UiAutomation extends BaseUiAutomation { getUiDevice().pressBack(); } + void recordVideoGoogleV3_2() throws Exception { + // clear tutorial if needed + UiObject tutorialText = new UiObject(new UiSelector().resourceId("com.android.camera2:id/photoVideoSwipeTutorialText")); + if (tutorialText.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + tutorialText.swipeLeft(5); + sleep(sleepTime); + tutorialText.swipeRight(5); + } + + // ensure we are in video mode + UiObject viewFinder = new UiObject(new UiSelector().resourceId("com.android.camera2:id/viewfinder_frame")); + viewFinder.swipeLeft(5); + + // click to capture photos + UiObject clickCaptureButton = new UiObject(new UiSelector().resourceId("com.android.camera2:id/photo_video_button")); + clickCaptureButton.longClick(); + sleep(recordingTime); + + // stop video recording + clickCaptureButton.longClick(); + } + + void recordVideoGoogle() throws Exception { + // Open mode select menu + UiObject swipeScreen = new UiObject(new UiSelector().resourceId("com.android.camera2:id/mode_options_overlay")); + swipeScreen.swipeRight(5); + + // Switch to video mode + UiObject changeModeToCapture = new UiObject(new UiSelector().descriptionMatches("Switch to Video Camera")); + changeModeToCapture.click(); + sleep(sleepTime); + + UiObject clickRecordingButton = new UiObject(new UiSelector().descriptionMatches("Shutter")); + clickRecordingButton.longClick(); + sleep(recordingTime); + + // Stop video recording + clickRecordingButton.longClick(); + } } +