SettingsHelper.java revision d158214511a3c04753de04fa6389e46d33135c38
1220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani/* 2220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * Copyright (C) 2008 The Android Open Source Project 3220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * 4220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * you may not use this file except in compliance with the License. 6220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * You may obtain a copy of the License at 7220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * 8220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * 10220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * Unless required by applicable law or agreed to in writing, software 11220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * See the License for the specific language governing permissions and 14220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani * limitations under the License. 15220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani */ 16220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 17220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasanipackage com.android.providers.settings; 18220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 198823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport java.util.Locale; 208823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 218823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.app.ActivityManagerNative; 228823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.app.IActivityManager; 23220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.backup.BackupDataInput; 24220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.content.ContentResolver; 25220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.content.Context; 2670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasaniimport android.content.IContentService; 278823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.content.res.Configuration; 2870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasaniimport android.location.LocationManager; 29220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.media.AudioManager; 30220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.os.IHardwareService; 31220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.os.RemoteException; 32220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.os.ServiceManager; 33220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.provider.Settings; 348823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasaniimport android.text.TextUtils; 35220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasaniimport android.util.Log; 36220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 37220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasanipublic class SettingsHelper { 38220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani private static final String TAG = "SettingsHelper"; 39220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 40220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani private Context mContext; 41220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani private AudioManager mAudioManager; 42220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani private IContentService mContentService; 4370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private static final String[] PROVIDERS = { "gmail-ls", "calendar", "contacts" }; 4470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani 4570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private boolean mSilent; 4670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private boolean mVibrate; 47220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 48220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani public SettingsHelper(Context context) { 49220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani mContext = context; 50220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani mAudioManager = (AudioManager) context 51220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani .getSystemService(Context.AUDIO_SERVICE); 52220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani mContentService = ContentResolver.getContentService(); 53220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 54220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 5570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani /** 5670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * Sets the property via a call to the appropriate API, if any, and returns 5770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * whether or not the setting should be saved to the database as well. 5870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * @param name the name of the setting 5970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * @param value the string value of the setting 6070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * @return whether to continue with writing the value to the database. In 6170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * some cases the data will be written by the call to the appropriate API, 6270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani * and in some cases the property value needs to be modified before setting. 6370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani */ 6470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani public boolean restoreValue(String name, String value) { 65220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani if (Settings.System.SCREEN_BRIGHTNESS.equals(name)) { 66220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani setBrightness(Integer.parseInt(value)); 67220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } else if (Settings.System.SOUND_EFFECTS_ENABLED.equals(name)) { 6870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani setSoundEffects(Integer.parseInt(value) == 1); 6970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) { 7070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani setGpsLocation(value); 7170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani return false; 7270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } 7370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani return true; 7470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } 7570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani 7670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private void setGpsLocation(String value) { 7770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani final String GPS = LocationManager.GPS_PROVIDER; 7870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani boolean enabled = 7970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani GPS.equals(value) || 8070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani value.startsWith(GPS + ",") || 8170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani value.endsWith("," + GPS) || 8270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani value.contains("," + GPS + ","); 8370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani Settings.Secure.setLocationProviderEnabled( 8470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mContext.getContentResolver(), GPS, enabled); 8570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } 8670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani 8770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private void setSoundEffects(boolean enable) { 8870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani if (enable) { 8970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mAudioManager.loadSoundEffects(); 9070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } else { 9170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mAudioManager.unloadSoundEffects(); 92220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 93220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 94220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 95220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani private void setBrightness(int brightness) { 96220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani try { 97220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani IHardwareService hardware = IHardwareService.Stub 98220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani .asInterface(ServiceManager.getService("hardware")); 99220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani if (hardware != null) { 100220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani hardware.setBacklights(brightness); 101220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 102220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } catch (RemoteException doe) { 103220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 104220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 105220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 106220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 10770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani private void setRingerMode() { 10870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani if (mSilent) { 10970c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mAudioManager.setRingerMode(mVibrate ? AudioManager.RINGER_MODE_VIBRATE : 11070c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani AudioManager.RINGER_MODE_SILENT); 11170c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } else { 11270c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 11370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 11470c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani mVibrate ? AudioManager.VIBRATE_SETTING_ON 11570c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani : AudioManager.VIBRATE_SETTING_OFF); 11670c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } 11770c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani } 11870c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani 119220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani byte[] getSyncProviders() { 120220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani byte[] sync = new byte[1 + PROVIDERS.length]; 121220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani try { 122220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani sync[0] = (byte) (mContentService.getListenForNetworkTickles() ? 1 : 0); 123220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani for (int i = 0; i < PROVIDERS.length; i++) { 124220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani sync[i + 1] = (byte) 125220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani (mContentService.getSyncProviderAutomatically(PROVIDERS[i]) ? 1 : 0); 126220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 127220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } catch (RemoteException re) { 128220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani Log.w(TAG, "Unable to backup sync providers"); 129220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani return sync; 130220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 131220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani return sync; 132220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 13370c874ba20b586712a7550b6c5efeb6dc0fdf9faAmith Yamasani 134220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani void setSyncProviders(BackupDataInput backup) { 135220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani byte[] sync = new byte[backup.getDataSize()]; 136220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani 137220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani try { 138220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani backup.readEntityData(sync, 0, sync.length); 139220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani mContentService.setListenForNetworkTickles(sync[0] == 1); 140220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani for (int i = 0; i < PROVIDERS.length; i++) { 141220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani mContentService.setSyncProviderAutomatically(PROVIDERS[i], sync[i + 1] > 0); 142220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 143220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } catch (RemoteException re) { 144220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani Log.w(TAG, "Unable to restore sync providers"); 145220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } catch (java.io.IOException ioe) { 146220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani Log.w(TAG, "Unable to read sync settings"); 147220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 148220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani } 1498823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 1508823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani byte[] getLocaleData() { 1518823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani Configuration conf = mContext.getResources().getConfiguration(); 1528823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani final Locale loc = conf.locale; 1538823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani String localeString = loc.getLanguage(); 1548823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani String country = loc.getCountry(); 1558823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani if (!TextUtils.isEmpty(country)) { 1568823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani localeString += "_" + country; 1578823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 1588823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani return localeString.getBytes(); 1598823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 1608823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 1618823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani /** 1628823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where 1638823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani * "ll" is the language code and "cc" is the country code. 1648823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani * @param data the locale string in bytes. 1658823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani */ 1668823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani void setLocaleData(byte[] data) { 1678823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani // Check if locale was set by the user: 1688823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani Configuration conf = mContext.getResources().getConfiguration(); 1698823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani Locale loc = conf.locale; 170d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani // TODO: The following is not working as intended because the network is forcing a locale 171d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani // change after registering. Need to find some other way to detect if the user manually 172d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani // changed the locale 1738823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard 1748823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 1758823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani final String[] availableLocales = mContext.getAssets().getLocales(); 1768823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani String localeCode = new String(data); 1778823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani String language = new String(data, 0, 2); 1788823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani String country = data.length > 4 ? new String(data, 3, 2) : ""; 1798823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani loc = null; 1808823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani for (int i = 0; i < availableLocales.length; i++) { 1818823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani if (availableLocales[i].equals(localeCode)) { 1828823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani loc = new Locale(language, country); 1838823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani break; 1848823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 1858823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 1868823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani if (loc == null) return; // Couldn't find the saved locale in this version of the software 1878823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 1888823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani try { 1898823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani IActivityManager am = ActivityManagerNative.getDefault(); 1908823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani Configuration config = am.getConfiguration(); 1918823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani config.locale = loc; 1928823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani // indicate this isn't some passing default - the user wants this remembered 1938823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani config.userSetLocale = true; 1948823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 1958823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani am.updateConfiguration(config); 1968823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } catch (RemoteException e) { 1978823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani // Intentionally left blank 1988823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 199d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani } 2008823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani 201d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani /** 202d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani * Informs the audio service of changes to the settings so that 203d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani * they can be re-read and applied. 204d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani */ 205d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani void applyAudioSettings() { 206d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani AudioManager am = new AudioManager(mContext); 207d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani am.reloadAudioSettings(); 2088823c0a8c68fe669c21c539eef9fc6541f0c7494Amith Yamasani } 209220f4d633be1098e7887dbd06f179138bf19f1adAmith Yamasani} 210