Merge "Adding tests for rotation preference Updating the gradle file to run tests directly from AndroidStudio" into ub-launcher3-burnaby-polish
diff --git a/build.gradle b/build.gradle
index d971755..44f5b7c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,7 @@
         mavenCentral()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:1.3.0'
+        classpath 'com.android.tools.build:gradle:+'
         classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0'
     }
 }
@@ -21,6 +21,9 @@
         targetSdkVersion 23
         versionCode 1
         versionName "1.0"
+
+        testApplicationId "com.android.launcher3.tests"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     buildTypes {
         debug {
@@ -30,10 +33,16 @@
     sourceSets {
         main {
             res.srcDirs = ['res', 'WallpaperPicker/res']
-            main.java.srcDirs = ['src', 'WallpaperPicker/src']
+            java.srcDirs = ['src', 'WallpaperPicker/src']
             manifest.srcFile 'AndroidManifest.xml'
             proto.srcDirs 'protos/'
         }
+
+        androidTest {
+            java.srcDirs = ['tests/src']
+            res.srcDirs = ['tests/res']
+            manifest.srcFile "tests/AndroidManifest.xml"
+        }
     }
 }
 
@@ -42,9 +51,13 @@
 }
 
 dependencies {
-    compile 'com.android.support:support-v4:+'
-    compile 'com.android.support:recyclerview-v7:+'
+    compile 'com.android.support:support-v4:23.0.1'
+    compile 'com.android.support:recyclerview-v7:23.0.1'
     compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-2'
+
+    testCompile 'junit:junit:4.12'
+    androidTestCompile 'com.android.support.test:runner:+'
+    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:+'
 }
 
 protobuf {
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();
+    }
+}