1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package com.android.cellbroadcastreceiver;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.os.Bundle;
22import android.os.UserManager;
23import android.preference.ListPreference;
24import android.preference.Preference;
25import android.preference.PreferenceActivity;
26import android.preference.PreferenceCategory;
27import android.preference.PreferenceFragment;
28import android.preference.PreferenceScreen;
29import android.provider.Settings;
30import android.telephony.TelephonyManager;
31
32/**
33 * Settings activity for the cell broadcast receiver.
34 */
35public class CellBroadcastSettings extends PreferenceActivity {
36
37    // Preference key for whether to enable emergency notifications (default enabled).
38    public static final String KEY_ENABLE_EMERGENCY_ALERTS = "enable_emergency_alerts";
39
40    // Duration of alert sound (in seconds).
41    public static final String KEY_ALERT_SOUND_DURATION = "alert_sound_duration";
42
43    // Default alert duration (in seconds).
44    public static final String ALERT_SOUND_DEFAULT_DURATION = "4";
45
46    // Enable vibration on alert (unless master volume is silent).
47    public static final String KEY_ENABLE_ALERT_VIBRATE = "enable_alert_vibrate";
48
49    // Speak contents of alert after playing the alert sound.
50    public static final String KEY_ENABLE_ALERT_SPEECH = "enable_alert_speech";
51
52    // Preference category for emergency alert and CMAS settings.
53    public static final String KEY_CATEGORY_ALERT_SETTINGS = "category_alert_settings";
54
55    // Preference category for ETWS related settings.
56    public static final String KEY_CATEGORY_ETWS_SETTINGS = "category_etws_settings";
57
58    // Whether to display CMAS extreme threat notifications (default is enabled).
59    public static final String KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS =
60            "enable_cmas_extreme_threat_alerts";
61
62    // Whether to display CMAS severe threat notifications (default is enabled).
63    public static final String KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS =
64            "enable_cmas_severe_threat_alerts";
65
66    // Whether to display CMAS amber alert messages (default is enabled).
67    public static final String KEY_ENABLE_CMAS_AMBER_ALERTS = "enable_cmas_amber_alerts";
68
69    // Preference category for development settings (enabled by settings developer options toggle).
70    public static final String KEY_CATEGORY_DEV_SETTINGS = "category_dev_settings";
71
72    // Whether to display ETWS test messages (default is disabled).
73    public static final String KEY_ENABLE_ETWS_TEST_ALERTS = "enable_etws_test_alerts";
74
75    // Whether to display CMAS monthly test messages (default is disabled).
76    public static final String KEY_ENABLE_CMAS_TEST_ALERTS = "enable_cmas_test_alerts";
77
78    // Preference category for Brazil specific settings.
79    public static final String KEY_CATEGORY_BRAZIL_SETTINGS = "category_brazil_settings";
80
81    // Preference key for whether to enable channel 50 notifications
82    // Enabled by default for phones sold in Brazil, otherwise this setting may be hidden.
83    public static final String KEY_ENABLE_CHANNEL_50_ALERTS = "enable_channel_50_alerts";
84
85    // Preference key for initial opt-in/opt-out dialog.
86    public static final String KEY_SHOW_CMAS_OPT_OUT_DIALOG = "show_cmas_opt_out_dialog";
87
88    // Alert reminder interval ("once" = single 2 minute reminder).
89    public static final String KEY_ALERT_REMINDER_INTERVAL = "alert_reminder_interval";
90
91    @Override
92    public void onCreate(Bundle savedInstanceState) {
93        super.onCreate(savedInstanceState);
94
95        UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
96
97        if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
98            setContentView(R.layout.cell_broadcast_disallowed_preference_screen);
99            return;
100        }
101
102        // Display the fragment as the main content.
103        getFragmentManager().beginTransaction().replace(android.R.id.content,
104                new CellBroadcastSettingsFragment()).commit();
105    }
106
107    /**
108     * New fragment-style implementation of preferences.
109     */
110    public static class CellBroadcastSettingsFragment extends PreferenceFragment {
111
112        @Override
113        public void onCreate(Bundle savedInstanceState) {
114            super.onCreate(savedInstanceState);
115
116            // Load the preferences from an XML resource
117            addPreferencesFromResource(R.xml.preferences);
118
119            PreferenceScreen preferenceScreen = getPreferenceScreen();
120
121            // Handler for settings that require us to reconfigure enabled channels in radio
122            Preference.OnPreferenceChangeListener startConfigServiceListener =
123                    new Preference.OnPreferenceChangeListener() {
124                        @Override
125                        public boolean onPreferenceChange(Preference pref, Object newValue) {
126                            CellBroadcastReceiver.startConfigService(pref.getContext());
127                            return true;
128                        }
129                    };
130
131            // Show extra settings when developer options is enabled in settings.
132            boolean enableDevSettings = Settings.Global.getInt(getActivity().getContentResolver(),
133                    Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
134
135            Resources res = getResources();
136            boolean showEtwsSettings = res.getBoolean(R.bool.show_etws_settings);
137
138            // Emergency alert preference category (general and CMAS preferences).
139            PreferenceCategory alertCategory = (PreferenceCategory)
140                    findPreference(KEY_CATEGORY_ALERT_SETTINGS);
141
142            // alert reminder interval
143            ListPreference interval = (ListPreference) findPreference(KEY_ALERT_REMINDER_INTERVAL);
144            interval.setSummary(interval.getEntry());
145            interval.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
146                @Override
147                public boolean onPreferenceChange(Preference pref, Object newValue) {
148                    final ListPreference listPref = (ListPreference) pref;
149                    final int idx = listPref.findIndexOfValue((String) newValue);
150                    listPref.setSummary(listPref.getEntries()[idx]);
151                    return true;
152                }
153            });
154
155            // Show alert settings and ETWS categories for ETWS builds and developer mode.
156            if (enableDevSettings || showEtwsSettings) {
157                // enable/disable all alerts
158                Preference enablePwsAlerts = findPreference(KEY_ENABLE_EMERGENCY_ALERTS);
159                if (enablePwsAlerts != null) {
160                    enablePwsAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
161                }
162
163                // alert sound duration
164                ListPreference duration = (ListPreference) findPreference(KEY_ALERT_SOUND_DURATION);
165                duration.setSummary(duration.getEntry());
166                duration.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
167                    @Override
168                    public boolean onPreferenceChange(Preference pref, Object newValue) {
169                        final ListPreference listPref = (ListPreference) pref;
170                        final int idx = listPref.findIndexOfValue((String) newValue);
171                        listPref.setSummary(listPref.getEntries()[idx]);
172                        return true;
173                    }
174                });
175            } else {
176                // Remove general emergency alert preference items (not shown for CMAS builds).
177                alertCategory.removePreference(findPreference(KEY_ENABLE_EMERGENCY_ALERTS));
178                alertCategory.removePreference(findPreference(KEY_ALERT_SOUND_DURATION));
179                alertCategory.removePreference(findPreference(KEY_ENABLE_ALERT_SPEECH));
180                // Remove ETWS preference category.
181                preferenceScreen.removePreference(findPreference(KEY_CATEGORY_ETWS_SETTINGS));
182            }
183
184            if (!res.getBoolean(R.bool.show_cmas_settings)) {
185                // Remove CMAS preference items in emergency alert category.
186                alertCategory.removePreference(
187                        findPreference(KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS));
188                alertCategory.removePreference(
189                        findPreference(KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS));
190                alertCategory.removePreference(findPreference(KEY_ENABLE_CMAS_AMBER_ALERTS));
191            }
192
193            TelephonyManager tm = (TelephonyManager) getActivity().getSystemService(
194                    Context.TELEPHONY_SERVICE);
195
196            boolean enableChannel50Support = res.getBoolean(R.bool.show_brazil_settings) ||
197                    "br".equals(tm.getSimCountryIso());
198
199            if (!enableChannel50Support) {
200                preferenceScreen.removePreference(findPreference(KEY_CATEGORY_BRAZIL_SETTINGS));
201            }
202            if (!enableDevSettings) {
203                preferenceScreen.removePreference(findPreference(KEY_CATEGORY_DEV_SETTINGS));
204            }
205
206            Preference enableChannel50Alerts = findPreference(KEY_ENABLE_CHANNEL_50_ALERTS);
207            if (enableChannel50Alerts != null) {
208                enableChannel50Alerts.setOnPreferenceChangeListener(startConfigServiceListener);
209            }
210            Preference enableEtwsAlerts = findPreference(KEY_ENABLE_ETWS_TEST_ALERTS);
211            if (enableEtwsAlerts != null) {
212                enableEtwsAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
213            }
214            Preference enableCmasExtremeAlerts =
215                    findPreference(KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS);
216            if (enableCmasExtremeAlerts != null) {
217                enableCmasExtremeAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
218            }
219            Preference enableCmasSevereAlerts =
220                    findPreference(KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS);
221            if (enableCmasSevereAlerts != null) {
222                enableCmasSevereAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
223            }
224            Preference enableCmasAmberAlerts = findPreference(KEY_ENABLE_CMAS_AMBER_ALERTS);
225            if (enableCmasAmberAlerts != null) {
226                enableCmasAmberAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
227            }
228            Preference enableCmasTestAlerts = findPreference(KEY_ENABLE_CMAS_TEST_ALERTS);
229            if (enableCmasTestAlerts != null) {
230                enableCmasTestAlerts.setOnPreferenceChangeListener(startConfigServiceListener);
231            }
232        }
233    }
234}
235