Fixing DeviceAdminUninstallTest for watch

There are few UI differences between phone and watch.
To make this test compatible with watch, several changes need to be made.

Bug-Id: 30120830
Change-Id: Ic903787abe4ccd52143ad54e73a5bb179070e256
diff --git a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
index a8e7cc1..d4f04de 100644
--- a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
+++ b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
@@ -15,6 +15,9 @@
  */
 package android.devicepolicy.cts.uiautomatertest;
 
+import static android.content.Intent.CATEGORY_DEFAULT;
+import static android.provider.Settings.ACTION_SETTINGS;
+
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.app.admin.DevicePolicyManager;
@@ -26,6 +29,19 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.net.Uri;
 import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.BySelector;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.support.test.uiautomator.UiScrollable;
+import android.support.test.uiautomator.UiSelector;
+import android.support.test.uiautomator.Until;
+import android.util.Log;
 import android.widget.ScrollView;
 
 import org.junit.After;
@@ -38,18 +54,6 @@
 import java.io.StringWriter;
 import java.util.List;
 import java.util.regex.Pattern;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.filters.LargeTest;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.BySelector;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject;
-import android.support.test.uiautomator.UiObjectNotFoundException;
-import android.support.test.uiautomator.UiScrollable;
-import android.support.test.uiautomator.UiSelector;
-import android.support.test.uiautomator.Until;
-import android.util.Log;
 
 @RunWith(AndroidJUnit4.class)
 @LargeTest
@@ -60,14 +64,6 @@
     private static final String URI_PACKAGE_PREFIX = "package:";
     private static final String UNINSTALL_BUTTON_TEXT_REGEX = "(?i)uninstall";
 
-    private static final UiSelector DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR = new UiSelector()
-            .resourceId("com.android.settings:id/action_button");
-    // Changing the below two selectors to match the button based on text due to b/29960172
-    private static final UiSelector UNINSTALL_BUTTON_SELECTOR = new UiSelector()
-            .clickable(true).textMatches(UNINSTALL_BUTTON_TEXT_REGEX);
-    private static final BySelector UNINSTALL_BUTTON_BYSELECTOR = By
-            .clickable(true).text(Pattern.compile(UNINSTALL_BUTTON_TEXT_REGEX));
-
     private static final UiSelector OK_BUTTON_SELECTOR = new UiSelector()
             .resourceId("android:id/button1");
     private static final UiSelector SCROLL_VIEW_SELECTOR =
@@ -83,7 +79,10 @@
     private DevicePolicyManager mDpm;
     private PackageManager mPm;
     private Activity mActivity;
+    private UiSelector mDeactivateAndUninstallButtonSelector;
+    private BySelector mUninstallButtonSelector;
     private boolean mHasFeature;
+    private boolean mIsWatch;
 
     @Before
     public void setUp() throws Exception {
@@ -97,6 +96,17 @@
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mUiDevice = UiDevice.getInstance(mInstrumentation);
         mDpm = mContext.getSystemService(DevicePolicyManager.class);
+        mIsWatch = mPm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+        if (mIsWatch) {
+            mUninstallButtonSelector = By.clickable(true).hasDescendant(
+                    By.text(Pattern.compile(UNINSTALL_BUTTON_TEXT_REGEX)));
+        } else {
+            mUninstallButtonSelector = By.clickable(true).text(
+                    Pattern.compile(UNINSTALL_BUTTON_TEXT_REGEX));
+        }
+        mDeactivateAndUninstallButtonSelector = new UiSelector().resourceId(
+                getDefaultSettingsPackageName() + ":id/action_button");
+
         startTestActivity();
     }
 
@@ -158,15 +168,21 @@
     private void automateUninstallThroughUi() {
         String errorMessage = "No exception in UI Automation";
 
-        UiObject uninstallButton = mUiDevice.findObject(UNINSTALL_BUTTON_SELECTOR);
         UiScrollable scrollable = new UiScrollable(SCROLL_VIEW_SELECTOR);
-        UiObject deactivateButton = mUiDevice.findObject(DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR);
+        UiObject deactivateButton = mUiDevice.findObject(mDeactivateAndUninstallButtonSelector);
         UiObject okButton = mUiDevice.findObject(OK_BUTTON_SELECTOR);
 
-        mUiDevice.wait(Until.hasObject(UNINSTALL_BUTTON_BYSELECTOR), WAIT_FOR_ACTIVITY_TIMEOUT);
         try {
-            uninstallButton.clickAndWaitForNewWindow();
-            scrollable.scrollIntoView(DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR);
+            UiObject2 uninstallButton = mUiDevice.wait(
+                    Until.findObject(mUninstallButtonSelector), WAIT_FOR_ACTIVITY_TIMEOUT);
+            uninstallButton.clickAndWait(Until.newWindow(), WAIT_FOR_ACTIVITY_TIMEOUT);
+
+            /** Watch specific: Extra confirm button click */
+            if (mIsWatch) {
+                okButton.clickAndWaitForNewWindow();
+            }
+
+            scrollable.scrollIntoView(mDeactivateAndUninstallButtonSelector);
             deactivateButton.clickAndWaitForNewWindow();
             waitTillNoActiveAdmin();
             okButton.clickAndWaitForNewWindow();
@@ -185,6 +201,12 @@
         return errorWriter.toString();
     }
 
+    private String getDefaultSettingsPackageName() {
+        Intent intent = new Intent(ACTION_SETTINGS).addCategory(CATEGORY_DEFAULT);
+        String packageName = intent.resolveActivity(mPm).getPackageName();
+        return packageName;
+    }
+
     @Test
     public void uninstallPackageWithActiveAdmin() {
         if (!mHasFeature) {