Home | History | Annotate | Download | only in tests
      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