1501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master/*
2501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * Copyright (C) 2008 The Android Open Source Project
3501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master *
4501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * Licensed under the Apache License, Version 2.0 (the "License");
5501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * you may not use this file except in compliance with the License.
6501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * You may obtain a copy of the License at
7501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master *
8501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master *      http://www.apache.org/licenses/LICENSE-2.0
9501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master *
10501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * Unless required by applicable law or agreed to in writing, software
11501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * distributed under the License is distributed on an "AS IS" BASIS,
12501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * See the License for the specific language governing permissions and
14501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master * limitations under the License.
15501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master */
16501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
17501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterpackage com.android.providers.settings;
18501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
198823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.app.ActivityManagerNative;
208823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.app.IActivityManager;
214528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.IBackupManager;
22501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterimport android.content.Context;
238823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.content.res.Configuration;
2470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasaniimport android.location.LocationManager;
25501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterimport android.media.AudioManager;
26622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasaniimport android.media.RingtoneManager;
27622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasaniimport android.net.Uri;
28237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwoodimport android.os.IPowerManager;
29501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterimport android.os.RemoteException;
30501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterimport android.os.ServiceManager;
316794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthallimport android.os.UserManager;
32501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterimport android.provider.Settings;
338823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.text.TextUtils;
34501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
356794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthallimport java.util.Locale;
366794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthall
37501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b masterpublic class SettingsHelper {
38622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    private static final String SILENT_RINGTONE = "_silent";
39501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    private Context mContext;
40501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    private AudioManager mAudioManager;
4170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani
42501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    public SettingsHelper(Context context) {
43501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        mContext = context;
44501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        mAudioManager = (AudioManager) context
45501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master                .getSystemService(Context.AUDIO_SERVICE);
46501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    }
47501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
4870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    /**
4970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * Sets the property via a call to the appropriate API, if any, and returns
5070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * whether or not the setting should be saved to the database as well.
5170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * @param name the name of the setting
5270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * @param value the string value of the setting
5370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * @return whether to continue with writing the value to the database. In
5470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * some cases the data will be written by the call to the appropriate API,
5570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     * and in some cases the property value needs to be modified before setting.
5670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani     */
5770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    public boolean restoreValue(String name, String value) {
58501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        if (Settings.System.SCREEN_BRIGHTNESS.equals(name)) {
59501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master            setBrightness(Integer.parseInt(value));
60501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        } else if (Settings.System.SOUND_EFFECTS_ENABLED.equals(name)) {
6170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani            setSoundEffects(Integer.parseInt(value) == 1);
6270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) {
6370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani            setGpsLocation(value);
6470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani            return false;
6503b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate        } else if (Settings.Secure.BACKUP_AUTO_RESTORE.equals(name)) {
6603b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate            setAutoRestore(Integer.parseInt(value) == 1);
67818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        } else if (isAlreadyConfiguredCriticalAccessibilitySetting(name)) {
68818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov            return false;
69622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        } else if (Settings.System.RINGTONE.equals(name)
70622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                || Settings.System.NOTIFICATION_SOUND.equals(name)) {
71622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            setRingtone(name, value);
72622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            return false;
7370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        }
7470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        return true;
7570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    }
7670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani
77622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    public String onBackupValue(String name, String value) {
78622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        // Special processing for backing up ringtones
79622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        if (Settings.System.RINGTONE.equals(name)
80622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                || Settings.System.NOTIFICATION_SOUND.equals(name)) {
81622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            if (value == null) {
82622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                // Silent ringtone
83622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                return SILENT_RINGTONE;
84622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            } else {
85622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                return getCanonicalRingtoneValue(value);
86622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            }
87622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        }
88622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        // Return the original value
89622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        return value;
90622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    }
91622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani
92622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    /**
93622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani     * Sets the ringtone of type specified by the name.
94622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani     *
95622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani     * @param name should be Settings.System.RINGTONE or Settings.System.NOTIFICATION_SOUND.
96622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani     * @param value can be a canonicalized uri or "_silent" to indicate a silent (null) ringtone.
97622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani     */
98622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    private void setRingtone(String name, String value) {
99622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        // If it's null, don't change the default
100622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        if (value == null) return;
101622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        Uri ringtoneUri = null;
102622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        if (SILENT_RINGTONE.equals(value)) {
103622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            ringtoneUri = null;
104622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        } else {
105622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            Uri canonicalUri = Uri.parse(value);
106622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani            ringtoneUri = mContext.getContentResolver().uncanonicalize(canonicalUri);
1072e804444d64bdf2763c682109c838a8372b17934Amith Yamasani            if (ringtoneUri == null) {
1082e804444d64bdf2763c682109c838a8372b17934Amith Yamasani                // Unrecognized or invalid Uri, don't restore
1092e804444d64bdf2763c682109c838a8372b17934Amith Yamasani                return;
1102e804444d64bdf2763c682109c838a8372b17934Amith Yamasani            }
111622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        }
112622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        final int ringtoneType = Settings.System.RINGTONE.equals(name)
113622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani                ? RingtoneManager.TYPE_RINGTONE : RingtoneManager.TYPE_NOTIFICATION;
114622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        RingtoneManager.setActualDefaultRingtoneUri(mContext, ringtoneType, ringtoneUri);
115622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    }
116622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani
117622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    private String getCanonicalRingtoneValue(String value) {
118622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        final Uri ringtoneUri = Uri.parse(value);
119622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        final Uri canonicalUri = mContext.getContentResolver().canonicalize(ringtoneUri);
120622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani        return canonicalUri == null ? null : canonicalUri.toString();
121622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani    }
122622bf2220cf7fb9bb526afa39921ee2aa93e32caAmith Yamasani
123818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov    private boolean isAlreadyConfiguredCriticalAccessibilitySetting(String name) {
124818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        // These are the critical accessibility settings that are required for a
125818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        // blind user to be able to interact with the device. If these settings are
126818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        // already configured, we will not overwrite them. If they are already set,
127818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        // it means that the user has performed a global gesture to enable accessibility
128818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        // and definitely needs these features working after the restore.
129818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        if (Settings.Secure.ACCESSIBILITY_ENABLED.equals(name)
130818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov                || Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION.equals(name)
131818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov                || Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD.equals(name)
132818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov                || Settings.Secure.TOUCH_EXPLORATION_ENABLED.equals(name)) {
133818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov            return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0;
134818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        } else if (Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES.equals(name)
135818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov                || Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(name)) {
136818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov            return !TextUtils.isEmpty(Settings.Secure.getString(
137818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov                    mContext.getContentResolver(), name));
138818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        }
139818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov        return false;
140818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov    }
141818d20459099ea75e9b8d27c341af482653847a1Svetoslav Ganov
14203b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate    private void setAutoRestore(boolean enabled) {
14303b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate        try {
14403b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate            IBackupManager bm = IBackupManager.Stub.asInterface(
14503b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate                    ServiceManager.getService(Context.BACKUP_SERVICE));
14603b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate            if (bm != null) {
14703b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate                bm.setAutoRestore(enabled);
14803b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate            }
14903b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate        } catch (RemoteException e) {}
15003b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate    }
15103b6d90db9acc531a945c57795b903a3b74dd0b7Christopher Tate
15270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    private void setGpsLocation(String value) {
1536794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthall        UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
154a12fccf57d5ec289793699d9b22ff45daccd3933Maggie Benthall        if (um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) {
1556794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthall            return;
1566794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthall        }
15770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        final String GPS = LocationManager.GPS_PROVIDER;
158a12fccf57d5ec289793699d9b22ff45daccd3933Maggie Benthall        boolean enabled =
15970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani                GPS.equals(value) ||
16070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani                value.startsWith(GPS + ",") ||
16170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani                value.endsWith("," + GPS) ||
16270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani                value.contains("," + GPS + ",");
16370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        Settings.Secure.setLocationProviderEnabled(
16470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani                mContext.getContentResolver(), GPS, enabled);
16570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    }
16670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani
16770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani    private void setSoundEffects(boolean enable) {
16870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        if (enable) {
16970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani            mAudioManager.loadSoundEffects();
17070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani        } else {
17170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani            mAudioManager.unloadSoundEffects();
172501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        }
173501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    }
174501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
175501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    private void setBrightness(int brightness) {
176501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        try {
177237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood            IPowerManager power = IPowerManager.Stub.asInterface(
178237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood                    ServiceManager.getService("power"));
179237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood            if (power != null) {
1809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                power.setTemporaryScreenBrightnessSettingOverride(brightness);
181501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master            }
182501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        } catch (RemoteException doe) {
183501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
184501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master        }
185501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master    }
186501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master
1878823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani    byte[] getLocaleData() {
1888823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        Configuration conf = mContext.getResources().getConfiguration();
1898823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        final Locale loc = conf.locale;
1908823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        String localeString = loc.getLanguage();
1918823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        String country = loc.getCountry();
1928823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        if (!TextUtils.isEmpty(country)) {
1938823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            localeString += "_" + country;
1948823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        }
1958823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        return localeString.getBytes();
1968823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani    }
1978823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani
1988823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani    /**
1998823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani     * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where
2008823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani     * "ll" is the language code and "cc" is the country code.
2018823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani     * @param data the locale string in bytes.
2028823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani     */
20375a99709accef8cf221fd436d646727e7c8dd1f1Christopher Tate    void setLocaleData(byte[] data, int size) {
2048823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        // Check if locale was set by the user:
2058823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        Configuration conf = mContext.getResources().getConfiguration();
2068823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        Locale loc = conf.locale;
207d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani        // TODO: The following is not working as intended because the network is forcing a locale
208d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani        // change after registering. Need to find some other way to detect if the user manually
209d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani        // changed the locale
2108823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard
2118823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani
2128823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        final String[] availableLocales = mContext.getAssets().getLocales();
21375a99709accef8cf221fd436d646727e7c8dd1f1Christopher Tate        String localeCode = new String(data, 0, size);
2148823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        String language = new String(data, 0, 2);
21575a99709accef8cf221fd436d646727e7c8dd1f1Christopher Tate        String country = size > 4 ? new String(data, 3, 2) : "";
2168823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        loc = null;
2178823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        for (int i = 0; i < availableLocales.length; i++) {
2188823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            if (availableLocales[i].equals(localeCode)) {
2198823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani                loc = new Locale(language, country);
2208823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani                break;
2218823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            }
2228823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        }
2238823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        if (loc == null) return; // Couldn't find the saved locale in this version of the software
2248823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani
2258823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        try {
2268823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            IActivityManager am = ActivityManagerNative.getDefault();
2278823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            Configuration config = am.getConfiguration();
2288823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            config.locale = loc;
2298823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            // indicate this isn't some passing default - the user wants this remembered
2308823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            config.userSetLocale = true;
2318823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani
2328823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            am.updateConfiguration(config);
2338823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        } catch (RemoteException e) {
2348823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani            // Intentionally left blank
2358823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani        }
236d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    }
2378823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani
238d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    /**
239d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * Informs the audio service of changes to the settings so that
240d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * they can be re-read and applied.
241d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     */
242d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    void applyAudioSettings() {
243d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani        AudioManager am = new AudioManager(mContext);
244d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani        am.reloadAudioSettings();
2458823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani    }
246501eec92f9f4f206ad7972c63f2d0ef0285d8e34-b master}
247