CellBroadcastSettings.java revision dd9555e7e5eb29852576197de1c61fa99007ba34
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.os.Bundle; 21import android.os.PersistableBundle; 22import android.os.UserManager; 23import android.preference.CheckBoxPreference; 24import android.preference.ListPreference; 25import android.preference.Preference; 26import android.preference.PreferenceActivity; 27import android.preference.PreferenceCategory; 28import android.preference.PreferenceScreen; 29import android.provider.Settings; 30import android.telephony.CarrierConfigManager; 31import android.telephony.TelephonyManager; 32import android.telephony.SubscriptionManager; 33import android.telephony.SubscriptionInfo; 34import android.util.Log; 35import android.view.View; 36import android.widget.TabHost; 37import android.widget.TabHost.OnTabChangeListener; 38import android.widget.TabHost.TabContentFactory; 39import android.widget.TabHost.TabSpec; 40import android.widget.TabWidget; 41import java.util.ArrayList; 42import java.util.List; 43 44/** 45 * Settings activity for the cell broadcast receiver. 46 */ 47public class CellBroadcastSettings extends PreferenceActivity { 48 49 // Preference key for whether to enable emergency notifications (default enabled). 50 public static final String KEY_ENABLE_EMERGENCY_ALERTS = "enable_emergency_alerts"; 51 52 // Duration of alert sound (in seconds). 53 public static final String KEY_ALERT_SOUND_DURATION = "alert_sound_duration"; 54 55 // Default alert duration (in seconds). 56 public static final String ALERT_SOUND_DEFAULT_DURATION = "4"; 57 58 // Enable vibration on alert (unless master volume is silent). 59 public static final String KEY_ENABLE_ALERT_VIBRATE = "enable_alert_vibrate"; 60 61 // Speak contents of alert after playing the alert sound. 62 public static final String KEY_ENABLE_ALERT_SPEECH = "enable_alert_speech"; 63 64 // Preference category for emergency alert and CMAS settings. 65 public static final String KEY_CATEGORY_ALERT_SETTINGS = "category_alert_settings"; 66 67 // Preference category for ETWS related settings. 68 public static final String KEY_CATEGORY_ETWS_SETTINGS = "category_etws_settings"; 69 70 // Whether to display CMAS extreme threat notifications (default is enabled). 71 public static final String KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS = 72 "enable_cmas_extreme_threat_alerts"; 73 74 // Whether to display CMAS severe threat notifications (default is enabled). 75 public static final String KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS = 76 "enable_cmas_severe_threat_alerts"; 77 78 // Whether to display CMAS amber alert messages (default is enabled). 79 public static final String KEY_ENABLE_CMAS_AMBER_ALERTS = "enable_cmas_amber_alerts"; 80 81 // Preference category for development settings (enabled by settings developer options toggle). 82 public static final String KEY_CATEGORY_DEV_SETTINGS = "category_dev_settings"; 83 84 // Whether to display ETWS test messages (default is disabled). 85 public static final String KEY_ENABLE_ETWS_TEST_ALERTS = "enable_etws_test_alerts"; 86 87 // Whether to display CMAS monthly test messages (default is disabled). 88 public static final String KEY_ENABLE_CMAS_TEST_ALERTS = "enable_cmas_test_alerts"; 89 90 // Preference category for Brazil specific settings. 91 public static final String KEY_CATEGORY_BRAZIL_SETTINGS = "category_brazil_settings"; 92 93 // Preference key for whether to enable channel 50 notifications 94 // Enabled by default for phones sold in Brazil, otherwise this setting may be hidden. 95 public static final String KEY_ENABLE_CHANNEL_50_ALERTS = "enable_channel_50_alerts"; 96 97 // Preference key for initial opt-in/opt-out dialog. 98 public static final String KEY_SHOW_CMAS_OPT_OUT_DIALOG = "show_cmas_opt_out_dialog"; 99 100 // Alert reminder interval ("once" = single 2 minute reminder). 101 public static final String KEY_ALERT_REMINDER_INTERVAL = "alert_reminder_interval"; 102 103 // Default reminder interval. 104 public static final String ALERT_REMINDER_INTERVAL = "0"; 105 106 private final static String TAG = "CellBroadcastSettings"; 107 108 private TelephonyManager mTelephonyManager; 109 private SubscriptionInfo mSir; 110 private TabHost mTabHost; 111 private TabWidget mTabWidget; 112 private List<SubscriptionInfo> mSelectableSubInfos; 113 114 private CheckBoxPreference mExtremeCheckBox; 115 private CheckBoxPreference mSevereCheckBox; 116 private CheckBoxPreference mAmberCheckBox; 117 private CheckBoxPreference mEmergencyCheckBox; 118 private ListPreference mAlertDuration; 119 private ListPreference mReminderInterval; 120 private CheckBoxPreference mVibrateCheckBox; 121 private CheckBoxPreference mSpeechCheckBox; 122 private CheckBoxPreference mEtwsTestCheckBox; 123 private CheckBoxPreference mChannel50CheckBox; 124 private CheckBoxPreference mCmasCheckBox; 125 private CheckBoxPreference mOptOutCheckBox; 126 private PreferenceCategory mAlertCategory; 127 128 @Override 129 public void onCreate(Bundle savedInstanceState) { 130 super.onCreate(savedInstanceState); 131 132 UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); 133 if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) { 134 setContentView(R.layout.cell_broadcast_disallowed_preference_screen); 135 return; 136 } 137 138 mTelephonyManager = (TelephonyManager) getSystemService( 139 Context.TELEPHONY_SERVICE); 140 mSelectableSubInfos = new ArrayList<SubscriptionInfo>(); 141 for (int i = 0; i < mTelephonyManager.getSimCount(); i++) { 142 final SubscriptionInfo sir = 143 findRecordBySlotId(getApplicationContext(), i); 144 if (sir != null) { 145 mSelectableSubInfos.add(sir); 146 } 147 } 148 149 addPreferencesFromResource(R.xml.preferences); 150 mSir = mSelectableSubInfos.size() > 0 ? mSelectableSubInfos.get(0) : null; 151 if (mSelectableSubInfos.size() > 1) { 152 setContentView(com.android.internal.R.layout.common_tab_settings); 153 154 mTabHost = (TabHost) findViewById(android.R.id.tabhost); 155 mTabHost.setup(); 156 mTabHost.setOnTabChangedListener(mTabListener); 157 mTabHost.clearAllTabs(); 158 159 for (int i = 0; i < mSelectableSubInfos.size(); i++) { 160 mTabHost.addTab(buildTabSpec(String.valueOf(i), 161 String.valueOf(mSelectableSubInfos.get(i).getDisplayName()))); 162 } 163 } 164 updatePreferences(); 165 } 166 167 private void updatePreferences() { 168 169 PreferenceScreen prefScreen = getPreferenceScreen(); 170 171 if (prefScreen != null) { 172 prefScreen.removeAll(); 173 // Load the preferences from an XML resource 174 addPreferencesFromResource(R.xml.preferences); 175 176 mExtremeCheckBox = (CheckBoxPreference) 177 findPreference(KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS); 178 mSevereCheckBox = (CheckBoxPreference) 179 findPreference(KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS); 180 mAmberCheckBox = (CheckBoxPreference) 181 findPreference(KEY_ENABLE_CMAS_AMBER_ALERTS); 182 mEmergencyCheckBox = (CheckBoxPreference) 183 findPreference(KEY_ENABLE_EMERGENCY_ALERTS); 184 mAlertDuration = (ListPreference) 185 findPreference(KEY_ALERT_SOUND_DURATION); 186 mReminderInterval = (ListPreference) 187 findPreference(KEY_ALERT_REMINDER_INTERVAL); 188 mVibrateCheckBox = (CheckBoxPreference) 189 findPreference(KEY_ENABLE_ALERT_VIBRATE); 190 mSpeechCheckBox = (CheckBoxPreference) 191 findPreference(KEY_ENABLE_ALERT_SPEECH); 192 mEtwsTestCheckBox = (CheckBoxPreference) 193 findPreference(KEY_ENABLE_ETWS_TEST_ALERTS); 194 mChannel50CheckBox = (CheckBoxPreference) 195 findPreference(KEY_ENABLE_CHANNEL_50_ALERTS); 196 mCmasCheckBox = (CheckBoxPreference) 197 findPreference(KEY_ENABLE_CMAS_TEST_ALERTS); 198 mOptOutCheckBox = (CheckBoxPreference) 199 findPreference(KEY_SHOW_CMAS_OPT_OUT_DIALOG); 200 mAlertCategory = (PreferenceCategory) 201 findPreference(KEY_CATEGORY_ALERT_SETTINGS); 202 203 if(mSir == null) { 204 mExtremeCheckBox.setEnabled(false); 205 mSevereCheckBox.setEnabled(false); 206 mAmberCheckBox.setEnabled(false); 207 mEmergencyCheckBox.setEnabled(false); 208 mReminderInterval.setEnabled(false); 209 mAlertDuration.setEnabled(false); 210 mVibrateCheckBox.setEnabled(false); 211 mSpeechCheckBox.setEnabled(false); 212 mEtwsTestCheckBox.setEnabled(false); 213 mChannel50CheckBox.setEnabled(false); 214 mCmasCheckBox.setEnabled(false); 215 mOptOutCheckBox.setEnabled(false); 216 return; 217 } 218 219 // Handler for settings that require us to reconfigure enabled channels in radio 220 Preference.OnPreferenceChangeListener startConfigServiceListener = 221 new Preference.OnPreferenceChangeListener() { 222 @Override 223 public boolean onPreferenceChange(Preference pref, Object newValue) { 224 int newVal = (((Boolean) newValue).booleanValue()) ? 1 : 0; 225 226 switch (pref.getKey()) { 227 case KEY_ENABLE_EMERGENCY_ALERTS: 228 SubscriptionManager 229 .setSubscriptionProperty(mSir.getSubscriptionId(), 230 SubscriptionManager.CB_EMERGENCY_ALERT, 231 newVal + ""); 232 break; 233 case KEY_ENABLE_CHANNEL_50_ALERTS: 234 SubscriptionManager 235 .setSubscriptionProperty(mSir.getSubscriptionId(), 236 SubscriptionManager.CB_CHANNEL_50_ALERT, 237 newVal + ""); 238 break; 239 case KEY_ENABLE_ETWS_TEST_ALERTS: 240 SubscriptionManager 241 .setSubscriptionProperty(mSir.getSubscriptionId(), 242 SubscriptionManager.CB_ETWS_TEST_ALERT, 243 newVal + ""); 244 break; 245 case KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS: 246 SubscriptionManager 247 .setSubscriptionProperty(mSir.getSubscriptionId(), 248 SubscriptionManager.CB_EXTREME_THREAT_ALERT, 249 newVal + ""); 250 if (newVal == 1) { 251 SubscriptionManager 252 .setSubscriptionProperty(mSir.getSubscriptionId(), 253 SubscriptionManager.CB_SEVERE_THREAT_ALERT, 254 "0"); 255 } 256 boolean isExtremeAlertChecked = 257 ((Boolean) newValue).booleanValue(); 258 259 if (mSevereCheckBox != null) { 260 mSevereCheckBox.setEnabled(isExtremeAlertChecked); 261 mSevereCheckBox.setChecked(false); 262 } 263 break; 264 case KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS: 265 SubscriptionManager 266 .setSubscriptionProperty(mSir.getSubscriptionId(), 267 SubscriptionManager.CB_SEVERE_THREAT_ALERT, 268 newVal + ""); 269 break; 270 case KEY_ENABLE_CMAS_AMBER_ALERTS: 271 SubscriptionManager 272 .setSubscriptionProperty(mSir.getSubscriptionId(), 273 SubscriptionManager.CB_AMBER_ALERT, 274 newVal + ""); 275 break; 276 case KEY_ENABLE_CMAS_TEST_ALERTS: 277 SubscriptionManager 278 .setSubscriptionProperty(mSir.getSubscriptionId(), 279 SubscriptionManager.CB_CMAS_TEST_ALERT, 280 newVal + ""); 281 break; 282 default: 283 Log.d(TAG, "Invalid preference changed"); 284 285 } 286 287 CellBroadcastReceiver.startConfigService(pref.getContext(), 288 mSir.getSubscriptionId()); 289 return true; 290 } 291 }; 292 293 // Show extra settings when developer options is enabled in settings. 294 boolean enableDevSettings = Settings.Global.getInt(getContentResolver(), 295 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 296 297 boolean showEtwsSettings = SubscriptionManager.getResourcesForSubId( 298 getApplicationContext(), mSir.getSubscriptionId()) 299 .getBoolean(R.bool.show_etws_settings); 300 301 String queryReturnVal; 302 // alert reminder interval 303 queryReturnVal = SubscriptionManager.getIntegerSubscriptionProperty( 304 mSir.getSubscriptionId(), SubscriptionManager.CB_ALERT_REMINDER_INTERVAL, 305 Integer.parseInt(ALERT_REMINDER_INTERVAL), this) + ""; 306 307 mReminderInterval.setValue(queryReturnVal); 308 mReminderInterval.setSummary(mReminderInterval 309 .getEntries()[mReminderInterval.findIndexOfValue(queryReturnVal)]); 310 311 mReminderInterval.setOnPreferenceChangeListener( 312 new Preference.OnPreferenceChangeListener() { 313 @Override 314 public boolean onPreferenceChange(Preference pref, Object newValue) { 315 final ListPreference listPref = (ListPreference) pref; 316 final int idx = listPref.findIndexOfValue((String) newValue); 317 listPref.setSummary(listPref.getEntries()[idx]); 318 SubscriptionManager.setSubscriptionProperty(mSir.getSubscriptionId(), 319 SubscriptionManager.CB_ALERT_REMINDER_INTERVAL, 320 (String) newValue); 321 return true; 322 } 323 }); 324 325 boolean forceDisableEtwsCmasTest = 326 isEtwsCmasTestMessageForcedDisabled(this, mSir.getSubscriptionId()); 327 328 // Show alert settings and ETWS categories for ETWS builds and developer mode. 329 if (enableDevSettings || showEtwsSettings) { 330 // enable/disable all alerts 331 if (mEmergencyCheckBox != null) { 332 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 333 SubscriptionManager.CB_EMERGENCY_ALERT, true, this)) { 334 mEmergencyCheckBox.setChecked(true); 335 } else { 336 mEmergencyCheckBox.setChecked(false); 337 } 338 mEmergencyCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 339 } 340 341 // alert sound duration 342 queryReturnVal = SubscriptionManager.getIntegerSubscriptionProperty( 343 mSir.getSubscriptionId(), SubscriptionManager.CB_ALERT_SOUND_DURATION, 344 Integer.parseInt(ALERT_SOUND_DEFAULT_DURATION), this) + ""; 345 mAlertDuration.setValue(queryReturnVal); 346 mAlertDuration.setSummary(mAlertDuration 347 .getEntries()[mAlertDuration.findIndexOfValue(queryReturnVal)]); 348 mAlertDuration.setOnPreferenceChangeListener( 349 new Preference.OnPreferenceChangeListener() { 350 @Override 351 public boolean onPreferenceChange(Preference pref, Object newValue) { 352 final ListPreference listPref = (ListPreference) pref; 353 final int idx = listPref.findIndexOfValue((String) newValue); 354 listPref.setSummary(listPref.getEntries()[idx]); 355 SubscriptionManager.setSubscriptionProperty( 356 mSir.getSubscriptionId(), 357 SubscriptionManager.CB_ALERT_SOUND_DURATION, 358 (String) newValue); 359 return true; 360 } 361 }); 362 if (forceDisableEtwsCmasTest) { 363 // Remove ETWS test preference. 364 prefScreen.removePreference(findPreference(KEY_CATEGORY_ETWS_SETTINGS)); 365 366 PreferenceCategory devSettingCategory = 367 (PreferenceCategory) findPreference(KEY_CATEGORY_DEV_SETTINGS); 368 369 // Remove CMAS test preference. 370 if (devSettingCategory != null) { 371 devSettingCategory.removePreference( 372 findPreference(KEY_ENABLE_CMAS_TEST_ALERTS)); 373 } 374 } 375 } else { 376 // Remove general emergency alert preference items (not shown for CMAS builds). 377 mAlertCategory.removePreference(findPreference(KEY_ENABLE_EMERGENCY_ALERTS)); 378 mAlertCategory.removePreference(findPreference(KEY_ALERT_SOUND_DURATION)); 379 mAlertCategory.removePreference(findPreference(KEY_ENABLE_ALERT_SPEECH)); 380 // Remove ETWS test preference category. 381 prefScreen.removePreference(findPreference(KEY_CATEGORY_ETWS_SETTINGS)); 382 } 383 384 if (!SubscriptionManager.getResourcesForSubId(getApplicationContext(), 385 mSir.getSubscriptionId()).getBoolean(R.bool.show_cmas_settings)) { 386 // Remove CMAS preference items in emergency alert category. 387 mAlertCategory.removePreference( 388 findPreference(KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS)); 389 mAlertCategory.removePreference( 390 findPreference(KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS)); 391 mAlertCategory.removePreference(findPreference(KEY_ENABLE_CMAS_AMBER_ALERTS)); 392 } 393 394 boolean enableChannel50Support = SubscriptionManager.getResourcesForSubId( 395 getApplicationContext(), mSir.getSubscriptionId()).getBoolean( 396 R.bool.show_brazil_settings) 397 || "br".equals(mTelephonyManager.getSimCountryIso()); 398 399 if (!enableChannel50Support) { 400 prefScreen.removePreference(findPreference(KEY_CATEGORY_BRAZIL_SETTINGS)); 401 } 402 if (!enableDevSettings) { 403 prefScreen.removePreference(findPreference(KEY_CATEGORY_DEV_SETTINGS)); 404 } 405 406 if (mSpeechCheckBox != null) { 407 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 408 SubscriptionManager.CB_ALERT_SPEECH, true, this)) { 409 mSpeechCheckBox.setChecked(true); 410 } else { 411 mSpeechCheckBox.setChecked(false); 412 } 413 mSpeechCheckBox.setOnPreferenceChangeListener( 414 new Preference.OnPreferenceChangeListener() { 415 @Override 416 public boolean onPreferenceChange(Preference pref, Object newValue) { 417 int newVal = (((Boolean) newValue).booleanValue()) ? 1 : 0; 418 SubscriptionManager.setSubscriptionProperty( 419 mSir.getSubscriptionId(), 420 SubscriptionManager.CB_ALERT_SPEECH, newVal + ""); 421 return true; 422 } 423 }); 424 } 425 426 if (mVibrateCheckBox != null) { 427 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 428 SubscriptionManager.CB_ALERT_VIBRATE, true, this)) { 429 mVibrateCheckBox.setChecked(true); 430 } else { 431 mVibrateCheckBox.setChecked(false); 432 } 433 mVibrateCheckBox.setOnPreferenceChangeListener( 434 new Preference.OnPreferenceChangeListener() { 435 @Override 436 public boolean onPreferenceChange(Preference pref, Object newValue) { 437 int newVal = (((Boolean) newValue).booleanValue()) ? 1 : 0; 438 SubscriptionManager.setSubscriptionProperty( 439 mSir.getSubscriptionId(), 440 SubscriptionManager.CB_ALERT_VIBRATE, newVal + ""); 441 return true; 442 } 443 }); 444 } 445 446 if (mOptOutCheckBox != null) { 447 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 448 SubscriptionManager.CB_OPT_OUT_DIALOG, true, this)) { 449 mOptOutCheckBox.setChecked(true); 450 } else { 451 mOptOutCheckBox.setChecked(false); 452 } 453 mOptOutCheckBox.setOnPreferenceChangeListener( 454 new Preference.OnPreferenceChangeListener() { 455 @Override 456 public boolean onPreferenceChange(Preference pref, Object newValue) { 457 int newVal = (((Boolean) newValue).booleanValue()) ? 1 : 0; 458 SubscriptionManager.setSubscriptionProperty( 459 mSir.getSubscriptionId(), 460 SubscriptionManager.CB_OPT_OUT_DIALOG, newVal + ""); 461 return true; 462 } 463 }); 464 } 465 466 if (mChannel50CheckBox != null) { 467 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 468 SubscriptionManager.CB_CHANNEL_50_ALERT, true, this)) { 469 mChannel50CheckBox.setChecked(true); 470 } else { 471 mChannel50CheckBox.setChecked(false); 472 } 473 mChannel50CheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 474 } 475 476 if (mEtwsTestCheckBox != null) { 477 if (!forceDisableEtwsCmasTest && 478 SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 479 SubscriptionManager.CB_ETWS_TEST_ALERT, false, this)) { 480 mEtwsTestCheckBox.setChecked(true); 481 } else { 482 mEtwsTestCheckBox.setChecked(false); 483 } 484 mEtwsTestCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 485 } 486 487 if (mExtremeCheckBox != null) { 488 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 489 SubscriptionManager.CB_EXTREME_THREAT_ALERT, true, this)) { 490 mExtremeCheckBox.setChecked(true); 491 } else { 492 mExtremeCheckBox.setChecked(false); 493 } 494 mExtremeCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 495 } 496 497 if (mSevereCheckBox != null) { 498 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 499 SubscriptionManager.CB_SEVERE_THREAT_ALERT, true, this)) { 500 mSevereCheckBox.setChecked(true); 501 } else { 502 mSevereCheckBox.setChecked(false); 503 } 504 mSevereCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 505 if (mExtremeCheckBox != null) { 506 boolean isExtremeAlertChecked = 507 ((CheckBoxPreference) mExtremeCheckBox).isChecked(); 508 mSevereCheckBox.setEnabled(isExtremeAlertChecked); 509 } 510 } 511 512 if (mAmberCheckBox != null) { 513 if (SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 514 SubscriptionManager.CB_AMBER_ALERT, true, this)) { 515 mAmberCheckBox.setChecked(true); 516 } else { 517 mAmberCheckBox.setChecked(false); 518 } 519 mAmberCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 520 } 521 522 if (mCmasCheckBox != null) { 523 if (!forceDisableEtwsCmasTest && 524 SubscriptionManager.getBooleanSubscriptionProperty(mSir.getSubscriptionId(), 525 SubscriptionManager.CB_CMAS_TEST_ALERT, false, this)) { 526 mCmasCheckBox.setChecked(true); 527 } else { 528 mCmasCheckBox.setChecked(false); 529 } 530 mCmasCheckBox.setOnPreferenceChangeListener(startConfigServiceListener); 531 } 532 } 533 } 534 535 // Check if ETWS/CMAS test message is forced disabled on the device. 536 public static boolean isEtwsCmasTestMessageForcedDisabled(Context context, int subId) { 537 538 if (context == null) { 539 return false; 540 } 541 542 CarrierConfigManager configManager = 543 (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE); 544 545 if (configManager != null) { 546 PersistableBundle carrierConfig = 547 configManager.getConfigForSubId(subId); 548 549 if (carrierConfig != null) { 550 return carrierConfig.getBoolean( 551 CarrierConfigManager.KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL); 552 } 553 } 554 555 return false; 556 } 557 558 private OnTabChangeListener mTabListener = new OnTabChangeListener() { 559 @Override 560 public void onTabChanged(String tabId) { 561 final int slotId = Integer.parseInt(tabId); 562 mSir = mSelectableSubInfos.get(slotId); 563 updatePreferences(); 564 } 565 }; 566 567 private TabContentFactory mEmptyTabContent = new TabContentFactory() { 568 @Override 569 public View createTabContent(String tag) { 570 return new View(mTabHost.getContext()); 571 } 572 }; 573 574 private TabSpec buildTabSpec(String tag, String title) { 575 return mTabHost.newTabSpec(tag).setIndicator(title).setContent( 576 mEmptyTabContent); 577 578 } 579 580 public SubscriptionInfo findRecordBySlotId(Context context, final int slotId) { 581 final List<SubscriptionInfo> subInfoList = 582 SubscriptionManager.from(context).getActiveSubscriptionInfoList(); 583 if (subInfoList != null) { 584 final int subInfoLength = subInfoList.size(); 585 586 for (int i = 0; i < subInfoLength; ++i) { 587 final SubscriptionInfo sir = subInfoList.get(i); 588 if (sir.getSimSlotIndex() == slotId) { 589 return sir; 590 } 591 } 592 } 593 594 return null; 595 } 596 597} 598