Adding tests for rotation preference
Updating the gradle file to run tests directly from AndroidStudio

Change-Id: Iac23dfc6f995477f2406071fbfab3a16ee58ce6f
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 42ae5a3..8acc5e9 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -1,4 +1,4 @@
-<?xml version="2.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!-- Copyright (C) 2015 The Android Open Source Project
 
     Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,15 +15,17 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.android.launcher3.tests">
 
+    <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/>
+
     <application>
         <uses-library android:name="android.test.runner" />
     </application>
 
     <instrumentation
         android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.launcher3"
-        android:label="Unit tests for Launcher3">
+        android:targetPackage="com.android.launcher3" >
     </instrumentation>
 </manifest>
diff --git a/tests/src/com/android/launcher3/InvariantDeviceProfileTest.java b/tests/src/com/android/launcher3/InvariantDeviceProfileTest.java
index 1bc7c11..a99ae4f 100644
--- a/tests/src/com/android/launcher3/InvariantDeviceProfileTest.java
+++ b/tests/src/com/android/launcher3/InvariantDeviceProfileTest.java
@@ -52,9 +52,12 @@
 
     public void testFindClosestDeviceProfile2() {
         for (InvariantDeviceProfile idf: mPredefinedDeviceProfiles) {
+            ArrayList<InvariantDeviceProfile> predefinedProfilesCopy =
+                    new ArrayList<>(mPredefinedDeviceProfiles);
             ArrayList<InvariantDeviceProfile> closestProfiles =
                     mInvariantProfile.findClosestDeviceProfiles(
-                            idf.minWidthDps, idf.minHeightDps, mPredefinedDeviceProfiles);
+                            idf.minWidthDps, idf.minHeightDps, predefinedProfilesCopy
+                    );
             assertTrue(closestProfiles.get(0).equals(idf));
         }
     }
diff --git a/tests/src/com/android/launcher3/RotationPreferenceTest.java b/tests/src/com/android/launcher3/RotationPreferenceTest.java
new file mode 100644
index 0000000..5f63475
--- /dev/null
+++ b/tests/src/com/android/launcher3/RotationPreferenceTest.java
@@ -0,0 +1,87 @@
+package com.android.launcher3;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Rect;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.test.InstrumentationTestCase;
+
+/**
+ * Test for auto rotate preference.
+ */
+public class RotationPreferenceTest extends InstrumentationTestCase {
+
+    private UiDevice mDevice;
+    private Context mTargetContext;
+    private String mTargetPackage;
+
+    private SharedPreferences mPrefs;
+    private boolean mOriginalRotationValue;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mTargetContext = getInstrumentation().getTargetContext();
+        mTargetPackage = mTargetContext.getPackageName();
+        mPrefs = mTargetContext.getSharedPreferences(
+                LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
+        mOriginalRotationValue = mPrefs.getBoolean(Utilities.ALLOW_ROTATION_PREFERENCE_KEY, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        setRotationEnabled(mOriginalRotationValue);
+        super.tearDown();
+    }
+
+    public void testRotation_disabled() throws Exception {
+        if (mTargetContext.getResources().getBoolean(R.bool.allow_rotation)) {
+            // This is a tablet. The test is only valid to mobile devices.
+            return;
+        }
+
+        setRotationEnabled(false);
+        mDevice.setOrientationRight();
+        goToLauncher();
+
+        Rect hotseat = getHotseatBounds();
+        assertTrue(hotseat.width() > hotseat.height());
+    }
+
+    public void testRotation_enabled() throws Exception {
+        if (mTargetContext.getResources().getBoolean(R.bool.allow_rotation)) {
+            // This is a tablet. The test is only valid to mobile devices.
+            return;
+        }
+
+        setRotationEnabled(true);
+        mDevice.setOrientationRight();
+        goToLauncher();
+
+        Rect hotseat = getHotseatBounds();
+        assertTrue(hotseat.width() < hotseat.height());
+    }
+
+    private void goToLauncher() {
+        Intent homeIntent = new Intent(Intent.ACTION_MAIN)
+                .addCategory(Intent.CATEGORY_HOME)
+                .setPackage(mTargetPackage)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getInstrumentation().getContext().startActivity(homeIntent);
+        mDevice.wait(Until.hasObject(By.pkg(mTargetPackage).depth(0)), 3000);
+    }
+
+    private void setRotationEnabled(boolean enabled) {
+        mPrefs.edit().putBoolean(Utilities.ALLOW_ROTATION_PREFERENCE_KEY, enabled).commit();
+    }
+
+    private Rect getHotseatBounds() {
+        mDevice.wait(Until.hasObject(By.res(mTargetPackage, "hotseat")), 3000);
+        return mDevice.findObject(By.res(mTargetPackage, "hotseat")).getVisibleBounds();
+    }
+}