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