diff --git a/tests/jank/sysapp/Android.mk b/tests/jank/sysapp/Android.mk
index 2ba588d..b84bc10 100644
--- a/tests/jank/sysapp/Android.mk
+++ b/tests/jank/sysapp/Android.mk
@@ -19,7 +19,7 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ub-uiautomator ub-janktesthelper
+LOCAL_STATIC_JAVA_LIBRARIES := ub-uiautomator ub-janktesthelper timeresult-helper-lib
 
 LOCAK_SDK_VERSION := current
 
diff --git a/tests/jank/sysapp/AndroidManifest.xml b/tests/jank/sysapp/AndroidManifest.xml
index c4b2fbc..1f41c84 100644
--- a/tests/jank/sysapp/AndroidManifest.xml
+++ b/tests/jank/sysapp/AndroidManifest.xml
@@ -17,7 +17,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.sysapp.janktests">
 
-    <uses-sdk android:minSdkVersion="23" />
+    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
 
     <application>
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/BooksJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/BooksJankTests.java
index 4406a4c..a97e217 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/BooksJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/BooksJankTests.java
@@ -16,8 +16,13 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.test.jank.GfxMonitor;
@@ -31,8 +36,8 @@
 import android.support.test.uiautomator.Until;
 import android.widget.Button;
 import android.widget.ProgressBar;
-
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for Books app recommendation page fling
@@ -45,6 +50,10 @@
     private static final int EXPECTED_FRAMES = 100;
     private static final String PACKAGE_NAME = "com.google.android.apps.books";
     private UiDevice mDevice;
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     @Override
     public void setUp() throws Exception {
@@ -71,17 +80,29 @@
         SystemClock.sleep(SHORT_TIMEOUT);
     }
 
-    public void launchBooks () throws UiObjectNotFoundException {
+    public void launchBooks () throws UiObjectNotFoundException, IOException {
         launchApp(PACKAGE_NAME);
         dismissClings();
         openMyLibrary();
         Assert.assertTrue("Books haven't loaded yet", getNumberOfVisibleBooks() > 3);
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestBooksRecommendationPageFling(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while fling books mylibrary
-    @JankTest(beforeTest="launchBooks", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="launchBooks", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestBooksRecommendationPageFling")
     @GfxMonitor(processName=PACKAGE_NAME)
-    public void testBooksRecommendationPageFling() {
+    // Books is not a system app anymore
+    public void doNotRun_BooksRecommendationPageFling() {
         UiObject2 container = mDevice.wait(Until.findObject(
                 By.res(PACKAGE_NAME, "content_container")), LONG_TIMEOUT);
         for (int i = 0; i < INNER_LOOP; i++) {
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/CalendarJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/CalendarJankTests.java
index 21756b9..253a82a 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/CalendarJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/CalendarJankTests.java
@@ -16,8 +16,13 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.test.jank.GfxMonitor;
@@ -32,8 +37,8 @@
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
 import android.view.View;
-
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for Calendar
@@ -50,6 +55,10 @@
     private static final String PACKAGE_NAME = "com.google.android.calendar";
     private static final String RES_PACKAGE_NAME = "com.android.calendar";
     private UiDevice mDevice;
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     private BySelector mCalendarSelector = null;
     private Direction mScrollDirection = null;
@@ -82,16 +91,27 @@
         SystemClock.sleep(SHORT_TIMEOUT * 10);
     }
 
-    public void launchCalendar () throws UiObjectNotFoundException {
+    public void launchCalendar() throws UiObjectNotFoundException, IOException {
         launchApp(PACKAGE_NAME);
         mDevice.waitForIdle();
         dismissCling();
         assertNotNull("Calendar can't be found",
                 mDevice.wait(Until.findObject(mCalendarSelector), LONG_TIMEOUT));
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestCalendarItemsFling(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank of flinging calendar items
-    @JankTest(beforeTest="launchCalendar", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="launchCalendar", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestCalendarItemsFling")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testCalendarItemsFling() {
         UiObject2 calendarItems = null;
@@ -104,7 +124,7 @@
 
     private void dismissCling() {
         UiObject2 splashScreen = null;
-      splashScreen = mDevice.wait(Until.findObject(
+        splashScreen = mDevice.wait(Until.findObject(
               By.pkg(PACKAGE_NAME).clazz(View.class).desc("Got it")), LONG_TIMEOUT);
         if (splashScreen != null) {
             splashScreen.clickAndWait(Until.newWindow(), SHORT_TIMEOUT);
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/ChromeJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/ChromeJankTests.java
index f70cc0d..3659dda 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/ChromeJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/ChromeJankTests.java
@@ -16,8 +16,13 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.test.jank.GfxMonitor;
@@ -30,8 +35,8 @@
 import android.support.test.uiautomator.UiObject2;
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
-
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for Chorme apps
@@ -45,6 +50,10 @@
     private static final int EXPECTED_FRAMES = 100;
     private static final String PACKAGE_NAME = "com.android.chrome";
     private UiDevice mDevice;
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     @Override
     public void setUp() throws Exception {
@@ -71,13 +80,24 @@
         SystemClock.sleep(SHORT_TIMEOUT);
     }
 
-    public void launchChrome() throws UiObjectNotFoundException{
+    public void launchChrome() throws UiObjectNotFoundException, IOException{
         launchApp(PACKAGE_NAME);
         getOverflowMenu();
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestChromeOverflowMenuTap(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank window render for overflow menu tap
-    @JankTest(beforeTest="launchChrome", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="launchChrome", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestChromeOverflowMenuTap")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testChromeOverflowMenuTap() {
         for (int i = 0; i < INNER_LOOP; i++) {
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/ContactsJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/ContactsJankTests.java
index c83de69..1d7be9b 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/ContactsJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/ContactsJankTests.java
@@ -16,9 +16,14 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.database.Cursor;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.provider.ContactsContract;
@@ -34,8 +39,8 @@
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
 import android.widget.TextView;
-
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for Contacts
@@ -52,6 +57,10 @@
     private static final String RES_PACKAGE_NAME = "com.android.contacts";
     private static final String PM_PACKAGE_NAME = "com.android.packageinstaller";
     private UiDevice mDevice;
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     @Override
     public void setUp() throws Exception {
@@ -74,7 +83,7 @@
         SystemClock.sleep(SHORT_TIMEOUT);
     }
 
-    public void launchContacts () throws UiObjectNotFoundException {
+    public void launchContacts () throws UiObjectNotFoundException, IOException {
         launchApp(PACKAGE_NAME);
         mDevice.waitForIdle();
         // To infer that test is ready to be executed
@@ -85,10 +94,21 @@
         Cursor cursor =  getInstrumentation().getContext().getContentResolver().query(
                 ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
         Assert.assertTrue("There are not enough contacts", cursor.getCount() > MIN_CONTACT_COUNT);
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestAllContactsFling(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while flinging contacts list
-    @JankTest(beforeTest="launchContacts", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="launchContacts", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestAllContactsFling")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testAllContactsFling() {
         UiObject2 contactList = null;
@@ -101,4 +121,4 @@
             SystemClock.sleep(100);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/GMailJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/GMailJankTests.java
index 801ed48..4a5e96c 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/GMailJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/GMailJankTests.java
@@ -16,8 +16,13 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.test.jank.GfxMonitor;
@@ -32,8 +37,8 @@
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
 import android.widget.ImageButton;
-
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for scrolling gmail inbox mails
@@ -48,6 +53,10 @@
     private static final String PACKAGE_NAME = "com.google.android.gm";
     private static final String RES_PACKAGE_NAME = "android";
     private UiDevice mDevice;
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     @Override
     public void setUp() throws Exception {
@@ -77,16 +86,27 @@
         waitForEmailSync();
     }
 
-    public void prepGMailInboxFling() throws UiObjectNotFoundException {
+    public void prepGMailInboxFling() throws UiObjectNotFoundException, IOException {
       launchGMail();
       // Ensure test is ready to be executed
       UiObject2 list = mDevice.wait(
               Until.findObject(By.res(PACKAGE_NAME, "conversation_list_view")), SHORT_TIMEOUT);
       Assert.assertNotNull("Failed to locate 'conversation_list_view'", list);
+      TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+              getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestGMailInboxFling(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while scrolling gmail inbox
-    @JankTest(beforeTest="prepGMailInboxFling", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="prepGMailInboxFling", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestGMailInboxFling")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testGMailInboxFling() {
         UiObject2 list = mDevice.wait(
@@ -100,14 +120,25 @@
         }
     }
 
-    public void prepOpenNavDrawer() throws UiObjectNotFoundException {
+    public void prepOpenNavDrawer() throws UiObjectNotFoundException, IOException {
       launchGMail();
       // Ensure test is ready to be executed
       Assert.assertNotNull("Failed to locate Nav Drawer Openner", openNavigationDrawer());
+      TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+              getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestOpenNavDrawer(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while opening Navigation Drawer
-    @JankTest(beforeTest="prepOpenNavDrawer", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="prepOpenNavDrawer", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestOpenNavDrawer")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testOpenNavDrawer() {
         UiObject2 navDrawer = openNavigationDrawer();
@@ -119,7 +150,7 @@
         }
     }
 
-    public void prepFlingNavDrawer() throws UiObjectNotFoundException{
+    public void prepFlingNavDrawer() throws UiObjectNotFoundException, IOException{
         launchGMail();
         UiObject2 navDrawer = openNavigationDrawer();
         Assert.assertNotNull("Failed to locate Nav Drawer Openner", navDrawer);
@@ -127,10 +158,21 @@
         // Ensure test is ready to be executed
         UiObject2 container = getNavigationDrawerContainer();
         Assert.assertNotNull("Failed to locate Nav drawer container", container);
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestFlingNavDrawer(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while flinging Navigation Drawer
-    @JankTest(beforeTest="prepFlingNavDrawer", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="prepFlingNavDrawer", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestFlingNavDrawer")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testFlingNavDrawer() {
         UiObject2 container = getNavigationDrawerContainer();
@@ -198,4 +240,4 @@
         }
         return container;
     }
-}
\ No newline at end of file
+}
diff --git a/tests/jank/sysapp/src/com/android/sysapp/janktests/YouTubeJankTests.java b/tests/jank/sysapp/src/com/android/sysapp/janktests/YouTubeJankTests.java
index a1a004e..d0614d4 100644
--- a/tests/jank/sysapp/src/com/android/sysapp/janktests/YouTubeJankTests.java
+++ b/tests/jank/sysapp/src/com/android/sysapp/janktests/YouTubeJankTests.java
@@ -16,8 +16,13 @@
 
 package com.android.sysapp.janktests;
 
+import java.io.File;
+import java.io.IOException;
+
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.test.jank.GfxMonitor;
@@ -30,6 +35,7 @@
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
 import junit.framework.Assert;
+import android.support.test.timeresulthelper.TimeResultLogger;
 
 /**
  * Jank test for YouTube recommendation window fling 3 times.
@@ -41,6 +47,10 @@
     private static final int INNER_LOOP = 5;
     private static final int EXPECTED_FRAMES = 100;
     private static final String PACKAGE_NAME = "com.google.android.youtube";
+    private static final File TIMESTAMP_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "autotester.log");
+    private static final File RESULTS_FILE = new File(Environment.getExternalStorageDirectory()
+            .getAbsolutePath(), "results.log");
 
     private UiDevice mDevice;
 
@@ -69,16 +79,27 @@
         SystemClock.sleep(SHORT_TIMEOUT);
     }
 
-    public void launchYouTube () throws UiObjectNotFoundException {
+    public void launchYouTube () throws UiObjectNotFoundException, IOException {
         launchApp(PACKAGE_NAME);
         dismissCling();
         UiObject2 uiObject = mDevice.wait(
             Until.findObject(By.res(PACKAGE_NAME, "pane_fragment_container")), LONG_TIMEOUT);
         Assert.assertNotNull("Recommendation container is null", uiObject);
+        TimeResultLogger.writeTimeStampLogStart(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+    }
+
+    public void afterTestYouTubeRecomendation(Bundle metrics) throws IOException {
+        TimeResultLogger.writeTimeStampLogEnd(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), TIMESTAMP_FILE);
+        TimeResultLogger.writeResultToFile(String.format("%s-%s",
+                getClass().getSimpleName(), getName()), RESULTS_FILE, metrics);
+        super.afterTest(metrics);
     }
 
     // Measures jank while fling YouTube recommendation
-    @JankTest(beforeTest="launchYouTube", expectedFrames=EXPECTED_FRAMES)
+    @JankTest(beforeTest="launchYouTube", expectedFrames=EXPECTED_FRAMES,
+            afterTest="afterTestYouTubeRecomendation")
     @GfxMonitor(processName=PACKAGE_NAME)
     public void testYouTubeRecomendationWindowFling() {
         UiObject2 uiObject = mDevice.wait(
