diff options
4 files changed, 22 insertions, 13 deletions
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 @@ interface IWindowManager 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.AsyncTask; 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 @@ public class AutoRotateController implements CompoundButton.OnCheckedChangeListe 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { // 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class WindowManagerService extends IWindowManager.Stub /** * 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); } |