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