Fix the flipping orientation lock.
We were setting ACCELEROMETER_ROTATION to 0 before putting
in the proper USER_ROTATION value, and PhoneWindowManager's
content observer would eagerly rotate the screen to the last
locked orientation before re-rotating to the updated locked
rotation.
Now we set USER_ROTATION first. Additionally, the
content observer is now the only place we set
mUserRotation{,Mode} (previously we would race with it in
setUserRotationMode()).
Bug: 3425657
Change-Id: I04ba1a3631c6d985c2e406c4d148c39fb5c36216
This commit is contained in:
@@ -2463,6 +2463,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
public int rotationForOrientationLw(int orientation, int lastRotation,
|
||||
boolean displayEnabled) {
|
||||
|
||||
if (false) {
|
||||
Slog.v(TAG, "rotationForOrientationLw(orient="
|
||||
+ orientation + ", last=" + lastRotation
|
||||
+ "); user=" + mUserRotation + " "
|
||||
+ ((mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED)
|
||||
? "USER_ROTATION_LOCKED" : "")
|
||||
);
|
||||
}
|
||||
|
||||
if (mPortraitRotation < 0) {
|
||||
// Initialize the rotation angles for each orientation once.
|
||||
Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
|
||||
@@ -2581,15 +2590,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
// User rotation: to be used when all else fails in assigning an orientation to the device
|
||||
public void setUserRotationMode(int mode, int rot) {
|
||||
ContentResolver res = mContext.getContentResolver();
|
||||
mUserRotationMode = mode;
|
||||
|
||||
// mUserRotationMode and mUserRotation will be assigned by the content observer
|
||||
if (mode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
|
||||
mUserRotation = rot;
|
||||
Settings.System.putInt(res,
|
||||
Settings.System.ACCELEROMETER_ROTATION,
|
||||
0);
|
||||
Settings.System.putInt(res,
|
||||
Settings.System.USER_ROTATION,
|
||||
rot);
|
||||
Settings.System.putInt(res,
|
||||
Settings.System.ACCELEROMETER_ROTATION,
|
||||
0);
|
||||
} else {
|
||||
Settings.System.putInt(res,
|
||||
Settings.System.ACCELEROMETER_ROTATION,
|
||||
@@ -2907,7 +2916,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
pw.print(" mDeskDockRotation="); pw.println(mDeskDockRotation);
|
||||
pw.print(prefix); pw.print("mUserRotationMode="); pw.print(mUserRotationMode);
|
||||
pw.print(" mUserRotation="); pw.print(mUserRotation);
|
||||
pw.print("mAllowAllRotations="); pw.println(mAllowAllRotations);
|
||||
pw.print(" mAllowAllRotations="); pw.println(mAllowAllRotations);
|
||||
pw.print(prefix); pw.print("mAccelerometerDefault="); pw.print(mAccelerometerDefault);
|
||||
pw.print(" mCurrentAppOrientation="); pw.println(mCurrentAppOrientation);
|
||||
pw.print(prefix); pw.print("mCarDockEnablesAccelerometer=");
|
||||
|
||||
@@ -4822,21 +4822,25 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
public void freezeRotation() {
|
||||
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
|
||||
"setRotation()")) {
|
||||
"freezeRotation()")) {
|
||||
throw new SecurityException("Requires SET_ORIENTATION permission");
|
||||
}
|
||||
|
||||
if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
|
||||
|
||||
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
|
||||
setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
|
||||
}
|
||||
|
||||
public void thawRotation() {
|
||||
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
|
||||
"setRotation()")) {
|
||||
"thawRotation()")) {
|
||||
throw new SecurityException("Requires SET_ORIENTATION permission");
|
||||
}
|
||||
|
||||
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 0);
|
||||
if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
|
||||
|
||||
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
|
||||
setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user