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