1992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani/*
2992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * Copyright (C) 2010 The Android Open Source Project
3992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani *
4992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
5992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * you may not use this file except in compliance with the License.
6992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * You may obtain a copy of the License at
7992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani *
8992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
9992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani *
10992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * Unless required by applicable law or agreed to in writing, software
11992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
12992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * See the License for the specific language governing permissions and
14992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani * limitations under the License.
15992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani */
16992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
17992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasanipackage com.android.settings;
18992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
19992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
20992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
216677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackbornimport android.app.ActivityManagerNative;
22d90b5a84d8261a30db573de5a722722d6a37391eJim Millerimport android.app.admin.DevicePolicyManager;
23992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.content.ContentResolver;
24992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.content.Context;
256677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackbornimport android.content.res.Configuration;
268a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tateimport android.content.res.Resources;
2726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasaniimport android.database.ContentObserver;
28992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.os.Bundle;
2926a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasaniimport android.os.Handler;
30992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.os.RemoteException;
31cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brownimport android.os.ServiceManager;
32992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.CheckBoxPreference;
33992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.ListPreference;
34992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.Preference;
35992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.PreferenceScreen;
36992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.provider.Settings;
37883d850ede03968018587781a8e20683398d98feAmith Yamasaniimport android.provider.Settings.SettingNotFoundException;
38992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.util.Log;
39cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brownimport android.view.IWindowManager;
40cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brownimport android.view.Surface;
41992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
42d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport java.util.ArrayList;
43d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani
44d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class DisplaySettings extends SettingsPreferenceFragment implements
45992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        Preference.OnPreferenceChangeListener {
46992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String TAG = "DisplaySettings";
47992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
48992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    /** If there is no setting in the provider, use this. */
49992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
50992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
51992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
52992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String KEY_ACCELEROMETER = "accelerometer";
536677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    private static final String KEY_FONT_SIZE = "font_size";
54883d850ede03968018587781a8e20683398d98feAmith Yamasani    private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
55992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
56992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private CheckBoxPreference mAccelerometer;
576677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    private ListPreference mFontSizePref;
58883d850ede03968018587781a8e20683398d98feAmith Yamasani    private CheckBoxPreference mNotificationPulse;
59992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
606677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    private final Configuration mCurConfig = new Configuration();
616677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
629391b9545f9845eae15713357bc4081853451f4aJim Miller    private ListPreference mScreenTimeoutPreference;
639391b9545f9845eae15713357bc4081853451f4aJim Miller
6426a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    private ContentObserver mAccelerometerRotationObserver = new ContentObserver(new Handler()) {
6526a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        @Override
6626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        public void onChange(boolean selfChange) {
6726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani            updateAccelerometerRotationCheckbox();
6826a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        }
6926a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    };
7026a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
71992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
72d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
73992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        super.onCreate(savedInstanceState);
74d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        ContentResolver resolver = getActivity().getContentResolver();
75992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
76992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        addPreferencesFromResource(R.xml.display_settings);
77992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
78992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
79992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        mAccelerometer.setPersistent(false);
80992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
819391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference = (ListPreference) findPreference(KEY_SCREEN_TIMEOUT);
829391b9545f9845eae15713357bc4081853451f4aJim Miller        final long currentTimeout = Settings.System.getLong(resolver, SCREEN_OFF_TIMEOUT,
839391b9545f9845eae15713357bc4081853451f4aJim Miller                FALLBACK_SCREEN_TIMEOUT_VALUE);
849391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference.setValue(String.valueOf(currentTimeout));
859391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference.setOnPreferenceChangeListener(this);
869391b9545f9845eae15713357bc4081853451f4aJim Miller        disableUnusableTimeouts(mScreenTimeoutPreference);
87698c24fcf0577888116e60c52892318feadc836aGilles Debunne        updateTimeoutPreferenceDescription(currentTimeout);
882943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler
896677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        mFontSizePref = (ListPreference) findPreference(KEY_FONT_SIZE);
906677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        mFontSizePref.setOnPreferenceChangeListener(this);
91883d850ede03968018587781a8e20683398d98feAmith Yamasani        mNotificationPulse = (CheckBoxPreference) findPreference(KEY_NOTIFICATION_PULSE);
92883d850ede03968018587781a8e20683398d98feAmith Yamasani        if (mNotificationPulse != null
93883d850ede03968018587781a8e20683398d98feAmith Yamasani                && getResources().getBoolean(
94883d850ede03968018587781a8e20683398d98feAmith Yamasani                        com.android.internal.R.bool.config_intrusiveNotificationLed) == false) {
95883d850ede03968018587781a8e20683398d98feAmith Yamasani            getPreferenceScreen().removePreference(mNotificationPulse);
96883d850ede03968018587781a8e20683398d98feAmith Yamasani        } else {
97883d850ede03968018587781a8e20683398d98feAmith Yamasani            try {
98883d850ede03968018587781a8e20683398d98feAmith Yamasani                mNotificationPulse.setChecked(Settings.System.getInt(resolver,
99883d850ede03968018587781a8e20683398d98feAmith Yamasani                        Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
100883d850ede03968018587781a8e20683398d98feAmith Yamasani                mNotificationPulse.setOnPreferenceChangeListener(this);
101883d850ede03968018587781a8e20683398d98feAmith Yamasani            } catch (SettingNotFoundException snfe) {
102883d850ede03968018587781a8e20683398d98feAmith Yamasani                Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
103883d850ede03968018587781a8e20683398d98feAmith Yamasani            }
104883d850ede03968018587781a8e20683398d98feAmith Yamasani        }
1059391b9545f9845eae15713357bc4081853451f4aJim Miller    }
1069391b9545f9845eae15713357bc4081853451f4aJim Miller
107698c24fcf0577888116e60c52892318feadc836aGilles Debunne    private void updateTimeoutPreferenceDescription(long currentTimeout) {
108698c24fcf0577888116e60c52892318feadc836aGilles Debunne        ListPreference preference = mScreenTimeoutPreference;
1092943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        String summary;
110698c24fcf0577888116e60c52892318feadc836aGilles Debunne        if (currentTimeout < 0) {
111698c24fcf0577888116e60c52892318feadc836aGilles Debunne            // Unsupported value
112698c24fcf0577888116e60c52892318feadc836aGilles Debunne            summary = "";
1132943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        } else {
114698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final CharSequence[] entries = preference.getEntries();
115698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final CharSequence[] values = preference.getEntryValues();
1162943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler            int best = 0;
1172943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler            for (int i = 0; i < values.length; i++) {
118698c24fcf0577888116e60c52892318feadc836aGilles Debunne                long timeout = Long.parseLong(values[i].toString());
1192943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler                if (currentTimeout >= timeout) {
1202943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler                    best = i;
1212943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler                }
1229391b9545f9845eae15713357bc4081853451f4aJim Miller            }
123698c24fcf0577888116e60c52892318feadc836aGilles Debunne            summary = preference.getContext().getString(R.string.screen_timeout_summary,
124698c24fcf0577888116e60c52892318feadc836aGilles Debunne                    entries[best]);
1259391b9545f9845eae15713357bc4081853451f4aJim Miller        }
126698c24fcf0577888116e60c52892318feadc836aGilles Debunne        preference.setSummary(summary);
127d90b5a84d8261a30db573de5a722722d6a37391eJim Miller    }
128992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
129d90b5a84d8261a30db573de5a722722d6a37391eJim Miller    private void disableUnusableTimeouts(ListPreference screenTimeoutPreference) {
130fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller        final DevicePolicyManager dpm =
131d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                (DevicePolicyManager) getActivity().getSystemService(
132d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Context.DEVICE_POLICY_SERVICE);
133fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller        final long maxTimeout = dpm != null ? dpm.getMaximumTimeToLock(null) : 0;
134d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        if (maxTimeout == 0) {
135d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            return; // policy not enforced
136d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
137d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        final CharSequence[] entries = screenTimeoutPreference.getEntries();
138d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        final CharSequence[] values = screenTimeoutPreference.getEntryValues();
139d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
140d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
141d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        for (int i = 0; i < values.length; i++) {
142698c24fcf0577888116e60c52892318feadc836aGilles Debunne            long timeout = Long.parseLong(values[i].toString());
143d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            if (timeout <= maxTimeout) {
144d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                revisedEntries.add(entries[i]);
145d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                revisedValues.add(values[i]);
146d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            }
147d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
148d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
149d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            screenTimeoutPreference.setEntries(
150d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
151d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            screenTimeoutPreference.setEntryValues(
152d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
153698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final int userPreference = Integer.parseInt(screenTimeoutPreference.getValue());
154fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            if (userPreference <= maxTimeout) {
155fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                screenTimeoutPreference.setValue(String.valueOf(userPreference));
156fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            } else {
157fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // There will be no highlighted selection since nothing in the list matches
158fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
159fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
160fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            }
161d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
162d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        screenTimeoutPreference.setEnabled(revisedEntries.size() > 0);
163992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
164992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
1658a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate    int floatToIndex(float val) {
1668a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        String[] indices = getResources().getStringArray(R.array.entryvalues_font_size);
1676677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        float lastVal = Float.parseFloat(indices[0]);
1686677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        for (int i=1; i<indices.length; i++) {
1696677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            float thisVal = Float.parseFloat(indices[i]);
1706677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            if (val < (lastVal + (thisVal-lastVal)*.5f)) {
1716677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn                return i-1;
1726677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            }
1736677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            lastVal = thisVal;
1746677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
1756677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        return indices.length-1;
1766677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
1776677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
1786677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    public void readFontSizePreference(ListPreference pref) {
1796677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        try {
180737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());
1816677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        } catch (RemoteException e) {
182737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            Log.w(TAG, "Unable to retrieve font size");
1836677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
1848a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate
1858a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        // mark the appropriate item in the preferences list
1868a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        int index = floatToIndex(mCurConfig.fontScale);
1878a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        pref.setValueIndex(index);
1888a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate
1898a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        // report the current size in the summary text
1908a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        final Resources res = getResources();
1918a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        String[] fontSizeNames = res.getStringArray(R.array.entries_font_size);
1928a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        pref.setSummary(String.format(res.getString(R.string.summary_font_size),
1938a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate                fontSizeNames[index]));
1946677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
1956677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
196992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
197d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
198992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        super.onResume();
199992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
200737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne        updateState();
20126a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        getContentResolver().registerContentObserver(
20226a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani                Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), true,
20326a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani                mAccelerometerRotationObserver);
20426a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    }
20526a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
20626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    @Override
20726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    public void onPause() {
20826a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        super.onPause();
20926a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
21026a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        getContentResolver().unregisterContentObserver(mAccelerometerRotationObserver);
211992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
212992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
213737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne    private void updateState() {
21426a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        updateAccelerometerRotationCheckbox();
2156677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        readFontSizePreference(mFontSizePref);
21626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    }
21726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
21826a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    private void updateAccelerometerRotationCheckbox() {
219992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        mAccelerometer.setChecked(Settings.System.getInt(
220992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani                getContentResolver(),
221992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani                Settings.System.ACCELEROMETER_ROTATION, 0) != 0);
222992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
223992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
2246677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    public void writeFontSizePreference(Object objValue) {
2256677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        try {
2266677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            mCurConfig.fontScale = Float.parseFloat(objValue.toString());
22792c8ebacc118f23df94431f531075a8837394829Dianne Hackborn            ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
2286677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        } catch (RemoteException e) {
229737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            Log.w(TAG, "Unable to save font size");
2306677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
2316677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
232883d850ede03968018587781a8e20683398d98feAmith Yamasani
233992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
234992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
235992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        if (preference == mAccelerometer) {
236cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown            try {
237cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                IWindowManager wm = IWindowManager.Stub.asInterface(
238cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                        ServiceManager.getService(Context.WINDOW_SERVICE));
239cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                if (mAccelerometer.isChecked()) {
240cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                    wm.thawRotation();
241cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                } else {
242cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                    wm.freezeRotation(Surface.ROTATION_0);
243cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                }
244cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown            } catch (RemoteException exc) {
245cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown                Log.w(TAG, "Unable to save auto-rotate setting");
246cbf312ec2984dcc42bc39b01f4b126b0901740cfJeff Brown            }
247883d850ede03968018587781a8e20683398d98feAmith Yamasani        } else if (preference == mNotificationPulse) {
248883d850ede03968018587781a8e20683398d98feAmith Yamasani            boolean value = mNotificationPulse.isChecked();
249883d850ede03968018587781a8e20683398d98feAmith Yamasani            Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE,
250883d850ede03968018587781a8e20683398d98feAmith Yamasani                    value ? 1 : 0);
251883d850ede03968018587781a8e20683398d98feAmith Yamasani            return true;
252992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        }
2532943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        return super.onPreferenceTreeClick(preferenceScreen, preference);
254992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
255992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
256992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    public boolean onPreferenceChange(Preference preference, Object objValue) {
257992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        final String key = preference.getKey();
258992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        if (KEY_SCREEN_TIMEOUT.equals(key)) {
259992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            int value = Integer.parseInt((String) objValue);
260992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            try {
261698c24fcf0577888116e60c52892318feadc836aGilles Debunne                Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);
262698c24fcf0577888116e60c52892318feadc836aGilles Debunne                updateTimeoutPreferenceDescription(value);
263992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            } catch (NumberFormatException e) {
264992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani                Log.e(TAG, "could not persist screen timeout setting", e);
265992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            }
266992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        }
2676677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        if (KEY_FONT_SIZE.equals(key)) {
2686677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            writeFontSizePreference(objValue);
2696677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
270992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
271992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        return true;
272992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
273992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani}
274