Reducing flakiness from Automater test

The test seemed to be failing because the screen was off or locked.
Added a launchpad activity which will dismiss keyguard and power on the
screen before starting the app_details activity. Also added
remove-active-admin as a tear down command and improved logging
to better troubleshoot failures in the future.

Bug: b/28067602
Change-Id: I348ca8bd4105afa1b37a71959fdadb56b36b76bb
diff --git a/tests/deviceadmin/deviceadminapp/Android.mk b/tests/deviceadmin/deviceadminapp/Android.mk
index 29c7cb3..6ee3943 100644
--- a/tests/deviceadmin/deviceadminapp/Android.mk
+++ b/tests/deviceadmin/deviceadminapp/Android.mk
@@ -31,4 +31,4 @@
 # tag this module as a cts test artifact
 LOCAL_COMPATIBILITY_SUITE := cts
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/deviceadmin/deviceadminapp/AndroidManifest.xml b/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
index 9ce61a6..ba99bcf 100644
--- a/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
+++ b/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
@@ -19,7 +19,7 @@
 
     <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="24"/>
 
-    <application>
+    <application android:testOnly="true">
         <receiver
                 android:name=".EmptyDeviceAdmin"
                 android:permission="android.permission.BIND_DEVICE_ADMIN"
diff --git a/tests/deviceadmin/uninstalltest/Android.mk b/tests/deviceadmin/uninstalltest/Android.mk
index 03831e2..ceee809 100644
--- a/tests/deviceadmin/uninstalltest/Android.mk
+++ b/tests/deviceadmin/uninstalltest/Android.mk
@@ -31,4 +31,4 @@
 # tag this module as a cts test artifact
 LOCAL_COMPATIBILITY_SUITE := cts
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/deviceadmin/uninstalltest/AndroidManifest.xml b/tests/deviceadmin/uninstalltest/AndroidManifest.xml
index 52a681a..f6d38de 100644
--- a/tests/deviceadmin/uninstalltest/AndroidManifest.xml
+++ b/tests/deviceadmin/uninstalltest/AndroidManifest.xml
@@ -19,8 +19,11 @@
 
     <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="24"/>
 
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
     <application>
         <uses-library android:name="android.test.runner"/>
+        <activity android:name="android.devicepolicy.cts.uiautomatertest.UiAutomaterTestActivity"/>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/deviceadmin/uninstalltest/AndroidTest.xml b/tests/deviceadmin/uninstalltest/AndroidTest.xml
index 51615f7..5bea9b3 100644
--- a/tests/deviceadmin/uninstalltest/AndroidTest.xml
+++ b/tests/deviceadmin/uninstalltest/AndroidTest.xml
@@ -16,16 +16,19 @@
 <configuration description="Config for the CTS device admin uninstall tests">
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
         <option name="cleanup-apks" value="true" />
+        <option name="install-arg" value="-t" />
         <option name="test-file-name" value="CtsEmptyDeviceAdmin.apk" />
         <option name="test-file-name" value="CtsDeviceAdminUninstallerTestCases.apk" />
     </target_preparer>
 
     <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
         <option name="run-command" value="dpm set-active-admin --user cur android.devicepolicy.cts.emptydeviceadmin/.EmptyDeviceAdmin" />
+        <option name="teardown-command" value="dpm remove-active-admin --user cur android.devicepolicy.cts.emptydeviceadmin/.EmptyDeviceAdmin" />
     </target_preparer>
 
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.devicepolicy.cts.uiautomatertest" />
+        <option name="runtime-hint" value="30s" />
     </test>
 
 </configuration>
\ No newline at end of file
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 23b3755..6e723b36 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,8 @@
  */
 package android.devicepolicy.cts.uiautomatertest;
 
+import android.app.Activity;
+import android.app.Instrumentation;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -26,11 +28,14 @@
 import android.provider.Settings;
 import android.widget.ScrollView;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.List;
 
 import android.support.test.InstrumentationRegistry;
@@ -44,6 +49,7 @@
 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
@@ -61,20 +67,35 @@
             .res("com.android.settings", "left_button");
     private static final UiSelector OK_BUTTON_SELECTOR = new UiSelector()
             .resourceId("android:id/button1");
+    private static final UiSelector SCROLL_VIEW_SELECTOR =
+            new UiSelector().className(ScrollView.class);
+
     private static final long DEACTIVATE_ADMIN_TIMEOUT = 15000;
     private static final long WAIT_FOR_ACTIVITY_TIMEOUT = 6000;
+    private static final String TAG = DeviceAdminUninstallTest.class.getSimpleName();
 
     private UiDevice mUiDevice;
+    private Instrumentation mInstrumentation;
     private Context mContext;
     private DevicePolicyManager mDpm;
     private PackageManager mPm;
+    private Activity mActivity;
 
     @Before
     public void setUp() throws Exception {
-        mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mUiDevice = UiDevice.getInstance(mInstrumentation);
         mContext = InstrumentationRegistry.getTargetContext();
         mDpm = mContext.getSystemService(DevicePolicyManager.class);
         mPm = mContext.getPackageManager();
+        startTestActivity();
+    }
+
+    private void startTestActivity() {
+        final Intent testActivityIntent = new Intent(mContext, UiAutomaterTestActivity.class);
+        testActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mActivity = mInstrumentation.startActivitySync(testActivityIntent);
+        mInstrumentation.waitForIdleSync();
     }
 
     private boolean hasActiveAdmin() {
@@ -122,19 +143,17 @@
         final Intent displayAppDetailsIntent = new Intent(
                 Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                 packageURI);
-        displayAppDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        mContext.startActivity(displayAppDetailsIntent);
+        mActivity.startActivity(displayAppDetailsIntent);
     }
 
     private void automateUninstallThroughUi() {
-        StringBuilder failMessageBuilder = new StringBuilder();
-        UiObject uninstallButton = mUiDevice
-                .findObject(UNINSTALL_BUTTON_SELECTOR);
-        UiScrollable scrollable = new UiScrollable(new UiSelector().className(ScrollView.class));
-        UiObject deactivateButton = mUiDevice
-                .findObject(DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR);
-        UiObject okButton = mUiDevice
-                .findObject(OK_BUTTON_SELECTOR);
+        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 okButton = mUiDevice.findObject(OK_BUTTON_SELECTOR);
+
         mUiDevice.wait(Until.hasObject(UNINSTALL_BUTTON_BYSELECTOR), WAIT_FOR_ACTIVITY_TIMEOUT);
         try {
             uninstallButton.clickAndWaitForNewWindow();
@@ -143,14 +162,20 @@
             waitTillNoActiveAdmin();
             okButton.clickAndWaitForNewWindow();
         } catch (UiObjectNotFoundException exc) {
-            failMessageBuilder.append(exc.getMessage());
+            Log.e(TAG, "Error while automating uninstall of " + DEVICE_ADMIN_PACKAGE_NAME, exc);
+            errorMessage = generateStackTrace(exc);
         } finally {
-            Assert.assertFalse(
-                    "Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not uninstalled.\n"
-                    + failMessageBuilder.toString(), packageExists());
+            Assert.assertFalse("Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not uninstalled\n"
+                    + errorMessage, packageExists());
         }
     }
 
+    private String generateStackTrace(Throwable t) {
+        StringWriter errorWriter = new StringWriter();
+        t.printStackTrace(new PrintWriter(errorWriter));
+        return errorWriter.toString();
+    }
+
     @Test
     public void uninstallPackageWithActiveAdmin() {
         Assert.assertTrue("Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not found installed",
@@ -160,4 +185,10 @@
         launchApplicationDetailsActivity();
         automateUninstallThroughUi();
     }
+
+    @After
+    public void tearDown() {
+        mActivity.finish();
+        mUiDevice.pressHome();
+    }
 }
diff --git a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java
new file mode 100644
index 0000000..aad76ec
--- /dev/null
+++ b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.devicepolicy.cts.uiautomatertest;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+public class UiAutomaterTestActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+    }
+}