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