diff options
Diffstat (limited to 'src/com/android/launcher3/SettingsActivity.java')
-rw-r--r-- | src/com/android/launcher3/SettingsActivity.java | 97 |
1 files changed, 56 insertions, 41 deletions
diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java index 4135d5be8..5ef6dd531 100644 --- a/src/com/android/launcher3/SettingsActivity.java +++ b/src/com/android/launcher3/SettingsActivity.java @@ -17,13 +17,14 @@ package com.android.launcher3; import android.app.Activity; -import android.os.AsyncTask; +import android.content.ContentResolver; +import android.database.ContentObserver; import android.os.Bundle; +import android.os.Handler; import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; -import android.preference.TwoStatePreference; +import android.provider.Settings; +import android.provider.Settings.System; /** * Settings activity for Launcher. Currently implements the following setting: Allow rotation @@ -42,56 +43,70 @@ public class SettingsActivity extends Activity { /** * This fragment shows the launcher preferences. */ - public static class LauncherSettingsFragment extends PreferenceFragment - implements OnPreferenceChangeListener { + public static class LauncherSettingsFragment extends PreferenceFragment { + + private SystemDisplayRotationLockObserver mRotationLockObserver; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getPreferenceManager().setSharedPreferencesName(LauncherFiles.SHARED_PREFERENCES_KEY); addPreferencesFromResource(R.xml.launcher_preferences); - PreferenceScreen screen = getPreferenceScreen(); - for (int i = screen.getPreferenceCount() - 1; i >= 0; i--) { - Preference pref = screen.getPreference(i); - if (pref instanceof TwoStatePreference) { - setBooleanPrefUsingContentProvider((TwoStatePreference) pref); - } + // Setup allow rotation preference + Preference rotationPref = findPreference(Utilities.ALLOW_ROTATION_PREFERENCE_KEY); + if (getResources().getBoolean(R.bool.allow_rotation)) { + // Launcher supports rotation by default. No need to show this setting. + getPreferenceScreen().removePreference(rotationPref); + } else { + ContentResolver resolver = getContext().getContentResolver(); + mRotationLockObserver = new SystemDisplayRotationLockObserver(rotationPref, resolver); + + // Register a content observer to listen for system setting changes while + // this UI is active. + resolver.registerContentObserver( + Settings.System.getUriFor(System.ACCELEROMETER_ROTATION), + false, mRotationLockObserver); + + // Initialize the UI once + mRotationLockObserver.onChange(true); + rotationPref.setDefaultValue(Utilities.getAllowRotationDefaultValue(getContext())); } } @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - Bundle extras = new Bundle(); - extras.putBoolean(LauncherSettings.Settings.EXTRA_VALUE, (Boolean) newValue); - getActivity().getContentResolver().call( - LauncherSettings.Settings.CONTENT_URI, - LauncherSettings.Settings.METHOD_SET_BOOLEAN, - preference.getKey(), extras); - return true; + public void onDestroy() { + if (mRotationLockObserver != null) { + getContext().getContentResolver().unregisterContentObserver(mRotationLockObserver); + mRotationLockObserver = null; + } + super.onDestroy(); } + } - private void setBooleanPrefUsingContentProvider(final TwoStatePreference pref) { - pref.setPersistent(false); - pref.setEnabled(false); + /** + * Content observer which listens for system auto-rotate setting changes, and enables/disables + * the launcher rotation setting accordingly. + */ + private static class SystemDisplayRotationLockObserver extends ContentObserver { - new AsyncTask<Void, Void, Boolean>() { - @Override - protected Boolean doInBackground(Void... params) { - Bundle extras = new Bundle(); - extras.putBoolean(LauncherSettings.Settings.EXTRA_DEFAULT_VALUE, true); - Bundle value = pref.getContext().getContentResolver().call( - LauncherSettings.Settings.CONTENT_URI, - LauncherSettings.Settings.METHOD_GET_BOOLEAN, - pref.getKey(), extras); - return value.getBoolean(LauncherSettings.Settings.EXTRA_VALUE); - } + private final Preference mRotationPref; + private final ContentResolver mResolver; - @Override - protected void onPostExecute(Boolean aBoolean) { - pref.setChecked(aBoolean); - pref.setEnabled(true); - pref.setOnPreferenceChangeListener(LauncherSettingsFragment.this); - } - }.execute(); + public SystemDisplayRotationLockObserver( + Preference rotationPref, ContentResolver resolver) { + super(new Handler()); + mRotationPref = rotationPref; + mResolver = resolver; + } + + @Override + public void onChange(boolean selfChange) { + boolean enabled = Settings.System.getInt(mResolver, + Settings.System.ACCELEROMETER_ROTATION, 1) == 1; + mRotationPref.setEnabled(enabled); + mRotationPref.setSummary(enabled + ? R.string.allow_rotation_desc : R.string.allow_rotation_blocked_desc); } } } |