Implement new rotation policy.

Show "auto-rotate screen" option in Display only if the Rotation Lock
feature is not available on the device.

When the "auto-rotate screen" option is disabled in Accessibility or
Display settings, hide the Rotation Lock feature.

Use new RotationPolicy class to adjust rotation settings.

Bug: 6523269
Change-Id: Ifa89ff055e5ad0a00888e10720dd76b0054fe290
This commit is contained in:
Jeff Brown
2012-06-05 17:49:24 -07:00
parent 62a6f626da
commit 10fbf52ccb
2 changed files with 35 additions and 64 deletions

View File

@@ -36,7 +36,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
@@ -45,18 +44,14 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory; import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter; import android.text.TextUtils.SimpleStringSplitter;
import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.IWindowManager;
import android.view.KeyCharacterMap; import android.view.KeyCharacterMap;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.Surface;
import android.view.View; import android.view.View;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
@@ -65,6 +60,7 @@ import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.content.PackageMonitor; import com.android.internal.content.PackageMonitor;
import com.android.internal.view.RotationPolicy;
import com.android.settings.AccessibilitySettings.ToggleSwitch.OnBeforeCheckedChangeListener; import com.android.settings.AccessibilitySettings.ToggleSwitch.OnBeforeCheckedChangeListener;
import java.util.HashMap; import java.util.HashMap;
@@ -78,8 +74,6 @@ import java.util.Set;
*/ */
public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable, public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable,
Preference.OnPreferenceChangeListener { Preference.OnPreferenceChangeListener {
private static final String TAG = "AccessibilitySettings";
private static final String DEFAULT_SCREENREADER_MARKET_LINK = private static final String DEFAULT_SCREENREADER_MARKET_LINK =
"market://search?q=pname:com.google.android.marvin.talkback"; "market://search?q=pname:com.google.android.marvin.talkback";
@@ -151,22 +145,11 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
} }
}; };
private final Uri mLockScreenRotationUri = Uri.withAppendedPath(Settings.System.CONTENT_URI, private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
Settings.System.ACCELEROMETER_ROTATION); new RotationPolicy.RotationPolicyListener() {
private final ContentObserver mSettingsContentObserver = new ContentObserver(mHandler) {
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public void onChange() {
if (mLockScreenRotationUri.equals(uri)) { updateLockScreenRotationCheckbox();
try {
final boolean lockRotationEnabled = (Settings.System.getInt(
getActivity().getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION) == 0);
mToggleLockScreenRotationPreference.setChecked(lockRotationEnabled);
} catch (SettingNotFoundException e) {
/* ignore */
}
}
} }
}; };
@@ -200,14 +183,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
offerInstallAccessibilitySerivceOnce(); offerInstallAccessibilitySerivceOnce();
} }
mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false); mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
getActivity().getContentResolver().registerContentObserver(mLockScreenRotationUri, false, RotationPolicy.registerRotationPolicyListener(getActivity(),
mSettingsContentObserver); mRotationPolicyListener);
} }
@Override @Override
public void onPause() { public void onPause() {
mSettingsPackageMonitor.unregister(); mSettingsPackageMonitor.unregister();
getContentResolver().unregisterContentObserver(mSettingsContentObserver); RotationPolicy.unregisterRotationPolicyListener(getActivity(),
mRotationPolicyListener);
super.onPause(); super.onPause();
} }
@@ -258,17 +242,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
} }
private void handleLockScreenRotationPreferenceClick() { private void handleLockScreenRotationPreferenceClick() {
try { RotationPolicy.setRotationLockForAccessibility(getActivity(),
IWindowManager wm = IWindowManager.Stub.asInterface( !mToggleLockScreenRotationPreference.isChecked());
ServiceManager.getService(Context.WINDOW_SERVICE));
if (!mToggleLockScreenRotationPreference.isChecked()) {
wm.thawRotation();
} else {
wm.freezeRotation(Surface.ROTATION_0);
}
} catch (RemoteException exc) {
Log.w(TAG, "Unable to save auto-rotate setting");
}
} }
private void handleToggleSpeakPasswordPreferenceClick() { private void handleToggleSpeakPasswordPreferenceClick() {
@@ -453,9 +428,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
} }
// Auto-rotate screen // Auto-rotate screen
final boolean lockRotationEnabled = Settings.System.getInt(getContentResolver(), updateLockScreenRotationCheckbox();
Settings.System.ACCELEROMETER_ROTATION, 0) != 1;
mToggleLockScreenRotationPreference.setChecked(lockRotationEnabled);
// Speak passwords. // Speak passwords.
final boolean speakPasswordEnabled = Settings.Secure.getInt(getContentResolver(), final boolean speakPasswordEnabled = Settings.Secure.getInt(getContentResolver(),
@@ -475,6 +448,11 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mToggleScriptInjectionPreference.setInjectionAllowed(scriptInjectionAllowed); mToggleScriptInjectionPreference.setInjectionAllowed(scriptInjectionAllowed);
} }
private void updateLockScreenRotationCheckbox() {
mToggleLockScreenRotationPreference.setChecked(
!RotationPolicy.isRotationLocked(getActivity()));
}
private void offerInstallAccessibilitySerivceOnce() { private void offerInstallAccessibilitySerivceOnce() {
// There is always one preference - if no services it is just a message. // There is always one preference - if no services it is just a message.
if (mServicesCategory.getPreference(0) != mNoServicesMessagePreference) { if (mServicesCategory.getPreference(0) != mNoServicesMessagePreference) {

View File

@@ -24,11 +24,8 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
@@ -36,9 +33,8 @@ import android.preference.PreferenceScreen;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException; import android.provider.Settings.SettingNotFoundException;
import android.util.Log; import android.util.Log;
import android.view.IWindowManager;
import android.view.Surface;
import com.android.internal.view.RotationPolicy;
import com.android.settings.DreamSettings; import com.android.settings.DreamSettings;
import java.util.ArrayList; import java.util.ArrayList;
@@ -65,9 +61,10 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
private ListPreference mScreenTimeoutPreference; private ListPreference mScreenTimeoutPreference;
private Preference mScreenSaverPreference; private Preference mScreenSaverPreference;
private ContentObserver mAccelerometerRotationObserver = new ContentObserver(new Handler()) { private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
new RotationPolicy.RotationPolicyListener() {
@Override @Override
public void onChange(boolean selfChange) { public void onChange() {
updateAccelerometerRotationCheckbox(); updateAccelerometerRotationCheckbox();
} }
}; };
@@ -81,6 +78,11 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER); mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
mAccelerometer.setPersistent(false); mAccelerometer.setPersistent(false);
if (RotationPolicy.isRotationLockToggleSupported(getActivity())) {
// If rotation lock is supported, then we do not provide this option in
// Display settings. However, is still available in Accessibility settings.
getPreferenceScreen().removePreference(mAccelerometer);
}
mScreenSaverPreference = findPreference(KEY_SCREEN_SAVER); mScreenSaverPreference = findPreference(KEY_SCREEN_SAVER);
if (mScreenSaverPreference != null if (mScreenSaverPreference != null
@@ -210,16 +212,17 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
super.onResume(); super.onResume();
updateState(); updateState();
getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), true, RotationPolicy.registerRotationPolicyListener(getActivity(),
mAccelerometerRotationObserver); mRotationPolicyListener);
} }
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
getContentResolver().unregisterContentObserver(mAccelerometerRotationObserver); RotationPolicy.unregisterRotationPolicyListener(getActivity(),
mRotationPolicyListener);
} }
private void updateState() { private void updateState() {
@@ -237,9 +240,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
private void updateAccelerometerRotationCheckbox() { private void updateAccelerometerRotationCheckbox() {
if (getActivity() == null) return; if (getActivity() == null) return;
mAccelerometer.setChecked(Settings.System.getInt(
getContentResolver(), mAccelerometer.setChecked(!RotationPolicy.isRotationLocked(getActivity()));
Settings.System.ACCELEROMETER_ROTATION, 0) != 0);
} }
public void writeFontSizePreference(Object objValue) { public void writeFontSizePreference(Object objValue) {
@@ -254,17 +256,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
@Override @Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference == mAccelerometer) { if (preference == mAccelerometer) {
try { RotationPolicy.setRotationLockForAccessibility(
IWindowManager wm = IWindowManager.Stub.asInterface( getActivity(), !mAccelerometer.isChecked());
ServiceManager.getService(Context.WINDOW_SERVICE));
if (mAccelerometer.isChecked()) {
wm.thawRotation();
} else {
wm.freezeRotation(Surface.ROTATION_0);
}
} catch (RemoteException exc) {
Log.w(TAG, "Unable to save auto-rotate setting");
}
} else if (preference == mNotificationPulse) { } else if (preference == mNotificationPulse) {
boolean value = mNotificationPulse.isChecked(); boolean value = mNotificationPulse.isChecked();
Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE, Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE,