Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of 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,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 
     18 package com.android.phone;
     19 
     20 import android.os.Bundle;
     21 import android.preference.CheckBoxPreference;
     22 import android.preference.ListPreference;
     23 import android.preference.Preference;
     24 import android.preference.PreferenceScreen;
     25 import android.preference.PreferenceActivity;
     26 import com.android.internal.telephony.Phone;
     27 import com.android.internal.telephony.RILConstants;
     28 
     29 import android.os.AsyncResult;
     30 import android.os.Handler;
     31 import android.os.Message;
     32 import android.util.Log;
     33 
     34 
     35 /**
     36  * List of Phone-specific settings screens.
     37  */
     38 public class CellBroadcastSms extends PreferenceActivity
     39         implements Preference.OnPreferenceChangeListener{
     40     // debug data
     41     private static final String LOG_TAG = "CellBroadcastSms";
     42     private static final boolean DBG = true;
     43 
     44     //String keys for preference lookup
     45     private static final String BUTTON_ENABLE_DISABLE_BC_SMS_KEY =
     46         "button_enable_disable_cell_bc_sms";
     47     private static final String LIST_LANGUAGE_KEY =
     48         "list_language";
     49     private static final String BUTTON_EMERGENCY_BROADCAST_KEY =
     50         "button_emergency_broadcast";
     51     private static final String BUTTON_ADMINISTRATIVE_KEY =
     52         "button_administrative";
     53     private static final String BUTTON_MAINTENANCE_KEY =
     54         "button_maintenance";
     55     private static final String BUTTON_LOCAL_WEATHER_KEY =
     56         "button_local_weather";
     57     private static final String BUTTON_ATR_KEY =
     58         "button_atr";
     59     private static final String BUTTON_LAFS_KEY =
     60         "button_lafs";
     61     private static final String BUTTON_RESTAURANTS_KEY =
     62         "button_restaurants";
     63     private static final String BUTTON_LODGINGS_KEY =
     64         "button_lodgings";
     65     private static final String BUTTON_RETAIL_DIRECTORY_KEY =
     66         "button_retail_directory";
     67     private static final String BUTTON_ADVERTISEMENTS_KEY =
     68         "button_advertisements";
     69     private static final String BUTTON_STOCK_QUOTES_KEY =
     70         "button_stock_quotes";
     71     private static final String BUTTON_EO_KEY =
     72         "button_eo";
     73     private static final String BUTTON_MHH_KEY =
     74         "button_mhh";
     75     private static final String BUTTON_TECHNOLOGY_NEWS_KEY =
     76         "button_technology_news";
     77     private static final String BUTTON_MULTI_CATEGORY_KEY =
     78         "button_multi_category";
     79 
     80     private static final String BUTTON_LOCAL_GENERAL_NEWS_KEY =
     81         "button_local_general_news";
     82     private static final String BUTTON_REGIONAL_GENERAL_NEWS_KEY =
     83         "button_regional_general_news";
     84     private static final String BUTTON_NATIONAL_GENERAL_NEWS_KEY =
     85         "button_national_general_news";
     86     private static final String BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY =
     87         "button_international_general_news";
     88 
     89     private static final String BUTTON_LOCAL_BF_NEWS_KEY =
     90         "button_local_bf_news";
     91     private static final String BUTTON_REGIONAL_BF_NEWS_KEY =
     92         "button_regional_bf_news";
     93     private static final String BUTTON_NATIONAL_BF_NEWS_KEY =
     94         "button_national_bf_news";
     95     private static final String BUTTON_INTERNATIONAL_BF_NEWS_KEY =
     96         "button_international_bf_news";
     97 
     98     private static final String BUTTON_LOCAL_SPORTS_NEWS_KEY =
     99         "button_local_sports_news";
    100     private static final String BUTTON_REGIONAL_SPORTS_NEWS_KEY =
    101         "button_regional_sports_news";
    102     private static final String BUTTON_NATIONAL_SPORTS_NEWS_KEY =
    103         "button_national_sports_news";
    104     private static final String BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY =
    105         "button_international_sports_news";
    106 
    107     private static final String BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY =
    108         "button_local_entertainment_news";
    109     private static final String BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY =
    110         "button_regional_entertainment_news";
    111     private static final String BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY =
    112         "button_national_entertainment_news";
    113     private static final String BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY =
    114         "button_international_entertainment_news";
    115 
    116     //Class constants
    117     //These values are related to the C structs. See the comments in  method
    118     //setCbSmsConfig for more information.
    119     private static final int NO_OF_SERVICE_CATEGORIES = 31;
    120     private static final int NO_OF_INTS_STRUCT_1 = 3;
    121     private static final int MAX_LENGTH_RESULT = NO_OF_SERVICE_CATEGORIES * NO_OF_INTS_STRUCT_1 + 1;
    122     //Handler keys
    123     private static final int MESSAGE_ACTIVATE_CB_SMS = 1;
    124     private static final int MESSAGE_GET_CB_SMS_CONFIG = 2;
    125     private static final int MESSAGE_SET_CB_SMS_CONFIG = 3;
    126 
    127     //UI objects
    128     private CheckBoxPreference mButtonBcSms;
    129 
    130     private ListPreference mListLanguage;
    131 
    132     private CheckBoxPreference mButtonEmergencyBroadcast;
    133     private CheckBoxPreference mButtonAdministrative;
    134     private CheckBoxPreference mButtonMaintenance;
    135     private CheckBoxPreference mButtonLocalWeather;
    136     private CheckBoxPreference mButtonAtr;
    137     private CheckBoxPreference mButtonLafs;
    138     private CheckBoxPreference mButtonRestaurants;
    139     private CheckBoxPreference mButtonLodgings;
    140     private CheckBoxPreference mButtonRetailDirectory;
    141     private CheckBoxPreference mButtonAdvertisements;
    142     private CheckBoxPreference mButtonStockQuotes;
    143     private CheckBoxPreference mButtonEo;
    144     private CheckBoxPreference mButtonMhh;
    145     private CheckBoxPreference mButtonTechnologyNews;
    146     private CheckBoxPreference mButtonMultiCategory;
    147 
    148     private CheckBoxPreference mButtonLocal1;
    149     private CheckBoxPreference mButtonRegional1;
    150     private CheckBoxPreference mButtonNational1;
    151     private CheckBoxPreference mButtonInternational1;
    152 
    153     private CheckBoxPreference mButtonLocal2;
    154     private CheckBoxPreference mButtonRegional2;
    155     private CheckBoxPreference mButtonNational2;
    156     private CheckBoxPreference mButtonInternational2;
    157 
    158     private CheckBoxPreference mButtonLocal3;
    159     private CheckBoxPreference mButtonRegional3;
    160     private CheckBoxPreference mButtonNational3;
    161     private CheckBoxPreference mButtonInternational3;
    162 
    163     private CheckBoxPreference mButtonLocal4;
    164     private CheckBoxPreference mButtonRegional4;
    165     private CheckBoxPreference mButtonNational4;
    166     private CheckBoxPreference mButtonInternational4;
    167 
    168 
    169     //Member variables
    170     private Phone mPhone;
    171     private MyHandler mHandler;
    172 
    173     /**
    174      * Invoked on each preference click in this hierarchy, overrides
    175      * PreferenceActivity's implementation.  Used to make sure we track the
    176      * preference click events.
    177      */
    178     @Override
    179     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
    180             Preference preference) {
    181         if (preference == mButtonBcSms) {
    182             if (DBG) Log.d(LOG_TAG, "onPreferenceTreeClick: preference == mButtonBcSms.");
    183             if(mButtonBcSms.isChecked()) {
    184                 mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED,
    185                         Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
    186                 android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
    187                         android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
    188                         RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
    189                 enableDisableAllCbConfigButtons(true);
    190             } else {
    191                 mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
    192                         Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
    193                 android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
    194                         android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
    195                         RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
    196                 enableDisableAllCbConfigButtons(false);
    197             }
    198         } else if (preference == mListLanguage) {
    199             //Do nothing here, because this click will be handled in onPreferenceChange
    200         } else if (preference == mButtonEmergencyBroadcast) {
    201             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    202                     mButtonEmergencyBroadcast.isChecked(), 1);
    203             CellBroadcastSmsConfig.setCbSmsBSelectedValue(
    204                     mButtonEmergencyBroadcast.isChecked(), 1);
    205         } else if (preference == mButtonAdministrative) {
    206             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    207                     mButtonAdministrative.isChecked(), 2);
    208             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdministrative.isChecked(), 2);
    209         } else if (preference == mButtonMaintenance) {
    210             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    211                     mButtonMaintenance.isChecked(), 3);
    212             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMaintenance.isChecked(), 3);
    213         } else if (preference == mButtonLocalWeather) {
    214             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    215                     mButtonLocalWeather.isChecked(), 20);
    216             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocalWeather.isChecked(), 20);
    217         } else if (preference == mButtonAtr) {
    218             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonAtr.isChecked(), 21);
    219             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAtr.isChecked(), 21);
    220         } else if (preference == mButtonLafs) {
    221             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLafs.isChecked(), 22);
    222             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLafs.isChecked(), 22);
    223         } else if (preference == mButtonRestaurants) {
    224             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    225                     mButtonRestaurants.isChecked(), 23);
    226             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRestaurants.isChecked(), 23);
    227         } else if (preference == mButtonLodgings) {
    228             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLodgings.isChecked(), 24);
    229             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLodgings.isChecked(), 24);
    230         } else if (preference == mButtonRetailDirectory) {
    231             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    232                     mButtonRetailDirectory.isChecked(), 25);
    233             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRetailDirectory.isChecked(), 25);
    234         } else if (preference == mButtonAdvertisements) {
    235             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    236                     mButtonAdvertisements.isChecked(), 26);
    237             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdvertisements.isChecked(), 26);
    238         } else if (preference == mButtonStockQuotes) {
    239             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    240                     mButtonStockQuotes.isChecked(), 27);
    241             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonStockQuotes.isChecked(), 27);
    242         } else if (preference == mButtonEo) {
    243             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonEo.isChecked(), 28);
    244             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonEo.isChecked(), 28);
    245         } else if (preference == mButtonMhh) {
    246             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonMhh.isChecked(), 29);
    247             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMhh.isChecked(), 29);
    248         } else if (preference == mButtonTechnologyNews) {
    249             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    250                     mButtonTechnologyNews.isChecked(), 30);
    251             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonTechnologyNews.isChecked(), 30);
    252         } else if (preference == mButtonMultiCategory) {
    253             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    254                     mButtonMultiCategory.isChecked(), 31);
    255             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMultiCategory.isChecked(), 31);
    256         } else if (preference == mButtonLocal1) {
    257             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal1.isChecked(), 4);
    258             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal1.isChecked(), 4);
    259         } else if (preference == mButtonRegional1) {
    260             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    261                     mButtonRegional1.isChecked(), 5);
    262             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional1.isChecked(), 5);
    263         } else if (preference == mButtonNational1) {
    264             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    265                     mButtonNational1.isChecked(), 6);
    266             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational1.isChecked(), 6);
    267         } else if (preference == mButtonInternational1) {
    268             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    269                     mButtonInternational1.isChecked(), 7);
    270             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational1.isChecked(), 7);
    271         } else if (preference == mButtonLocal2) {
    272             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal2.isChecked(), 8);
    273             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal2.isChecked(), 8);
    274         } else if (preference == mButtonRegional2) {
    275             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    276                     mButtonRegional2.isChecked(), 9);
    277             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional2.isChecked(), 9);
    278         } else if (preference == mButtonNational2) {
    279             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    280                     mButtonNational2.isChecked(), 10);
    281             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational2.isChecked(), 10);
    282         } else if (preference == mButtonInternational2) {
    283             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    284                     mButtonInternational2.isChecked(), 11);
    285             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational2.isChecked(), 11);
    286         } else if (preference == mButtonLocal3) {
    287             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal3.isChecked(), 12);
    288             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal3.isChecked(), 12);
    289         } else if (preference == mButtonRegional3) {
    290             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    291                     mButtonRegional3.isChecked(), 13);
    292             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional3.isChecked(), 13);
    293         } else if (preference == mButtonNational3) {
    294             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    295                     mButtonNational3.isChecked(), 14);
    296             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational3.isChecked(), 14);
    297         } else if (preference == mButtonInternational3) {
    298             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    299                     mButtonInternational3.isChecked(), 15);
    300             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational3.isChecked(), 15);
    301         } else if (preference == mButtonLocal4) {
    302             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal4.isChecked(), 16);
    303             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal4.isChecked(), 16);
    304         } else if (preference == mButtonRegional4) {
    305             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    306                     mButtonRegional4.isChecked(), 17);
    307             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional4.isChecked(), 17);
    308         } else if (preference == mButtonNational4) {
    309             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    310                     mButtonNational4.isChecked(), 18);
    311             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational4.isChecked(), 18);
    312         } else if (preference == mButtonInternational4) {
    313             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
    314                     mButtonInternational4.isChecked(), 19);
    315             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational4.isChecked(), 19);
    316         } else {
    317             preferenceScreen.setEnabled(false);
    318             return false;
    319         }
    320 
    321         return true;
    322     }
    323 
    324     public boolean onPreferenceChange(Preference preference, Object objValue) {
    325         if (preference == mListLanguage) {
    326             // set the new language to the array which will be transmitted later
    327             CellBroadcastSmsConfig.setConfigDataCompleteLanguage(
    328                     mListLanguage.findIndexOfValue((String) objValue) + 1);
    329         }
    330 
    331         // always let the preference setting proceed.
    332         return true;
    333     }
    334 
    335     public void onCreate(Bundle icicle) {
    336         super.onCreate(icicle);
    337 
    338         addPreferencesFromResource(R.xml.cell_broadcast_sms);
    339 
    340         mPhone = PhoneApp.getPhone();
    341         mHandler = new MyHandler();
    342 
    343         PreferenceScreen prefSet = getPreferenceScreen();
    344 
    345         mButtonBcSms = (CheckBoxPreference) prefSet.findPreference(
    346                 BUTTON_ENABLE_DISABLE_BC_SMS_KEY);
    347         mListLanguage = (ListPreference) prefSet.findPreference(
    348                 LIST_LANGUAGE_KEY);
    349         // set the listener for the language list preference
    350         mListLanguage.setOnPreferenceChangeListener(this);
    351         mButtonEmergencyBroadcast = (CheckBoxPreference) prefSet.findPreference(
    352                 BUTTON_EMERGENCY_BROADCAST_KEY);
    353         mButtonAdministrative = (CheckBoxPreference) prefSet.findPreference(
    354                 BUTTON_ADMINISTRATIVE_KEY);
    355         mButtonMaintenance = (CheckBoxPreference) prefSet.findPreference(
    356                 BUTTON_MAINTENANCE_KEY);
    357         mButtonLocalWeather = (CheckBoxPreference) prefSet.findPreference(
    358                 BUTTON_LOCAL_WEATHER_KEY);
    359         mButtonAtr = (CheckBoxPreference) prefSet.findPreference(
    360                 BUTTON_ATR_KEY);
    361         mButtonLafs = (CheckBoxPreference) prefSet.findPreference(
    362                 BUTTON_LAFS_KEY);
    363         mButtonRestaurants = (CheckBoxPreference) prefSet.findPreference(
    364                 BUTTON_RESTAURANTS_KEY);
    365         mButtonLodgings = (CheckBoxPreference) prefSet.findPreference(
    366                 BUTTON_LODGINGS_KEY);
    367         mButtonRetailDirectory = (CheckBoxPreference) prefSet.findPreference(
    368                 BUTTON_RETAIL_DIRECTORY_KEY);
    369         mButtonAdvertisements = (CheckBoxPreference) prefSet.findPreference(
    370                 BUTTON_ADVERTISEMENTS_KEY);
    371         mButtonStockQuotes = (CheckBoxPreference) prefSet.findPreference(
    372                 BUTTON_STOCK_QUOTES_KEY);
    373         mButtonEo = (CheckBoxPreference) prefSet.findPreference(
    374                 BUTTON_EO_KEY);
    375         mButtonMhh = (CheckBoxPreference) prefSet.findPreference(
    376                 BUTTON_MHH_KEY);
    377         mButtonTechnologyNews = (CheckBoxPreference) prefSet.findPreference(
    378                 BUTTON_TECHNOLOGY_NEWS_KEY);
    379         mButtonMultiCategory = (CheckBoxPreference) prefSet.findPreference(
    380                 BUTTON_MULTI_CATEGORY_KEY);
    381 
    382         mButtonLocal1 = (CheckBoxPreference) prefSet.findPreference(
    383                 BUTTON_LOCAL_GENERAL_NEWS_KEY);
    384         mButtonRegional1 = (CheckBoxPreference) prefSet.findPreference(
    385                 BUTTON_REGIONAL_GENERAL_NEWS_KEY);
    386         mButtonNational1 = (CheckBoxPreference) prefSet.findPreference(
    387                 BUTTON_NATIONAL_GENERAL_NEWS_KEY);
    388         mButtonInternational1 = (CheckBoxPreference) prefSet.findPreference(
    389                 BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY);
    390 
    391         mButtonLocal2 = (CheckBoxPreference) prefSet.findPreference(
    392                 BUTTON_LOCAL_BF_NEWS_KEY);
    393         mButtonRegional2 = (CheckBoxPreference) prefSet.findPreference(
    394                 BUTTON_REGIONAL_BF_NEWS_KEY);
    395         mButtonNational2 = (CheckBoxPreference) prefSet.findPreference(
    396                 BUTTON_NATIONAL_BF_NEWS_KEY);
    397         mButtonInternational2 = (CheckBoxPreference) prefSet.findPreference(
    398                 BUTTON_INTERNATIONAL_BF_NEWS_KEY);
    399 
    400         mButtonLocal3 = (CheckBoxPreference) prefSet.findPreference(
    401                 BUTTON_LOCAL_SPORTS_NEWS_KEY);
    402         mButtonRegional3 = (CheckBoxPreference) prefSet.findPreference(
    403                 BUTTON_REGIONAL_SPORTS_NEWS_KEY);
    404         mButtonNational3 = (CheckBoxPreference) prefSet.findPreference(
    405                 BUTTON_NATIONAL_SPORTS_NEWS_KEY);
    406         mButtonInternational3 = (CheckBoxPreference) prefSet.findPreference(
    407                 BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY);
    408 
    409         mButtonLocal4 = (CheckBoxPreference) prefSet.findPreference(
    410                 BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY);
    411         mButtonRegional4 = (CheckBoxPreference) prefSet.findPreference(
    412                 BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY);
    413         mButtonNational4 = (CheckBoxPreference) prefSet.findPreference(
    414                 BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY);
    415         mButtonInternational4 = (CheckBoxPreference) prefSet.findPreference(
    416                 BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY);
    417     }
    418 
    419     @Override
    420     protected void onResume() {
    421         super.onResume();
    422 
    423         getPreferenceScreen().setEnabled(true);
    424 
    425         int settingCbSms = android.provider.Settings.Secure.getInt(
    426                 mPhone.getContext().getContentResolver(),
    427                 android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
    428                 RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
    429         mButtonBcSms.setChecked(settingCbSms == RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
    430 
    431         if(mButtonBcSms.isChecked()) {
    432             enableDisableAllCbConfigButtons(true);
    433         } else {
    434             enableDisableAllCbConfigButtons(false);
    435         }
    436 
    437         mPhone.getCellBroadcastSmsConfig(Message.obtain(mHandler, MESSAGE_GET_CB_SMS_CONFIG));
    438     }
    439 
    440     @Override
    441     protected void onPause() {
    442         super.onPause();
    443 
    444             CellBroadcastSmsConfig.setCbSmsNoOfStructs(NO_OF_SERVICE_CATEGORIES);
    445 
    446             mPhone.setCellBroadcastSmsConfig(CellBroadcastSmsConfig.getCbSmsAllValues(),
    447                     Message.obtain(mHandler, MESSAGE_SET_CB_SMS_CONFIG));
    448         }
    449 
    450     private void enableDisableAllCbConfigButtons(boolean enable) {
    451         mButtonEmergencyBroadcast.setEnabled(enable);
    452         mListLanguage.setEnabled(enable);
    453         mButtonAdministrative.setEnabled(enable);
    454         mButtonMaintenance.setEnabled(enable);
    455         mButtonLocalWeather.setEnabled(enable);
    456         mButtonAtr.setEnabled(enable);
    457         mButtonLafs.setEnabled(enable);
    458         mButtonRestaurants.setEnabled(enable);
    459         mButtonLodgings.setEnabled(enable);
    460         mButtonRetailDirectory.setEnabled(enable);
    461         mButtonAdvertisements.setEnabled(enable);
    462         mButtonStockQuotes.setEnabled(enable);
    463         mButtonEo.setEnabled(enable);
    464         mButtonMhh.setEnabled(enable);
    465         mButtonTechnologyNews.setEnabled(enable);
    466         mButtonMultiCategory.setEnabled(enable);
    467 
    468         mButtonLocal1.setEnabled(enable);
    469         mButtonRegional1.setEnabled(enable);
    470         mButtonNational1.setEnabled(enable);
    471         mButtonInternational1.setEnabled(enable);
    472 
    473         mButtonLocal2.setEnabled(enable);
    474         mButtonRegional2.setEnabled(enable);
    475         mButtonNational2.setEnabled(enable);
    476         mButtonInternational2.setEnabled(enable);
    477 
    478         mButtonLocal3.setEnabled(enable);
    479         mButtonRegional3.setEnabled(enable);
    480         mButtonNational3.setEnabled(enable);
    481         mButtonInternational3.setEnabled(enable);
    482 
    483         mButtonLocal4.setEnabled(enable);
    484         mButtonRegional4.setEnabled(enable);
    485         mButtonNational4.setEnabled(enable);
    486         mButtonInternational4.setEnabled(enable);
    487     }
    488 
    489     private void setAllCbConfigButtons(int[] configArray) {
    490         //These buttons are in a well defined sequence. If you want to change it,
    491         //be sure to map the buttons to their corresponding slot in the configArray !
    492         mButtonEmergencyBroadcast.setChecked(configArray[1] != 0);
    493         //subtract 1, because the values are handled in an array which starts with 0 and not with 1
    494         mListLanguage.setValueIndex(CellBroadcastSmsConfig.getConfigDataLanguage() - 1);
    495         mButtonAdministrative.setChecked(configArray[2] != 0);
    496         mButtonMaintenance.setChecked(configArray[3] != 0);
    497         mButtonLocalWeather.setChecked(configArray[20] != 0);
    498         mButtonAtr.setChecked(configArray[21] != 0);
    499         mButtonLafs.setChecked(configArray[22] != 0);
    500         mButtonRestaurants.setChecked(configArray[23] != 0);
    501         mButtonLodgings.setChecked(configArray[24] != 0);
    502         mButtonRetailDirectory.setChecked(configArray[25] != 0);
    503         mButtonAdvertisements.setChecked(configArray[26] != 0);
    504         mButtonStockQuotes.setChecked(configArray[27] != 0);
    505         mButtonEo.setChecked(configArray[28] != 0);
    506         mButtonMhh.setChecked(configArray[29] != 0);
    507         mButtonTechnologyNews.setChecked(configArray[30] != 0);
    508         mButtonMultiCategory.setChecked(configArray[31] != 0);
    509 
    510         mButtonLocal1.setChecked(configArray[4] != 0);
    511         mButtonRegional1.setChecked(configArray[5] != 0);
    512         mButtonNational1.setChecked(configArray[6] != 0);
    513         mButtonInternational1.setChecked(configArray[7] != 0);
    514 
    515         mButtonLocal2.setChecked(configArray[8] != 0);
    516         mButtonRegional2.setChecked(configArray[9] != 0);
    517         mButtonNational2.setChecked(configArray[10] != 0);
    518         mButtonInternational2.setChecked(configArray[11] != 0);
    519 
    520         mButtonLocal3.setChecked(configArray[12] != 0);
    521         mButtonRegional3.setChecked(configArray[13] != 0);
    522         mButtonNational3.setChecked(configArray[14] != 0);
    523         mButtonInternational3.setChecked(configArray[15] != 0);
    524 
    525         mButtonLocal4.setChecked(configArray[16] != 0);
    526         mButtonRegional4.setChecked(configArray[17] != 0);
    527         mButtonNational4.setChecked(configArray[18] != 0);
    528         mButtonInternational4.setChecked(configArray[19] != 0);
    529     }
    530 
    531     private class MyHandler extends Handler {
    532 
    533         @Override
    534         public void handleMessage(Message msg) {
    535             switch (msg.what) {
    536             case MESSAGE_ACTIVATE_CB_SMS:
    537                 //Only a log message here, because the received response is always null
    538                 if (DBG) Log.d(LOG_TAG, "Cell Broadcast SMS enabled/disabled.");
    539                 break;
    540             case MESSAGE_GET_CB_SMS_CONFIG:
    541                 int result[] = (int[])((AsyncResult)msg.obj).result;
    542 
    543                 // check if the actual service categoties table size on the NV is '0'
    544                 if (result[0] == 0) {
    545                     result[0] = NO_OF_SERVICE_CATEGORIES;
    546 
    547                     mButtonBcSms.setChecked(false);
    548                     mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
    549                             Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
    550                     android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
    551                             android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
    552                             RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
    553                     enableDisableAllCbConfigButtons(false);
    554                 }
    555 
    556                 CellBroadcastSmsConfig.setCbSmsConfig(result);
    557                 setAllCbConfigButtons(CellBroadcastSmsConfig.getCbSmsBselectedValues());
    558 
    559                 break;
    560             case MESSAGE_SET_CB_SMS_CONFIG:
    561                 //Only a log message here, because the received response is always null
    562                 if (DBG) Log.d(LOG_TAG, "Set Cell Broadcast SMS values.");
    563                 break;
    564             default:
    565                 Log.e(LOG_TAG, "Error! Unhandled message in CellBroadcastSms.java. Message: "
    566                         + msg.what);
    567             break;
    568             }
    569         }
    570     }
    571 
    572     private static final class CellBroadcastSmsConfig {
    573 
    574         //The values in this array are stored in a particular order. This order
    575         //is calculated in the setCbSmsConfig method of this class.
    576         //For more information see comments below...
    577         //NO_OF_SERVICE_CATEGORIES +1 is used, because we will leave the first array entry 0
    578         private static int mBSelected[] = new int[NO_OF_SERVICE_CATEGORIES + 1];
    579         private static int mConfigDataComplete[] = new int[MAX_LENGTH_RESULT];
    580 
    581         private static void setCbSmsConfig(int[] configData) {
    582             if(configData == null) {
    583                 Log.e(LOG_TAG, "Error! No cell broadcast service categories returned.");
    584                 return;
    585             }
    586 
    587             if(configData[0] > MAX_LENGTH_RESULT) {
    588                 Log.e(LOG_TAG, "Error! Wrong number of service categories returned from RIL");
    589                 return;
    590             }
    591 
    592             //The required config values for broadcast SMS are stored in a C struct:
    593             //
    594             //  typedef struct {
    595             //      int size;
    596             //      RIL_CDMA_BcServiceInfo *entries;
    597             //  } RIL_CDMA_BcSMSConfig;
    598             //
    599             //  typedef struct {
    600             //      int uServiceCategory;
    601             //      int uLanguage;
    602             //      unsigned char bSelected;
    603             //  } RIL_CDMA_BcServiceInfo;
    604             //
    605             // This means, that we have to ignore the first value and check every
    606             // 3rd value starting with the 2nd of all. This value indicates, where we
    607             // will store the appropriate bSelected value, which is 2 values behind it.
    608             for(int i = 1; i < configData.length; i += NO_OF_INTS_STRUCT_1) {
    609                 mBSelected[configData[i]] = configData[i +2];
    610             }
    611 
    612             //Store all values in an extra array
    613             mConfigDataComplete = configData;
    614         }
    615 
    616         private static void setCbSmsBSelectedValue(boolean value, int pos) {
    617             if(pos < mBSelected.length) {
    618                 mBSelected[pos] = (value == true ? 1 : 0);
    619             } else {
    620                 Log.e(LOG_TAG,"Error! Invalid value position.");
    621             }
    622         }
    623 
    624         private static int[] getCbSmsBselectedValues() {
    625             return(mBSelected);
    626         }
    627 
    628         // TODO: Change the return value to a RIL_BroadcastSMSConfig
    629         private static int[] getCbSmsAllValues() {
    630             return(mConfigDataComplete);
    631         }
    632 
    633         private static void setCbSmsNoOfStructs(int value) {
    634             //Sets the size parameter, which contains the number of structs
    635             //that will be transmitted
    636             mConfigDataComplete[0] = value;
    637         }
    638 
    639         private static void setConfigDataCompleteBSelected(boolean value, int serviceCategory) {
    640             //Sets the bSelected value for a specific serviceCategory
    641             for(int i = 1; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
    642                 if(mConfigDataComplete[i] == serviceCategory) {
    643                     mConfigDataComplete[i + 2] = value == true ? 1 : 0;
    644                     break;
    645                 }
    646             }
    647         }
    648 
    649         private static void setConfigDataCompleteLanguage(int language) {
    650             //It is only possible to set the same language for all entries
    651             for(int i = 2; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
    652                 mConfigDataComplete[i] = language;
    653             }
    654         }
    655 
    656         private static int getConfigDataLanguage() {
    657             int language = mConfigDataComplete[2];
    658             //2 is the language value of the first entry
    659             //It is only possible to set the same language for all entries
    660             if (language < 1 || language > 7) {
    661                 Log.e(LOG_TAG, "Error! Wrong language returned from RIL...defaulting to 1, english");
    662                 return 1;
    663             }
    664             else {
    665                 return language;
    666             }
    667         }
    668     }
    669 }
    670