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;
229627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasaniimport android.app.Dialog;
23d90b5a84d8261a30db573de5a722722d6a37391eJim Millerimport android.app.admin.DevicePolicyManager;
249e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.BroadcastReceiver;
25992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.content.ContentResolver;
26992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.content.Context;
279e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.Intent;
289e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.IntentFilter;
296677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackbornimport android.content.res.Configuration;
308a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tateimport android.content.res.Resources;
319e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.DisplayManager;
329e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.WifiDisplay;
339e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.WifiDisplayStatus;
34992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.os.Bundle;
35992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.os.RemoteException;
36992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.CheckBoxPreference;
37992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.ListPreference;
38992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.Preference;
399627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasaniimport android.preference.Preference.OnPreferenceClickListener;
40992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.preference.PreferenceScreen;
41992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.provider.Settings;
42883d850ede03968018587781a8e20683398d98feAmith Yamasaniimport android.provider.Settings.SettingNotFoundException;
439627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasaniimport android.util.AttributeSet;
44992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasaniimport android.util.Log;
45992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
4610fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brownimport com.android.internal.view.RotationPolicy;
476f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandlerimport com.android.settings.DreamSettings;
486f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler
49d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport java.util.ArrayList;
50d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani
51d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class DisplaySettings extends SettingsPreferenceFragment implements
529627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        Preference.OnPreferenceChangeListener, OnPreferenceClickListener {
53992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String TAG = "DisplaySettings";
54992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
55992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    /** If there is no setting in the provider, use this. */
56992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
57992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
58992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
59992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    private static final String KEY_ACCELEROMETER = "accelerometer";
606677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    private static final String KEY_FONT_SIZE = "font_size";
61883d850ede03968018587781a8e20683398d98feAmith Yamasani    private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
626f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler    private static final String KEY_SCREEN_SAVER = "screensaver";
639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private static final String KEY_WIFI_DISPLAY = "wifi_display";
649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
659627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    private static final int DLG_GLOBAL_CHANGE_WARNING = 1;
669627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani
679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private DisplayManager mDisplayManager;
68992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
6956c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown    private CheckBoxPreference mAccelerometer;
709627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    private WarnedListPreference mFontSizePref;
71883d850ede03968018587781a8e20683398d98feAmith Yamasani    private CheckBoxPreference mNotificationPulse;
72992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
736677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    private final Configuration mCurConfig = new Configuration();
746677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
759391b9545f9845eae15713357bc4081853451f4aJim Miller    private ListPreference mScreenTimeoutPreference;
766f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler    private Preference mScreenSaverPreference;
779391b9545f9845eae15713357bc4081853451f4aJim Miller
789e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private WifiDisplayStatus mWifiDisplayStatus;
799e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private Preference mWifiDisplayPreference;
809e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
8110fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown    private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
8210fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown            new RotationPolicy.RotationPolicyListener() {
8326a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        @Override
8410fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        public void onChange() {
8556c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown            updateAccelerometerRotationCheckbox();
8626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        }
8726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    };
8826a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
89992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
90d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
91992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        super.onCreate(savedInstanceState);
92d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        ContentResolver resolver = getActivity().getContentResolver();
93992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
94992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        addPreferencesFromResource(R.xml.display_settings);
95992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
9656c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown        mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
9756c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown        mAccelerometer.setPersistent(false);
9810fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        if (RotationPolicy.isRotationLockToggleSupported(getActivity())) {
9910fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown            // If rotation lock is supported, then we do not provide this option in
10010fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown            // Display settings.  However, is still available in Accessibility settings.
10110fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown            getPreferenceScreen().removePreference(mAccelerometer);
10210fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        }
103992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
1046f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler        mScreenSaverPreference = findPreference(KEY_SCREEN_SAVER);
10547c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler        if (mScreenSaverPreference != null
10647c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler                && getResources().getBoolean(
107d983e1d1a52af2ab85d10f1a15c8387a6b6a3ba9John Spurlock                        com.android.internal.R.bool.config_dreamsSupported) == false) {
10847c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler            getPreferenceScreen().removePreference(mScreenSaverPreference);
10947c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler        }
11047c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler
1119391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference = (ListPreference) findPreference(KEY_SCREEN_TIMEOUT);
1129391b9545f9845eae15713357bc4081853451f4aJim Miller        final long currentTimeout = Settings.System.getLong(resolver, SCREEN_OFF_TIMEOUT,
1139391b9545f9845eae15713357bc4081853451f4aJim Miller                FALLBACK_SCREEN_TIMEOUT_VALUE);
1149391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference.setValue(String.valueOf(currentTimeout));
1159391b9545f9845eae15713357bc4081853451f4aJim Miller        mScreenTimeoutPreference.setOnPreferenceChangeListener(this);
1169391b9545f9845eae15713357bc4081853451f4aJim Miller        disableUnusableTimeouts(mScreenTimeoutPreference);
117698c24fcf0577888116e60c52892318feadc836aGilles Debunne        updateTimeoutPreferenceDescription(currentTimeout);
1182943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler
1199627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        mFontSizePref = (WarnedListPreference) findPreference(KEY_FONT_SIZE);
1206677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        mFontSizePref.setOnPreferenceChangeListener(this);
1219627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        mFontSizePref.setOnPreferenceClickListener(this);
122883d850ede03968018587781a8e20683398d98feAmith Yamasani        mNotificationPulse = (CheckBoxPreference) findPreference(KEY_NOTIFICATION_PULSE);
123883d850ede03968018587781a8e20683398d98feAmith Yamasani        if (mNotificationPulse != null
124883d850ede03968018587781a8e20683398d98feAmith Yamasani                && getResources().getBoolean(
125883d850ede03968018587781a8e20683398d98feAmith Yamasani                        com.android.internal.R.bool.config_intrusiveNotificationLed) == false) {
126883d850ede03968018587781a8e20683398d98feAmith Yamasani            getPreferenceScreen().removePreference(mNotificationPulse);
127883d850ede03968018587781a8e20683398d98feAmith Yamasani        } else {
128883d850ede03968018587781a8e20683398d98feAmith Yamasani            try {
129883d850ede03968018587781a8e20683398d98feAmith Yamasani                mNotificationPulse.setChecked(Settings.System.getInt(resolver,
130883d850ede03968018587781a8e20683398d98feAmith Yamasani                        Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
131883d850ede03968018587781a8e20683398d98feAmith Yamasani                mNotificationPulse.setOnPreferenceChangeListener(this);
132883d850ede03968018587781a8e20683398d98feAmith Yamasani            } catch (SettingNotFoundException snfe) {
133883d850ede03968018587781a8e20683398d98feAmith Yamasani                Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
134883d850ede03968018587781a8e20683398d98feAmith Yamasani            }
135883d850ede03968018587781a8e20683398d98feAmith Yamasani        }
13647c991f78cc9a2b24de1a7c616cd85053dddf671Daniel Sandler
1379e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        mDisplayManager = (DisplayManager)getActivity().getSystemService(
1389e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                Context.DISPLAY_SERVICE);
1399e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
1409e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        mWifiDisplayPreference = (Preference)findPreference(KEY_WIFI_DISPLAY);
1419e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        if (mWifiDisplayStatus.getFeatureState()
1429e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                == WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) {
1439e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            getPreferenceScreen().removePreference(mWifiDisplayPreference);
1449e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            mWifiDisplayPreference = null;
1459e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        }
1469391b9545f9845eae15713357bc4081853451f4aJim Miller    }
1479391b9545f9845eae15713357bc4081853451f4aJim Miller
148698c24fcf0577888116e60c52892318feadc836aGilles Debunne    private void updateTimeoutPreferenceDescription(long currentTimeout) {
149698c24fcf0577888116e60c52892318feadc836aGilles Debunne        ListPreference preference = mScreenTimeoutPreference;
1502943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        String summary;
151698c24fcf0577888116e60c52892318feadc836aGilles Debunne        if (currentTimeout < 0) {
152698c24fcf0577888116e60c52892318feadc836aGilles Debunne            // Unsupported value
153698c24fcf0577888116e60c52892318feadc836aGilles Debunne            summary = "";
1542943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        } else {
155698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final CharSequence[] entries = preference.getEntries();
156698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final CharSequence[] values = preference.getEntryValues();
15764516a191f03a777896798f79792d39cde9592d7Amith Yamasani            if (entries == null || entries.length == 0) {
15864516a191f03a777896798f79792d39cde9592d7Amith Yamasani                summary = "";
15964516a191f03a777896798f79792d39cde9592d7Amith Yamasani            } else {
16064516a191f03a777896798f79792d39cde9592d7Amith Yamasani                int best = 0;
16164516a191f03a777896798f79792d39cde9592d7Amith Yamasani                for (int i = 0; i < values.length; i++) {
16264516a191f03a777896798f79792d39cde9592d7Amith Yamasani                    long timeout = Long.parseLong(values[i].toString());
16364516a191f03a777896798f79792d39cde9592d7Amith Yamasani                    if (currentTimeout >= timeout) {
16464516a191f03a777896798f79792d39cde9592d7Amith Yamasani                        best = i;
16564516a191f03a777896798f79792d39cde9592d7Amith Yamasani                    }
1662943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler                }
16764516a191f03a777896798f79792d39cde9592d7Amith Yamasani                summary = preference.getContext().getString(R.string.screen_timeout_summary,
16864516a191f03a777896798f79792d39cde9592d7Amith Yamasani                        entries[best]);
1699391b9545f9845eae15713357bc4081853451f4aJim Miller            }
1709391b9545f9845eae15713357bc4081853451f4aJim Miller        }
171698c24fcf0577888116e60c52892318feadc836aGilles Debunne        preference.setSummary(summary);
172d90b5a84d8261a30db573de5a722722d6a37391eJim Miller    }
173992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
174d90b5a84d8261a30db573de5a722722d6a37391eJim Miller    private void disableUnusableTimeouts(ListPreference screenTimeoutPreference) {
175fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller        final DevicePolicyManager dpm =
176d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                (DevicePolicyManager) getActivity().getSystemService(
177d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Context.DEVICE_POLICY_SERVICE);
178fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller        final long maxTimeout = dpm != null ? dpm.getMaximumTimeToLock(null) : 0;
179d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        if (maxTimeout == 0) {
180d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            return; // policy not enforced
181d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
182d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        final CharSequence[] entries = screenTimeoutPreference.getEntries();
183d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        final CharSequence[] values = screenTimeoutPreference.getEntryValues();
184d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
185d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
186d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        for (int i = 0; i < values.length; i++) {
187698c24fcf0577888116e60c52892318feadc836aGilles Debunne            long timeout = Long.parseLong(values[i].toString());
188d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            if (timeout <= maxTimeout) {
189d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                revisedEntries.add(entries[i]);
190d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                revisedValues.add(values[i]);
191d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            }
192d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
193d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
194d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            screenTimeoutPreference.setEntries(
195d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
196d90b5a84d8261a30db573de5a722722d6a37391eJim Miller            screenTimeoutPreference.setEntryValues(
197d90b5a84d8261a30db573de5a722722d6a37391eJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
198698c24fcf0577888116e60c52892318feadc836aGilles Debunne            final int userPreference = Integer.parseInt(screenTimeoutPreference.getValue());
199fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            if (userPreference <= maxTimeout) {
200fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                screenTimeoutPreference.setValue(String.valueOf(userPreference));
201fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            } else {
202fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // There will be no highlighted selection since nothing in the list matches
203fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
204fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
205fc5a02225e8bca21f07543f55e1b51a33670c501Jim Miller            }
206d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        }
207d90b5a84d8261a30db573de5a722722d6a37391eJim Miller        screenTimeoutPreference.setEnabled(revisedEntries.size() > 0);
208992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
209992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
2108a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate    int floatToIndex(float val) {
2118a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        String[] indices = getResources().getStringArray(R.array.entryvalues_font_size);
2126677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        float lastVal = Float.parseFloat(indices[0]);
2136677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        for (int i=1; i<indices.length; i++) {
2146677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            float thisVal = Float.parseFloat(indices[i]);
2156677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            if (val < (lastVal + (thisVal-lastVal)*.5f)) {
2166677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn                return i-1;
2176677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            }
2186677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            lastVal = thisVal;
2196677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
2206677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        return indices.length-1;
2216677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
2226677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
2236677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    public void readFontSizePreference(ListPreference pref) {
2246677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        try {
225737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());
2266677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        } catch (RemoteException e) {
227737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            Log.w(TAG, "Unable to retrieve font size");
2286677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
2298a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate
2308a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        // mark the appropriate item in the preferences list
2318a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        int index = floatToIndex(mCurConfig.fontScale);
2328a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        pref.setValueIndex(index);
2338a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate
2348a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        // report the current size in the summary text
2358a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        final Resources res = getResources();
2368a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        String[] fontSizeNames = res.getStringArray(R.array.entries_font_size);
2378a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate        pref.setSummary(String.format(res.getString(R.string.summary_font_size),
2388a510c57dca097a1c437a0ff51ff5d677eeec6e4Christopher Tate                fontSizeNames[index]));
2396677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
2406677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn
241992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
242d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
243992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        super.onResume();
244992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
24510fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        RotationPolicy.registerRotationPolicyListener(getActivity(),
24610fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown                mRotationPolicyListener);
2479e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
2489e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        if (mWifiDisplayPreference != null) {
2499e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            getActivity().registerReceiver(mReceiver, new IntentFilter(
2509e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED));
2519e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
2529e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        }
2539e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
2549e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        updateState();
25526a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    }
25626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
25726a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    @Override
25826a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    public void onPause() {
25926a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani        super.onPause();
26026a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
26110fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        RotationPolicy.unregisterRotationPolicyListener(getActivity(),
26210fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown                mRotationPolicyListener);
2639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
2649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        if (mWifiDisplayPreference != null) {
2659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            getActivity().unregisterReceiver(mReceiver);
2669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        }
267992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
268992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
2699627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    @Override
2709627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    public Dialog onCreateDialog(int dialogId) {
2719627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        if (dialogId == DLG_GLOBAL_CHANGE_WARNING) {
2729627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            return Utils.buildGlobalChangeWarningDialog(getActivity(),
2739627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                    R.string.global_font_change_title,
2749627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                    new Runnable() {
2759627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                        public void run() {
2769627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                            mFontSizePref.click();
2779627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                        }
2789627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                    });
2799627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        }
2809627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        return null;
2819627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    }
2829627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani
283737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne    private void updateState() {
28456c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown        updateAccelerometerRotationCheckbox();
2856677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        readFontSizePreference(mFontSizePref);
2866f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler        updateScreenSaverSummary();
2879e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        updateWifiDisplaySummary();
2886f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler    }
2896f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler
2906f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler    private void updateScreenSaverSummary() {
291c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler        if (mScreenSaverPreference != null) {
292c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler            mScreenSaverPreference.setSummary(
293c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler                    DreamSettings.getSummaryTextWithDreamName(getActivity()));
294c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler        }
29526a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani    }
29626a1f898e04ca68dc8d1a58d15e9f901b09c90e2Amith Yamasani
2979e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private void updateWifiDisplaySummary() {
2989e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        if (mWifiDisplayPreference != null) {
2999e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            switch (mWifiDisplayStatus.getFeatureState()) {
3009e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                case WifiDisplayStatus.FEATURE_STATE_OFF:
3019e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_off);
3029e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    break;
3039e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                case WifiDisplayStatus.FEATURE_STATE_ON:
3049e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_on);
3059e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    break;
3069e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                case WifiDisplayStatus.FEATURE_STATE_DISABLED:
3079e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                default:
3089e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_disabled);
3099e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                    break;
3109e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            }
3119e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        }
3129e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    }
3139e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
31456c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown    private void updateAccelerometerRotationCheckbox() {
315980a6c3c4be59550db5140366096ea0640c99651Amith Yamasani        if (getActivity() == null) return;
31610fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown
31710fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown        mAccelerometer.setChecked(!RotationPolicy.isRotationLocked(getActivity()));
318992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
319992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
3206677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    public void writeFontSizePreference(Object objValue) {
3216677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        try {
3226677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            mCurConfig.fontScale = Float.parseFloat(objValue.toString());
32392c8ebacc118f23df94431f531075a8837394829Dianne Hackborn            ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
3246677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        } catch (RemoteException e) {
325737c81c775b24ca36c5325e45678f6df80bbaa43Gilles Debunne            Log.w(TAG, "Unable to save font size");
3266677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
3276677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn    }
328883d850ede03968018587781a8e20683398d98feAmith Yamasani
329992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    @Override
330992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
33156c58d5aef8186a0114be206a2f81216f8c19cf3Jeff Brown        if (preference == mAccelerometer) {
33210fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown            RotationPolicy.setRotationLockForAccessibility(
33310fbf52ccb5c6657eef3bbe520c71ff7f729bad3Jeff Brown                    getActivity(), !mAccelerometer.isChecked());
334883d850ede03968018587781a8e20683398d98feAmith Yamasani        } else if (preference == mNotificationPulse) {
335883d850ede03968018587781a8e20683398d98feAmith Yamasani            boolean value = mNotificationPulse.isChecked();
336883d850ede03968018587781a8e20683398d98feAmith Yamasani            Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE,
337883d850ede03968018587781a8e20683398d98feAmith Yamasani                    value ? 1 : 0);
338883d850ede03968018587781a8e20683398d98feAmith Yamasani            return true;
339992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        }
3402943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler        return super.onPreferenceTreeClick(preferenceScreen, preference);
341992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
342992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
343992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    public boolean onPreferenceChange(Preference preference, Object objValue) {
344992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        final String key = preference.getKey();
345992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        if (KEY_SCREEN_TIMEOUT.equals(key)) {
346992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            int value = Integer.parseInt((String) objValue);
347992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            try {
348698c24fcf0577888116e60c52892318feadc836aGilles Debunne                Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);
349698c24fcf0577888116e60c52892318feadc836aGilles Debunne                updateTimeoutPreferenceDescription(value);
350992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            } catch (NumberFormatException e) {
351992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani                Log.e(TAG, "could not persist screen timeout setting", e);
352992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani            }
353992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        }
3546677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        if (KEY_FONT_SIZE.equals(key)) {
3556677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn            writeFontSizePreference(objValue);
3566677e56f45c8e7b922efc4cc28d11529097b8ea6Dianne Hackborn        }
357992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani
358992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        return true;
359992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani    }
3609e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown
3619e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
3629e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        @Override
3639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        public void onReceive(Context context, Intent intent) {
3649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            if (intent.getAction().equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) {
3659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                mWifiDisplayStatus = (WifiDisplayStatus)intent.getParcelableExtra(
3669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                        DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
3679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown                updateWifiDisplaySummary();
3689e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown            }
3699e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown        }
3709e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown    };
3719627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani
3729627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    @Override
3739627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    public boolean onPreferenceClick(Preference preference) {
3749627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        if (preference == mFontSizePref) {
3759627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            if (Utils.hasMultipleUsers(getActivity())) {
3769627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                showDialog(DLG_GLOBAL_CHANGE_WARNING);
3779627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                return true;
3789627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            } else {
3799627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                mFontSizePref.click();
3809627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            }
3819627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        }
3829627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        return false;
3839627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani    }
384992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani}
385