Make SENSOR orientation modes trump rotation lock.
Bug: 5371750

Change-Id: I4d18b6c8ba1de0afd5929ddb8d7123272e35fbe2
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 45f9da2..fe32a5f 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -192,11 +192,12 @@
     int getPreferredOptionsPanelGravity();
 
 	/**
-	 * Lock the device orientation to the current rotation. Sensor input will
-	 * be ignored until thawRotation() is called.
+	 * Lock the device orientation to the specified rotation, or to the
+	 * current rotation if -1.  Sensor input will be ignored until
+	 * thawRotation() is called.
 	 * @hide
 	 */
-	void freezeRotation();
+	void freezeRotation(int rotation);
 
 	/**
 	 * Release the orientation lock imposed by freezeRotation().
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java
index 5ac5ad0..a31e2a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java
@@ -22,6 +22,7 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
+import android.util.Log;
 import android.util.Slog;
 import android.view.IWindowManager;
 import android.widget.CompoundButton;
@@ -63,13 +64,13 @@
                     try {
                         IWindowManager wm = IWindowManager.Stub.asInterface(
                                 ServiceManager.getService(Context.WINDOW_SERVICE));
-                        ContentResolver cr = mContext.getContentResolver();
                         if (autorotate) {
                             wm.thawRotation();
                         } else {
-                            wm.freezeRotation();
+                            wm.freezeRotation(-1);
                         }
                     } catch (RemoteException exc) {
+                        Log.w(TAG, "Unable to save auto-rotate setting");
                     }
                 }
             });
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index ed67707..989ccf7 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2947,10 +2947,7 @@
                 // enable 180 degree rotation while docked.
                 preferredRotation = mDeskDockEnablesAccelerometer
                         ? sensorRotation : mDeskDockRotation;
-            } else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
-                // Ignore sensor when user locked rotation.
-                preferredRotation = mUserRotation;
-            } else if ((mAccelerometerDefault != 0
+            } else if ((mAccelerometerDefault != 0 /* implies not rotation locked */
                             && (orientation == ActivityInfo.SCREEN_ORIENTATION_USER
                                     || orientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED))
                     || orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR
@@ -2973,6 +2970,9 @@
                 } else {
                     preferredRotation = lastRotation;
                 }
+            } else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
+                // Apply rotation lock.
+                preferredRotation = mUserRotation;
             }
 
             // TODO: Sometimes, we might want to override the application-requested
@@ -3018,8 +3018,8 @@
                     return mPortraitRotation;
 
                 default:
-                    // For USER, UNSPECIFIED and NOSENSOR, just return the preferred
-                    // orientation we already calculated.
+                    // For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
+                    // just return the preferred orientation we already calculated.
                     if (preferredRotation >= 0) {
                         return preferredRotation;
                     }
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 8e98ec4..f1994d1 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -5050,16 +5050,23 @@
     /**
      * Freeze rotation changes.  (Enable "rotation lock".)
      * Persists across reboots.
+     * @param rotation The desired rotation to freeze to, or -1 to use the
+     * current rotation.
      */
-    public void freezeRotation() {
+    public void freezeRotation(int rotation) {
         if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
                 "freezeRotation()")) {
             throw new SecurityException("Requires SET_ORIENTATION permission");
         }
+        if (rotation < -1 || rotation > Surface.ROTATION_270) {
+            throw new IllegalArgumentException("Rotation argument must be -1 or a valid "
+                    + "rotation constant.");
+        }
 
         if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
 
-        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
+        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED,
+                rotation == -1 ? mRotation : rotation);
         updateRotationUnchecked(false);
     }