100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby/*
200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Copyright (C) 2012 The Android Open Source Project
300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby *
400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * you may not use this file except in compliance with the License.
600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * You may obtain a copy of the License at
700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby *
800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby *
1000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Unless required by applicable law or agreed to in writing, software
1100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
1200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * See the License for the specific language governing permissions and
1400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * limitations under the License.
1500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */
1600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
1700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambypackage com.android.cellbroadcastreceiver.tests;
1800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
1900b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.app.Activity;
2000b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.content.Intent;
2100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.os.Parcel;
2200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.provider.Telephony;
2300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.SmsCbCmasInfo;
2400b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.SmsCbLocation;
2500b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.SmsCbMessage;
2600b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.test.AndroidTestCase;
2700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.util.Log;
2800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
2900b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.GsmAlphabet;
3000b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.BearerData;
3100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.CdmaSmsAddress;
3200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.SmsEnvelope;
3300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.UserData;
3400b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.util.BitwiseOutputStream;
3500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
3600b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport java.util.Arrays;
3700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport java.util.Random;
3800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
3900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby/**
4000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Send some test CDMA CMAS warning notifications.
4100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */
4200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambypublic class SendCdmaCmasMessages {
4300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
4400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String TEST_TEXT = "This is a test CDMA cell broadcast message..."
4500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            + "678901234567890123456789012345678901234567890";
4600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
4700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String PRES_ALERT =
4800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            "THE PRESIDENT HAS ISSUED AN EMERGENCY ALERT. CHECK LOCAL MEDIA FOR MORE DETAILS";
4900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
5000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String EXTREME_ALERT = "FLASH FLOOD WARNING FOR SOUTH COCONINO COUNTY"
5100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            + " - NORTH CENTRAL ARIZONA UNTIL 415 PM MST";
5200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
5300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String SEVERE_ALERT = "SEVERE WEATHER WARNING FOR SOMERSET COUNTY"
5400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            + " - NEW JERSEY UNTIL 415 PM MST";
5500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
5600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String AMBER_ALERT =
5700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            "AMBER ALERT:Mountain View,CA VEH'07 Blue Honda Civic CA LIC 5ABC123";
5800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
5900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String MONTHLY_TEST_ALERT = "This is a test of the emergency alert system."
6000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            + " This is only a test. 89012345678901234567890";
6100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
6200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static final String IS91_TEXT = "IS91 SHORT MSG";   // max length 14 chars
6300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
6457273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby    public static void testSendCmasPresAlert(Activity activity, int messageId) {
6500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbMessage cbMessage = createCmasSmsMessage(
6657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby                SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, messageId, "en",
6700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                PRES_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_GEO,
6800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE, SmsCbCmasInfo.CMAS_SEVERITY_EXTREME,
6900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY);
7000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
7100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
7200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        intent.putExtra("message", cbMessage);
7300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
7400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
7500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
7657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby    public static void testSendCmasExtremeAlert(Activity activity, int messageId) {
7700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbMessage cbMessage = createCmasSmsMessage(
7857273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby                SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, messageId, "en",
7900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                EXTREME_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_MET,
8000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE, SmsCbCmasInfo.CMAS_SEVERITY_EXTREME,
8100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED);
8200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
8300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
8400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        intent.putExtra("message", cbMessage);
8500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
8600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
8700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
8857273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby    public static void testSendCmasSevereAlert(Activity activity, int messageId) {
8900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbMessage cbMessage = createCmasSmsMessage(
9057273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby                SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, messageId, "en",
9100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SEVERE_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_HEALTH,
9200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_RESPONSE_TYPE_AVOID, SmsCbCmasInfo.CMAS_SEVERITY_SEVERE,
9300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE, SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY);
9400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
9500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
9600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        intent.putExtra("message", cbMessage);
9700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
9800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
9900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
10057273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby    public static void testSendCmasAmberAlert(Activity activity, int messageId) {
10100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbMessage cbMessage = createCmasSmsMessage(
10257273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby                SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, messageId, "en",
10300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                AMBER_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN,
10400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN,
10500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN);
10600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
10700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
10800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        intent.putExtra("message", cbMessage);
10900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
11000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
11100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
11257273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby    public static void testSendCmasMonthlyTest(Activity activity, int messageId) {
11300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbMessage cbMessage = createCmasSmsMessage(
11457273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby                SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, messageId, "en",
11500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                MONTHLY_TEST_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN,
11600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN,
11700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN);
11800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        Intent intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
12000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        intent.putExtra("message", cbMessage);
12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        activity.sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
12200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
12400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    /**
12500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * Create a new SmsCbMessage for testing CDMA CMAS support.
12600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param serviceCategory the CDMA service category
12700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param messageId the 16-bit message identifier
12800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param language message language code
12900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param body message body
13000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param cmasCategory CMAS category (or -1 to skip adding CMAS type 1 elements record)
13100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param responseType CMAS response type
13200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param severity CMAS severity
13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param urgency CMAS urgency
13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param certainty CMAS certainty
13500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @return the newly created SmsMessage object
13600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     */
13700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static SmsCbMessage createCmasSmsMessage(int serviceCategory, int messageId,
13800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            String language, String body, int cmasCategory, int responseType, int severity,
13900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            int urgency, int certainty) {
14000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        int cmasMessageClass = serviceCategoryToCmasMessageClass(serviceCategory);
14100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        SmsCbCmasInfo cmasInfo = new SmsCbCmasInfo(cmasMessageClass, cmasCategory, responseType,
14200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                severity, urgency, certainty);
14300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        return new SmsCbMessage(SmsCbMessage.MESSAGE_FORMAT_3GPP2,
14400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                SmsCbMessage.GEOGRAPHICAL_SCOPE_PLMN_WIDE, messageId, new SmsCbLocation("123456"),
14500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                serviceCategory, language, body, SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, null,
14600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                cmasInfo);
14700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
14800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
14900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    /**
15000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * Convert CDMA service category to CMAS message class. Copied from {@code BearerData}.
15100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @param serviceCategory CDMA service category
15200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     * @return CMAS message class
15300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     */
15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    private static int serviceCategoryToCmasMessageClass(int serviceCategory) {
15500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        switch (serviceCategory) {
15600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT:
15700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
15800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
15900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT:
16000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT;
16100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT:
16300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
16400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY:
16600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY;
16700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE:
16900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST;
17000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
17100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            default:
17200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                return SmsCbCmasInfo.CMAS_CLASS_UNKNOWN;
17300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        }
17400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
17500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby}
176