release-request-348230ef-823f-402e-b379-76791af4b533-for-aosp-emu-2.5-release-4333248 snap-temp-L07000000102159225

Change-Id: I550e45cacb413ec10489e773ab84cec12e62556b
diff --git a/build/masters/master.client.adt/builders.pyl b/build/masters/master.client.adt/builders.pyl
index 6814b2e..843f1ee 100644
--- a/build/masters/master.client.adt/builders.pyl
+++ b/build/masters/master.client.adt/builders.pyl
@@ -123,6 +123,18 @@
        "branch": "all",
        "name_identifier": "system-images",
     },
+     "sys_image_oc_mr1_dev_poller": {
+       "gs_bucket": "android-build-emu-sysimage",
+       "gs_path": ["builds/git_oc-emu-dev-linux-sdk_gphone_x86-sdk_addon/",
+                   "builds/git_oc-emu-dev-linux-sdk_google_atv_x86-sdk/",
+                   "builds/git_oc-emu-dev-linux-sdk_gphone_x86_64-sdk_addon/",
+                   "builds/git_oc-emu-dev-linux-sdk_gphone_x86-user/"],
+       "pollInterval": 577,
+       "type": "GSMultiPoller",
+       "project": "oc-mr1-emu-dev",
+       "branch": "all",
+       "name_identifier": "system-images",
+    },
      "sys_image_master_poller": {
        "gs_bucket": "android-build-emu-sysimage",
        "gs_path": ["builds/git_master-linux-sdk_gphone_x86_64-sdk_addon/",
@@ -430,7 +442,7 @@
       "type": "emu_scheduler",
     },
     "system_image_scheduler": {
-      "project": ["master", "klp-emu-dev", "lmp-mr1-emu-dev", "mnc-emu-dev", "oc-emu-dev", "nyc-emu-dev", "nyc-mr1-emu-dev", "lmp-emu-dev", "gb-emu-dev",
+      "project": ["master", "klp-emu-dev", "lmp-mr1-emu-dev", "mnc-emu-dev", "oc-emu-dev", "oc-mr1-emu-dev","nyc-emu-dev", "nyc-mr1-emu-dev", "lmp-emu-dev", "gb-emu-dev",
                   "ics-mr1-emu-dev", "jb-emu-dev", "jb-mr1.1-emu-dev", "jb-mr2-emu-dev"],
       "type": "emu_scheduler",
     },
diff --git a/build/masters/master.client.adt/slave_logs/parser/parse_and_upload.py b/build/masters/master.client.adt/slave_logs/parser/parse_and_upload.py
index b66cc87..2f7ee96 100755
--- a/build/masters/master.client.adt/slave_logs/parser/parse_and_upload.py
+++ b/build/masters/master.client.adt/slave_logs/parser/parse_and_upload.py
@@ -81,6 +81,7 @@
                        '24':'nyc-emu-dev',
                        '25':'nyc-mr1-emu-dev',
                        '26':'oc-emu-dev',
+                       '27':'oc-mr1-emu-dev',
                       }
 
 def get_branches(builder, file_path, api):
diff --git a/build/masters/master.client.adt/slave_logs/parser/parse_and_upload_v2.py b/build/masters/master.client.adt/slave_logs/parser/parse_and_upload_v2.py
index 4ea696f..da4595a 100755
--- a/build/masters/master.client.adt/slave_logs/parser/parse_and_upload_v2.py
+++ b/build/masters/master.client.adt/slave_logs/parser/parse_and_upload_v2.py
@@ -55,6 +55,7 @@
         '24': 'nyc-emu-dev',
         '25': 'nyc-mr1-emu-dev',
         '26': 'oc-emu-dev',
+        '27': 'oc-mr1-emu-dev',
 }
 def _get_branches(builder, file_path, api):
     if builder.endswith('_CTS'):
diff --git a/build/scripts/slave/recipes/adt/adt.py b/build/scripts/slave/recipes/adt/adt.py
index 561c4df..e4618b1 100644
--- a/build/scripts/slave/recipes/adt/adt.py
+++ b/build/scripts/slave/recipes/adt/adt.py
@@ -98,6 +98,7 @@
                'nyc-mr1-emu-dev': bootStep('NYC_MR1', '{"ori": "nyc-mr1"}'),
                'nyc-emu-dev': bootStep('NYC', '{"ori": "nyc"}'),
                'oc-emu-dev': bootStep('OC', '{"ori": "oc"}'),
+               'oc-mr1-emu-dev': bootStep('OC_MR1', '{"ori": "oc-mr1"}'),
                'lmp-emu-dev': bootStep('LMP', '{"ori": "lmp"}'),
                'klp-emu-dev': bootStep('KLP', '{"ori": "klp"}'),
                'gb-emu-dev': bootStep('GB', '{"ori": "gb"}'),
@@ -235,10 +236,7 @@
                     '--build-dir', build_dir],
                    env=env)
       for emu_branch in emulator_branch_to_use:
-        if 'emu-master-dev' in emu_branch or 'emu-2.4-release' in emu_branch:
-          emulator_path = api.path.join(emu_branch, 'emulator', 'emulator')
-        else:
-          emulator_path = api.path.join(emu_branch, 'tools', 'emulator')
+        emulator_path = api.path.join(emu_branch, 'emulator', 'emulator')
         emu_desc = "sdk emulator" if emu_branch not in emulator_branches else emu_branch
         if not is_cts and not is_ui and not is_console and not is_avd:
           step_data = bootSteps[step]
diff --git a/emu_test/config/boot_cfg.csv b/emu_test/config/boot_cfg.csv
index 2d6b8fc..0a4c235 100644
--- a/emu_test/config/boot_cfg.csv
+++ b/emu_test/config/boot_cfg.csv
@@ -2,6 +2,10 @@
 API*,TAG*,ABI*,DEVICE,RAM,GPU,ORI,Ubuntu 12.04 HD Graphics 4000,Ubuntu 14.04 HD 4400,Ubuntu 14.04 Quadro 600,Ubuntu 15.04 Quadro K600,Win 7 32-bit HD 4400,Win 7 64-bit HD 4400,Win 8 64-bit Quadro 600,Win 8.1 64-bit Quadro 600,Win 10 64-bit Quadro 600,Mac 10.10.5 Intel HD 5000,Mac 10.10.5 Iris Pro,Mac 10.8.5 Intel HD 5000,Mac 10.11.1 Iris Pro
 API P,google_apis,x86,Nexus 6P,2048,yes,master,P,P,P,P,P,P,P,P,P,P,P,P,P
 API P,google_apis,x86_64,Nexus 6P,2048,yes,master,P,P,P,P,P,P,P,P,P,P,P,P,P
+API 27,android-tv,x86,Android TV (1080p),2048,yes,oc-mr1,P,P,P,P,P,P,P,P,P,P,P,P,P
+API 27,google_apis,x86,Nexus 6P,2048,yes,oc-mr1,P,P,P,P,P,P,P,P,P,P,P,P,P
+API 27,google_apis_playstore,x86,Nexus 6P,2048,yes,oc-mr1,P,P,P,P,P,P,P,P,P,P,P,P,P
+API 27,google_apis,x86_64,Nexus 6P,2048,yes,oc-mr1,P,P,P,P,P,P,P,P,P,P,P,P,P
 API 26,android-tv,x86,Android TV (1080p),2048,yes,public,P,P,P,P,P,P,P,P,P,P,P,P,P
 ,google_apis,x86,Nexus 6P,2048,yes,public,P,P,P,P,P,P,P,P,P,P,P,P,P
 ,google_apis_playstore,x86,Nexus 6P,2048,yes,public,P,P,P,P,P,P,P,P,P,P,P,P,P
diff --git a/emu_test/dashboard/index.html b/emu_test/dashboard/index.html
index 15b54ae..70370ec 100644
--- a/emu_test/dashboard/index.html
+++ b/emu_test/dashboard/index.html
@@ -128,7 +128,7 @@
                    "Win_7_64-bit_HD_4400",
                    "Win_8.1_64-bit_Quadro_600",
                    "Win_8_64-bit_Quadro_600"];
-       var apis = ["26", "25", "24", "23", "22", "21", "20", "19", "18", "17", "16", "15", "10"];
+       var apis = ["27", "26", "25", "24", "23", "22", "21", "20", "19", "18", "17", "16", "15", "10"];
        var tags = ["default", "google_apis", "android-wear", "android-tv"];
        var abis = ["x86", "x86_64", "armeabi-v7a", "arm64-v8a", "mips", "mips64"];
        var gpus = ["mesa", "on", "off"];
diff --git a/emu_test/utils/android_cl_scan.py b/emu_test/utils/android_cl_scan.py
index 4e8c3d7..d9d46f0 100644
--- a/emu_test/utils/android_cl_scan.py
+++ b/emu_test/utils/android_cl_scan.py
@@ -108,6 +108,8 @@
     return 'git_nyc-emu-dev', 'sdk_google_phone_x86-sdk_addon'
   elif 'sys_image_oc_dev_poller' in poller:
     return 'git_oc-emu-dev', 'sdk_gphone_x86-sdk_addon'
+  elif 'sys_image_oc_mr1_dev_poller' in poller:
+    return 'git_oc-mr1-emu-dev', 'sdk_gphone_x86-sdk_addon'
   elif 'sys_image_nyc_mr1_dev_poller' in poller:
     return 'git_nyc-mr1-emu-dev', 'sdk_google_phone_x86-sdk_addon'
   elif 'sys_image_klp_poller' in poller:
diff --git a/emu_test/utils/download_unzip_image.py b/emu_test/utils/download_unzip_image.py
index ab6b120..6af7d2b 100644
--- a/emu_test/utils/download_unzip_image.py
+++ b/emu_test/utils/download_unzip_image.py
@@ -39,6 +39,8 @@
       api = '25'
     elif 'nyc' in branch_name:
       api = '24'
+    elif 'oc-mr1' in branch_name:
+      api = '27'
     elif 'oc' in branch_name:
       api = '26'
     elif 'lmp' in branch_name:
diff --git a/system_image_uitests/app/src/androidTest/java/com/android/devtools/systemimage/uitest/smoke/PlayStoreTest.java b/system_image_uitests/app/src/androidTest/java/com/android/devtools/systemimage/uitest/smoke/PlayStoreTest.java
index bd9cd08..cac7b50 100644
--- a/system_image_uitests/app/src/androidTest/java/com/android/devtools/systemimage/uitest/smoke/PlayStoreTest.java
+++ b/system_image_uitests/app/src/androidTest/java/com/android/devtools/systemimage/uitest/smoke/PlayStoreTest.java
@@ -83,9 +83,6 @@
         final String application = "Google Translate";
 
         if (testFramework.getApi() >= 24 && testFramework.isGoogleApiAndPlayImage()) {
-            device.pressHome();
-            device.findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
-
             boolean playStoreInstalled = PlayStoreUtil.isPlayStoreInstalled(instrumentation);
 
             if (playStoreInstalled) {
@@ -195,9 +192,6 @@
         final String application = "Pocket Casts";
 
         if (testFramework.getApi() >= 24 && testFramework.isGoogleApiAndPlayImage()) {
-            device.pressHome();
-            device.findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
-
             boolean playStoreInstalled = PlayStoreUtil.isPlayStoreInstalled(instrumentation);
 
             if (playStoreInstalled) {
diff --git a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/utils/PlayStoreUtil.java b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/utils/PlayStoreUtil.java
index aeb76ea..9fadba2 100644
--- a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/utils/PlayStoreUtil.java
+++ b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/utils/PlayStoreUtil.java
@@ -29,6 +29,8 @@
 
 import java.util.concurrent.TimeUnit;
 
+import static org.junit.Assert.assertTrue;
+
 /**
  * Static utility methods pertaining to the Google Play Store
  */
@@ -44,20 +46,28 @@
      */
     public static boolean isPlayStoreInstalled(Instrumentation instrumentation) throws Exception {
         final UiDevice device = UiDevice.getInstance(instrumentation);
-        final UiScrollable scrollable = new UiScrollable(new UiSelector().scrollable(true));
+        boolean isInstalled = false;
         final String playStore = "Play Store";
 
         device.pressHome();
-        device.findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
-
-        boolean isInstalled = new Wait().until(new Wait.ExpectedCondition() {
-            @Override
-            public boolean isTrue() throws UiObjectNotFoundException {
-
-                scrollable.scrollIntoView(new UiSelector().text(playStore));
-                return scrollable.getChild(new UiSelector().text(playStore)).exists();
-            }
-        });
+        if (SystemUtil.getApiLevel() <= 24) {
+            device.findObject(new UiSelector().description("Apps")).clickAndWaitForNewWindow();
+            final UiScrollable scrollable = new UiScrollable(new UiSelector().scrollable(true));
+            isInstalled = new Wait().until(new Wait.ExpectedCondition() {
+                @Override
+                public boolean isTrue() throws UiObjectNotFoundException {
+                    scrollable.scrollIntoView(new UiSelector().text(playStore));
+                    return scrollable.getChild(new UiSelector().text(playStore)).exists();
+                }
+            });
+        } else {
+            isInstalled = new Wait().until(new Wait.ExpectedCondition() {
+                @Override
+                public boolean isTrue() throws UiObjectNotFoundException {
+                    return device.findObject(new UiSelector().text(playStore)).exists();
+                }
+            });
+        }
         return isInstalled;
     }
 
@@ -145,8 +155,13 @@
                 until(new Wait.ExpectedCondition() {
                     @Override
                     public boolean isTrue() throws UiObjectNotFoundException {
-                        return device.findObject(
-                                new UiSelector().description("Email or phone")).exists();
+                        if (SystemUtil.getApiLevel() <= 24) {
+                            return device.findObject(
+                                    new UiSelector().description("Email or phone")).exists();
+                        } else {
+                            return device.findObject(
+                                    new UiSelector().text("Email or phone")).exists();
+                        }
                     }
                 });
 
@@ -155,8 +170,13 @@
                     until(new Wait.ExpectedCondition() {
                         @Override
                         public boolean isTrue() throws UiObjectNotFoundException {
-                            return device.findObject(
-                                    new UiSelector().description("Sign in " + email)).exists();
+                            if (SystemUtil.getApiLevel() <= 24) {
+                                return device.findObject(
+                                        new UiSelector().description("Sign in " + email)).exists();
+                            } else {
+                                return device.findObject(
+                                        new UiSelector().text("Sign in " + email)).exists();
+                            }
                         }
                     });
             if (!needsPassword) {
@@ -170,7 +190,12 @@
             logInWithPassword(instrumentation, password);
         }
         else {
-            UiObject inputEmailField = device.findObject(new UiSelector().description("Email or phone"));
+            UiObject inputEmailField;
+            if (SystemUtil.getApiLevel() <= 24) {
+                inputEmailField = device.findObject(new UiSelector().description("Email or phone"));
+            } else {
+                inputEmailField = device.findObject(new UiSelector().text("Email or phone"));
+            }
             inputEmailField.clearTextField();
             inputEmailField.setText(email);
             device.findObject(new UiSelector().description("NEXT")).clickAndWaitForNewWindow();
@@ -260,7 +285,12 @@
      */
     private static void logInWithPassword(Instrumentation instrumentation, String password) throws Exception {
         final UiDevice device = UiDevice.getInstance(instrumentation);
-        UiObject inputPasswordField = device.findObject(new UiSelector().resourceId("password"));
+        UiObject inputPasswordField;
+        if (SystemUtil.getApiLevel() <= 24) {
+            inputPasswordField = device.findObject(new UiSelector().resourceId("password"));
+        } else {
+            inputPasswordField = device.findObject(new UiSelector().className("android.widget.EditText"));
+        }
         inputPasswordField.clearTextField();
         inputPasswordField.setText(password);
         device.findObject(new UiSelector().description("NEXT")).clickAndWaitForNewWindow();
diff --git a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStoreConfirmationWatcher.java b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStoreConfirmationWatcher.java
index 3b2c183..963cd96 100644
--- a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStoreConfirmationWatcher.java
+++ b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStoreConfirmationWatcher.java
@@ -67,6 +67,13 @@
                 mDevice.findObject(new UiSelector().text("NEXT")).click();
                 condition = true;
             }
+            isSuccess =
+                    mDevice.findObject(new UiSelector().description("NEXT"))
+                            .waitForExists(TimeUnit.MILLISECONDS.convert(3L, TimeUnit.SECONDS));
+            if (isSuccess) {
+                mDevice.findObject(new UiSelector().description("NEXT")).click();
+                condition = true;
+            }
         }
         catch (UiObjectNotFoundException e) {
             throw new AssertionError("Failed to dismiss the play store confirmation popup dialogs");
diff --git a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStorePermissionsWatcher.java b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStorePermissionsWatcher.java
index e427224..79c40ce 100644
--- a/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStorePermissionsWatcher.java
+++ b/system_image_uitests/app/src/main/java/com/android/devtools/systemimage/uitest/watchers/PlayStorePermissionsWatcher.java
@@ -53,6 +53,13 @@
                 mDevice.findObject(new UiSelector().text("ACCEPT")).click();
                 condition = true;
             }
+            isSuccess =
+                    mDevice.findObject(new UiSelector().description("I AGREE"))
+                            .waitForExists(TimeUnit.MILLISECONDS.convert(10L, TimeUnit.SECONDS));
+            if (isSuccess) {
+                mDevice.findObject(new UiSelector().description("I AGREE")).click();
+                condition = true;
+            }
         } catch (UiObjectNotFoundException e) {
             throw new AssertionError("Failed to dismiss the play store permissions dialogs");
         }