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