1/* 2 * Copyright (C) 2012 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 17package com.android.cellbroadcastreceiver.tests; 18 19import android.app.Activity; 20import android.content.Intent; 21import android.os.Parcel; 22import android.provider.Telephony; 23import android.telephony.SmsCbCmasInfo; 24import android.telephony.SmsCbLocation; 25import android.telephony.SmsCbMessage; 26import android.test.AndroidTestCase; 27import android.util.Log; 28 29import com.android.internal.telephony.GsmAlphabet; 30import com.android.internal.telephony.cdma.sms.BearerData; 31import com.android.internal.telephony.cdma.sms.CdmaSmsAddress; 32import com.android.internal.telephony.cdma.sms.SmsEnvelope; 33import com.android.internal.telephony.cdma.sms.UserData; 34import com.android.internal.util.BitwiseOutputStream; 35 36import java.util.Arrays; 37import java.util.Random; 38 39/** 40 * Send some test CDMA CMAS warning notifications. 41 */ 42public class SendCdmaCmasMessages { 43 44 private static final String TEST_TEXT = "This is a test CDMA cell broadcast message..." 45 + "678901234567890123456789012345678901234567890"; 46 47 private static final String PRES_ALERT = 48 "THE PRESIDENT HAS ISSUED AN EMERGENCY ALERT. CHECK LOCAL MEDIA FOR MORE DETAILS"; 49 50 private static final String EXTREME_ALERT = "FLASH FLOOD WARNING FOR SOUTH COCONINO COUNTY" 51 + " - NORTH CENTRAL ARIZONA UNTIL 415 PM MST"; 52 53 private static final String SEVERE_ALERT = "SEVERE WEATHER WARNING FOR SOMERSET COUNTY" 54 + " - NEW JERSEY UNTIL 415 PM MST"; 55 56 private static final String AMBER_ALERT = 57 "AMBER ALERT:Mountain View,CA VEH'07 Blue Honda Civic CA LIC 5ABC123"; 58 59 private static final String MONTHLY_TEST_ALERT = "This is a test of the emergency alert system." 60 + " This is only a test. 89012345678901234567890"; 61 62 private static final String IS91_TEXT = "IS91 SHORT MSG"; // max length 14 chars 63 64 public static void testSendCmasPresAlert(Activity activity, int messageId) { 65 SmsCbMessage cbMessage = createCmasSmsMessage( 66 SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, messageId, "en", 67 PRES_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_GEO, 68 SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE, SmsCbCmasInfo.CMAS_SEVERITY_EXTREME, 69 SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY); 70 71 Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 72 intent.putExtra("message", cbMessage); 73 activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 74 } 75 76 public static void testSendCmasExtremeAlert(Activity activity, int messageId) { 77 SmsCbMessage cbMessage = createCmasSmsMessage( 78 SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, messageId, "en", 79 EXTREME_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_MET, 80 SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE, SmsCbCmasInfo.CMAS_SEVERITY_EXTREME, 81 SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED); 82 83 Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 84 intent.putExtra("message", cbMessage); 85 activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 86 } 87 88 public static void testSendCmasSevereAlert(Activity activity, int messageId) { 89 SmsCbMessage cbMessage = createCmasSmsMessage( 90 SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, messageId, "en", 91 SEVERE_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_HEALTH, 92 SmsCbCmasInfo.CMAS_RESPONSE_TYPE_AVOID, SmsCbCmasInfo.CMAS_SEVERITY_SEVERE, 93 SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE, SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY); 94 95 Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 96 intent.putExtra("message", cbMessage); 97 activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 98 } 99 100 public static void testSendCmasAmberAlert(Activity activity, int messageId) { 101 SmsCbMessage cbMessage = createCmasSmsMessage( 102 SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, messageId, "en", 103 AMBER_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN, 104 SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN, 105 SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN); 106 107 Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 108 intent.putExtra("message", cbMessage); 109 activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 110 } 111 112 public static void testSendCmasMonthlyTest(Activity activity, int messageId) { 113 SmsCbMessage cbMessage = createCmasSmsMessage( 114 SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, messageId, "en", 115 MONTHLY_TEST_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN, 116 SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN, 117 SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN); 118 119 Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 120 intent.putExtra("message", cbMessage); 121 activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 122 } 123 124 /** 125 * Create a new SmsCbMessage for testing CDMA CMAS support. 126 * @param serviceCategory the CDMA service category 127 * @param messageId the 16-bit message identifier 128 * @param language message language code 129 * @param body message body 130 * @param cmasCategory CMAS category (or -1 to skip adding CMAS type 1 elements record) 131 * @param responseType CMAS response type 132 * @param severity CMAS severity 133 * @param urgency CMAS urgency 134 * @param certainty CMAS certainty 135 * @return the newly created SmsMessage object 136 */ 137 private static SmsCbMessage createCmasSmsMessage(int serviceCategory, int messageId, 138 String language, String body, int cmasCategory, int responseType, int severity, 139 int urgency, int certainty) { 140 int cmasMessageClass = serviceCategoryToCmasMessageClass(serviceCategory); 141 SmsCbCmasInfo cmasInfo = new SmsCbCmasInfo(cmasMessageClass, cmasCategory, responseType, 142 severity, urgency, certainty); 143 return new SmsCbMessage(SmsCbMessage.MESSAGE_FORMAT_3GPP2, 144 SmsCbMessage.GEOGRAPHICAL_SCOPE_PLMN_WIDE, messageId, new SmsCbLocation("123456"), 145 serviceCategory, language, body, SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, null, 146 cmasInfo); 147 } 148 149 /** 150 * Convert CDMA service category to CMAS message class. Copied from {@code BearerData}. 151 * @param serviceCategory CDMA service category 152 * @return CMAS message class 153 */ 154 private static int serviceCategoryToCmasMessageClass(int serviceCategory) { 155 switch (serviceCategory) { 156 case SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT: 157 return SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT; 158 159 case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT: 160 return SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT; 161 162 case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT: 163 return SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT; 164 165 case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY: 166 return SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY; 167 168 case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE: 169 return SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST; 170 171 default: 172 return SmsCbCmasInfo.CMAS_CLASS_UNKNOWN; 173 } 174 } 175} 176