1 /* 2 * Copyright (C) 2011 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 package com.android.cellbroadcastreceiver.tests; 18 19 import android.app.Activity; 20 import android.os.Bundle; 21 import android.os.Handler; 22 import android.os.Message; 23 import android.telephony.SubscriptionManager; 24 import android.util.Log; 25 import android.view.View; 26 import android.view.View.OnClickListener; 27 import android.widget.Button; 28 import android.widget.CheckBox; 29 import android.widget.EditText; 30 31 import java.util.Random; 32 33 /** 34 * Activity to send test cell broadcast messages from GUI. 35 */ 36 public class SendTestBroadcastActivity extends Activity { 37 private static final String TAG = "SendTestBroadcastActivity"; 38 39 /** Whether to delay before sending test message. */ 40 private boolean mDelayBeforeSending; 41 42 /** Delay time before sending test message (when box is checked). */ 43 private static final int DELAY_BEFORE_SENDING_MSEC = 5000; 44 45 private final Handler mDelayHandler = new Handler() { 46 @Override 47 public void handleMessage(Message msg) { 48 // call the onClick() method again, passing null View. 49 // The callback will ignore mDelayBeforeSending when the View is null. 50 OnClickListener pendingButtonClick = (OnClickListener) msg.obj; 51 pendingButtonClick.onClick(null); 52 } 53 }; 54 55 /** 56 * Increment the message ID field and return the previous value. 57 * @return the current value of the message ID text field 58 */ getMessageId()59 private int getMessageId() { 60 EditText messageIdField = (EditText) findViewById(R.id.message_id); 61 int messageId = 0; 62 try { 63 messageId = Integer.parseInt(messageIdField.getText().toString()); 64 } catch (NumberFormatException ignored) { 65 Log.e(TAG, "Invalid message ID"); 66 } 67 int newMessageId = (messageId + 1) % 65536; 68 if (newMessageId == 0) { 69 newMessageId = 1; 70 } 71 messageIdField.setText(String.valueOf(newMessageId)); 72 return messageId; 73 } 74 75 /** 76 * Return the value of the category field. 77 * @return the current value of the category text field 78 */ getCategory()79 private int getCategory() { 80 EditText categoryField = (EditText) findViewById(R.id.category_id); 81 return Integer.parseInt(categoryField.getText().toString()); 82 } 83 84 /** 85 * Initialization of the Activity after it is first created. Must at least 86 * call {@link android.app.Activity#setContentView(int)} to 87 * describe what is to be displayed in the screen. 88 */ 89 @Override onCreate(Bundle savedInstanceState)90 protected void onCreate(Bundle savedInstanceState) { 91 super.onCreate(savedInstanceState); 92 93 setContentView(R.layout.test_buttons); 94 95 /* Set message ID to a random value from 1-65535. */ 96 EditText messageIdField = (EditText) findViewById(R.id.message_id); 97 messageIdField.setText(String.valueOf(new Random().nextInt(65535) + 1)); 98 99 /* When category ID is non-zero, use it for the GSM/UMTS message identifier. */ 100 EditText categoryIdField = (EditText) findViewById(R.id.category_id); 101 categoryIdField.setText("0"); 102 103 /* Send an ETWS normal broadcast message to app. */ 104 Button etwsNormalTypeButton = (Button) findViewById(R.id.button_etws_normal_type); 105 etwsNormalTypeButton.setOnClickListener(new OnClickListener() { 106 public void onClick(View v) { 107 if (mDelayBeforeSending && v != null) { 108 Message msg = mDelayHandler.obtainMessage(0, this); 109 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 110 } else { 111 SendTestMessages.testSendEtwsMessageNormal(SendTestBroadcastActivity.this, 112 getMessageId()); 113 } 114 } 115 }); 116 117 /* Send an ETWS cancel broadcast message to app. */ 118 Button etwsCancelTypeButton = (Button) findViewById(R.id.button_etws_cancel_type); 119 etwsCancelTypeButton.setOnClickListener(new OnClickListener() { 120 public void onClick(View v) { 121 if (mDelayBeforeSending && v != null) { 122 Message msg = mDelayHandler.obtainMessage(0, this); 123 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 124 } else { 125 SendTestMessages.testSendEtwsMessageCancel(SendTestBroadcastActivity.this, 126 getMessageId()); 127 } 128 } 129 }); 130 131 /* Send an ETWS test broadcast message to app. */ 132 Button etwsTestTypeButton = (Button) findViewById(R.id.button_etws_test_type); 133 etwsTestTypeButton.setOnClickListener(new OnClickListener() { 134 public void onClick(View v) { 135 if (mDelayBeforeSending && v != null) { 136 Message msg = mDelayHandler.obtainMessage(0, this); 137 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 138 } else { 139 SendTestMessages.testSendEtwsMessageTest(SendTestBroadcastActivity.this, 140 getMessageId()); 141 } 142 } 143 }); 144 145 /* Send a CMAS presidential alert to app. */ 146 Button cmasPresAlertButton = (Button) findViewById(R.id.button_cmas_pres_alert); 147 cmasPresAlertButton.setOnClickListener(new OnClickListener() { 148 public void onClick(View v) { 149 if (mDelayBeforeSending && v != null) { 150 Message msg = mDelayHandler.obtainMessage(0, this); 151 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 152 } else { 153 SendCdmaCmasMessages.testSendCmasPresAlert(SendTestBroadcastActivity.this, 154 getMessageId()); 155 } 156 } 157 }); 158 159 /* Send a CMAS extreme alert to app. */ 160 Button cmasExtremeAlertButton = (Button) findViewById(R.id.button_cmas_extreme_alert); 161 cmasExtremeAlertButton.setOnClickListener(new OnClickListener() { 162 public void onClick(View v) { 163 if (mDelayBeforeSending && v != null) { 164 Message msg = mDelayHandler.obtainMessage(0, this); 165 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 166 } else { 167 SendCdmaCmasMessages.testSendCmasExtremeAlert(SendTestBroadcastActivity.this, 168 getMessageId()); 169 } 170 } 171 }); 172 173 /* Send a CMAS severe alert to app. */ 174 Button cmasSevereAlertButton = (Button) findViewById(R.id.button_cmas_severe_alert); 175 cmasSevereAlertButton.setOnClickListener(new OnClickListener() { 176 public void onClick(View v) { 177 if (mDelayBeforeSending && v != null) { 178 Message msg = mDelayHandler.obtainMessage(0, this); 179 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 180 } else { 181 SendCdmaCmasMessages.testSendCmasSevereAlert(SendTestBroadcastActivity.this, 182 getMessageId()); 183 } 184 } 185 }); 186 187 /* Send a CMAS AMBER alert to app. */ 188 Button cmasAmberAlertButton = (Button) findViewById(R.id.button_cmas_amber_alert); 189 cmasAmberAlertButton.setOnClickListener(new OnClickListener() { 190 public void onClick(View v) { 191 if (mDelayBeforeSending && v != null) { 192 Message msg = mDelayHandler.obtainMessage(0, this); 193 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 194 } else { 195 SendCdmaCmasMessages.testSendCmasAmberAlert(SendTestBroadcastActivity.this, 196 getMessageId()); 197 } 198 } 199 }); 200 201 /* Send a CMAS monthly test alert to app. */ 202 Button cmasMonthlyTestButton = (Button) findViewById(R.id.button_cmas_monthly_test); 203 cmasMonthlyTestButton.setOnClickListener(new OnClickListener() { 204 public void onClick(View v) { 205 if (mDelayBeforeSending && v != null) { 206 Message msg = mDelayHandler.obtainMessage(0, this); 207 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 208 } else { 209 SendCdmaCmasMessages.testSendCmasMonthlyTest(SendTestBroadcastActivity.this, 210 getMessageId()); 211 } 212 } 213 }); 214 215 /* Send a GSM 7-bit broadcast message to app. */ 216 Button gsm7bitTypeButton = (Button) findViewById(R.id.button_gsm_7bit_type); 217 gsm7bitTypeButton.setOnClickListener(new OnClickListener() { 218 public void onClick(View v) { 219 if (mDelayBeforeSending && v != null) { 220 Message msg = mDelayHandler.obtainMessage(0, this); 221 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 222 } else { 223 SendTestMessages.testSendMessage7bit(SendTestBroadcastActivity.this, 224 getMessageId(), getCategory()); 225 } 226 } 227 }); 228 229 /* Send a UMTS 7-bit broadcast message to app. */ 230 Button gsm7bitUmtsTypeButton = (Button) findViewById(R.id.button_gsm_7bit_umts_type); 231 gsm7bitUmtsTypeButton.setOnClickListener(new OnClickListener() { 232 public void onClick(View v) { 233 if (mDelayBeforeSending && v != null) { 234 Message msg = mDelayHandler.obtainMessage(0, this); 235 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 236 } else { 237 SendTestMessages.testSendMessage7bitUmts(SendTestBroadcastActivity.this, 238 getMessageId(), getCategory()); 239 } 240 } 241 }); 242 243 /* Send a GSM 7-bit no padding broadcast message to app. */ 244 Button gsm7bitNoPaddingButton = (Button) findViewById(R.id.button_gsm_7bit_nopadding_type); 245 gsm7bitNoPaddingButton.setOnClickListener(new OnClickListener() { 246 public void onClick(View v) { 247 if (mDelayBeforeSending && v != null) { 248 Message msg = mDelayHandler.obtainMessage(0, this); 249 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 250 } else { 251 SendTestMessages.testSendMessage7bitNoPadding(SendTestBroadcastActivity.this, 252 getMessageId(), getCategory()); 253 } 254 } 255 }); 256 257 /* Send a UMTS 7-bit no padding broadcast message to app. */ 258 Button gsm7bitNoPaddingUmtsTypeButton = 259 (Button) findViewById(R.id.button_gsm_7bit_nopadding_umts_type); 260 gsm7bitNoPaddingUmtsTypeButton.setOnClickListener(new OnClickListener() { 261 public void onClick(View v) { 262 if (mDelayBeforeSending && v != null) { 263 Message msg = mDelayHandler.obtainMessage(0, this); 264 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 265 } else { 266 SendTestMessages.testSendMessage7bitNoPaddingUmts( 267 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 268 } 269 } 270 }); 271 272 /* Send a UMTS 7-bit multi-page broadcast message to app. */ 273 Button gsm7bitMultipageButton = 274 (Button) findViewById(R.id.button_gsm_7bit_multipage_type); 275 gsm7bitMultipageButton.setOnClickListener(new OnClickListener() { 276 public void onClick(View v) { 277 if (mDelayBeforeSending && v != null) { 278 Message msg = mDelayHandler.obtainMessage(0, this); 279 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 280 } else { 281 SendTestMessages.testSendMessage7bitMultipageGsm(SendTestBroadcastActivity.this, 282 getMessageId(), getCategory()); 283 } 284 } 285 }); 286 287 /* Send a UMTS 7-bit multi-page broadcast message to app. */ 288 Button gsm7bitMultipageUmtsButton = 289 (Button) findViewById(R.id.button_gsm_7bit_multipage_umts_type); 290 gsm7bitMultipageUmtsButton.setOnClickListener(new OnClickListener() { 291 public void onClick(View v) { 292 if (mDelayBeforeSending && v != null) { 293 Message msg = mDelayHandler.obtainMessage(0, this); 294 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 295 } else { 296 SendTestMessages.testSendMessage7bitMultipageUmts( 297 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 298 } 299 } 300 }); 301 302 /* Send a GSM 7-bit broadcast message with language to app. */ 303 Button gsm7bitWithLanguageButton = 304 (Button) findViewById(R.id.button_gsm_7bit_with_language_type); 305 gsm7bitWithLanguageButton.setOnClickListener(new OnClickListener() { 306 public void onClick(View v) { 307 if (mDelayBeforeSending && v != null) { 308 Message msg = mDelayHandler.obtainMessage(0, this); 309 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 310 } else { 311 SendTestMessages.testSendMessage7bitWithLanguage(SendTestBroadcastActivity.this, 312 getMessageId(), getCategory()); 313 } 314 } 315 }); 316 317 /* Send a GSM 7-bit broadcast message with language to app. */ 318 Button gsm7bitWithLanguageInBodyButton = 319 (Button) findViewById(R.id.button_gsm_7bit_with_language_body_gsm_type); 320 gsm7bitWithLanguageInBodyButton.setOnClickListener(new OnClickListener() { 321 public void onClick(View v) { 322 if (mDelayBeforeSending && v != null) { 323 Message msg = mDelayHandler.obtainMessage(0, this); 324 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 325 } else { 326 SendTestMessages.testSendMessage7bitWithLanguageInBody( 327 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 328 } 329 } 330 }); 331 332 /* Send a UMTS 7-bit broadcast message with language to app. */ 333 Button gsm7bitWithLanguageUmtsButton = 334 (Button) findViewById(R.id.button_gsm_7bit_with_language_body_umts_type); 335 gsm7bitWithLanguageUmtsButton.setOnClickListener(new OnClickListener() { 336 public void onClick(View v) { 337 if (mDelayBeforeSending && v != null) { 338 Message msg = mDelayHandler.obtainMessage(0, this); 339 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 340 } else { 341 SendTestMessages.testSendMessage7bitWithLanguageInBodyUmts( 342 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 343 } 344 } 345 }); 346 347 /* Send a GSM UCS-2 broadcast message to app. */ 348 Button gsmUcs2TypeButton = (Button) findViewById(R.id.button_gsm_ucs2_type); 349 gsmUcs2TypeButton.setOnClickListener(new OnClickListener() { 350 public void onClick(View v) { 351 if (mDelayBeforeSending && v != null) { 352 Message msg = mDelayHandler.obtainMessage(0, this); 353 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 354 } else { 355 SendTestMessages.testSendMessageUcs2(SendTestBroadcastActivity.this, 356 getMessageId(), getCategory()); 357 } 358 } 359 }); 360 361 /* Send a UMTS UCS-2 broadcast message to app. */ 362 Button gsmUcs2UmtsTypeButton = (Button) findViewById(R.id.button_gsm_ucs2_umts_type); 363 gsmUcs2UmtsTypeButton.setOnClickListener(new OnClickListener() { 364 public void onClick(View v) { 365 if (mDelayBeforeSending && v != null) { 366 Message msg = mDelayHandler.obtainMessage(0, this); 367 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 368 } else { 369 SendTestMessages.testSendMessageUcs2Umts(SendTestBroadcastActivity.this, 370 getMessageId(), getCategory()); 371 } 372 } 373 }); 374 375 /* Send a UMTS UCS-2 multipage broadcast message to app. */ 376 Button gsmUcs2MultipageUmtsTypeButton = 377 (Button) findViewById(R.id.button_gsm_ucs2_multipage_umts_type); 378 gsmUcs2MultipageUmtsTypeButton.setOnClickListener(new OnClickListener() { 379 public void onClick(View v) { 380 if (mDelayBeforeSending && v != null) { 381 Message msg = mDelayHandler.obtainMessage(0, this); 382 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 383 } else { 384 SendTestMessages.testSendMessageUcs2MultipageUmts( 385 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 386 } 387 } 388 }); 389 390 /* Send a GSM UCS-2 broadcast message with language to app. */ 391 Button gsmUcs2WithLanguageTypeButton = 392 (Button) findViewById(R.id.button_gsm_ucs2_with_language_type); 393 gsmUcs2WithLanguageTypeButton.setOnClickListener(new OnClickListener() { 394 public void onClick(View v) { 395 if (mDelayBeforeSending && v != null) { 396 Message msg = mDelayHandler.obtainMessage(0, this); 397 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 398 } else { 399 SendTestMessages.testSendMessageUcs2WithLanguageInBody( 400 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 401 } 402 } 403 }); 404 405 /* Send a UMTS UCS-2 broadcast message with language to app. */ 406 Button gsmUcs2WithLanguageUmtsTypeButton = 407 (Button) findViewById(R.id.button_gsm_ucs2_with_language_umts_type); 408 gsmUcs2WithLanguageUmtsTypeButton.setOnClickListener(new OnClickListener() { 409 public void onClick(View v) { 410 if (mDelayBeforeSending && v != null) { 411 Message msg = mDelayHandler.obtainMessage(0, this); 412 mDelayHandler.sendMessageDelayed(msg, DELAY_BEFORE_SENDING_MSEC); 413 } else { 414 SendTestMessages.testSendMessageUcs2WithLanguageUmts( 415 SendTestBroadcastActivity.this, getMessageId(), getCategory()); 416 } 417 } 418 }); 419 420 /* Update boolean to delay before sending when box is checked. */ 421 final CheckBox delayCheckbox = (CheckBox) findViewById(R.id.button_delay_broadcast); 422 delayCheckbox.setOnClickListener(new OnClickListener() { 423 public void onClick(View v) { 424 mDelayBeforeSending = delayCheckbox.isChecked(); 425 } 426 }); 427 } 428 } 429