• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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.Context;
23 import android.content.Intent;
24 import android.os.UserHandle;
25 import android.provider.Telephony.Sms.Intents;
26 import android.telephony.SmsCbLocation;
27 import android.telephony.SmsCbMessage;
28 import android.util.Log;
29 
30 import com.android.internal.telephony.gsm.GsmSmsCbMessage;
31 import com.android.internal.telephony.gsm.SmsCbConstants;
32 import com.android.internal.telephony.gsm.SmsCbHeader;
33 import com.android.internal.telephony.uicc.IccUtils;
34 
35 /**
36  * Send test messages.
37  */
38 public class SendTestMessages {
39 
40     private static String TAG = "SendTestMessages";
41 
42     private static final String CB_RECEIVER_PKG = "com.android.cellbroadcastreceiver";
43 
44     private static final int DCS_7BIT_ENGLISH = 0x01;
45     private static final int DCS_16BIT_UCS2 = 0x48;
46 
47     /* ETWS Test message including header */
48     private static final byte[] etwsMessageNormal = IccUtils.hexStringToBytes("000011001101" +
49             "EA305BAE57CE770C531790E85C716CBF3044573065B930675730" +
50             "9707767A751F30025F37304463FA308C306B5099304830664E0B30553044FF086C178C615E81FF09" +
51             "0000000000000000000000000000");
52 
53     private static final byte[] etwsMessageCancel = IccUtils.hexStringToBytes("000011001101" +
54             "EA305148307B3069002800310030003A0035" +
55             "00320029306E7DCA602557309707901F5831309253D66D883057307E3059FF086C178C615E81FF09" +
56             "00000000000000000000000000000000000000000000");
57 
58     private static final byte[] etwsMessageTest = IccUtils.hexStringToBytes("000011031101" +
59             "EA305BAE57CE770C531790E85C716CBF3044" +
60             "573065B9306757309707300263FA308C306B5099304830664E0B30553044FF086C178C615E81FF09" +
61             "00000000000000000000000000000000000000000000");
62 
63     private static final byte[] gsm7BitTest = {
64             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x40, (byte)0x11, (byte)0x41,
65             (byte)0xD0, (byte)0x71, (byte)0xDA, (byte)0x04, (byte)0x91, (byte)0xCB, (byte)0xE6,
66             (byte)0x70, (byte)0x9D, (byte)0x4D, (byte)0x07, (byte)0x85, (byte)0xD9, (byte)0x70,
67             (byte)0x74, (byte)0x58, (byte)0x5C, (byte)0xA6, (byte)0x83, (byte)0xDA, (byte)0xE5,
68             (byte)0xF9, (byte)0x3C, (byte)0x7C, (byte)0x2E, (byte)0x83, (byte)0xEE, (byte)0x69,
69             (byte)0x3A, (byte)0x1A, (byte)0x34, (byte)0x0E, (byte)0xCB, (byte)0xE5, (byte)0xE9,
70             (byte)0xF0, (byte)0xB9, (byte)0x0C, (byte)0x92, (byte)0x97, (byte)0xE9, (byte)0x75,
71             (byte)0xB9, (byte)0x1B, (byte)0x04, (byte)0x0F, (byte)0x93, (byte)0xC9, (byte)0x69,
72             (byte)0xF7, (byte)0xB9, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
73             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
74             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
75             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
76             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00
77     };
78 
79     private static final byte[] gsm7BitTestUmts = {
80             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x40,
81 
82             (byte)0x01,
83 
84             (byte)0x41, (byte)0xD0, (byte)0x71, (byte)0xDA, (byte)0x04, (byte)0x91,
85             (byte)0xCB, (byte)0xE6, (byte)0x70, (byte)0x9D, (byte)0x4D, (byte)0x07,
86             (byte)0x85, (byte)0xD9, (byte)0x70, (byte)0x74, (byte)0x58, (byte)0x5C,
87             (byte)0xA6, (byte)0x83, (byte)0xDA, (byte)0xE5, (byte)0xF9, (byte)0x3C,
88             (byte)0x7C, (byte)0x2E, (byte)0x83, (byte)0xEE, (byte)0x69, (byte)0x3A,
89             (byte)0x1A, (byte)0x34, (byte)0x0E, (byte)0xCB, (byte)0xE5, (byte)0xE9,
90             (byte)0xF0, (byte)0xB9, (byte)0x0C, (byte)0x92, (byte)0x97, (byte)0xE9,
91             (byte)0x75, (byte)0xB9, (byte)0x1B, (byte)0x04, (byte)0x0F, (byte)0x93,
92             (byte)0xC9, (byte)0x69, (byte)0xF7, (byte)0xB9, (byte)0xD1, (byte)0x68,
93             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
94             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
95             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
96             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
97             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00,
98 
99             (byte)0x34
100     };
101 
102     private static final byte[] gsm7BitTestMultipageUmts = {
103             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x40,
104 
105             (byte)0x02,
106 
107             (byte)0xC6, (byte)0xB4, (byte)0x7C, (byte)0x4E, (byte)0x07, (byte)0xC1,
108             (byte)0xC3, (byte)0xE7, (byte)0xF2, (byte)0xAA, (byte)0xD1, (byte)0x68,
109             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
110             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
111             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
112             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
113             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A,
114             (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34,
115             (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68,
116             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
117             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
118             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
119             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
120             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00,
121 
122             (byte)0x0A,
123 
124             (byte)0xD3, (byte)0xF2, (byte)0xF8, (byte)0xED, (byte)0x26, (byte)0x83,
125             (byte)0xE0, (byte)0xE1, (byte)0x73, (byte)0xB9, (byte)0xD1, (byte)0x68,
126             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
127             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
128             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
129             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
130             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A,
131             (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34,
132             (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68,
133             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
134             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
135             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
136             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
137             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00,
138 
139             (byte)0x0A
140     };
141 
142     private static final byte[] gsm7BitTestMultipage1 = {
143             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x40,
144             (byte)0xC6, (byte)0xB4, (byte)0x7C, (byte)0x4E, (byte)0x07, (byte)0xC1,
145             (byte)0xC3, (byte)0xE7, (byte)0xF2, (byte)0xAA, (byte)0xD1, (byte)0x68,
146             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
147             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
148             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
149             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
150             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A,
151             (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34,
152             (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68,
153             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
154             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
155             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
156             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
157             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00
158     };
159 
160     private static final byte[] gsm7BitTestMultipage2 = {
161             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x40,
162             (byte)0xD3, (byte)0xF2, (byte)0xF8, (byte)0xED, (byte)0x26, (byte)0x83,
163             (byte)0xE0, (byte)0xE1, (byte)0x73, (byte)0xB9, (byte)0xD1, (byte)0x68,
164             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
165             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
166             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
167             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
168             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A,
169             (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34,
170             (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68,
171             (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
172             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
173             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
174             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
175             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00
176     };
177 
178     private static final byte[] gsm7BitTestNoPadding = {
179             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x40, (byte)0x11, (byte)0x41,
180             (byte)0xD0, (byte)0x71, (byte)0xDA, (byte)0x04, (byte)0x91, (byte)0xCB, (byte)0xE6,
181             (byte)0x70, (byte)0x9D, (byte)0x4D, (byte)0x07, (byte)0x85, (byte)0xD9, (byte)0x70,
182             (byte)0x74, (byte)0x58, (byte)0x5C, (byte)0xA6, (byte)0x83, (byte)0xDA, (byte)0xE5,
183             (byte)0xF9, (byte)0x3C, (byte)0x7C, (byte)0x2E, (byte)0x83, (byte)0xC4, (byte)0xE5,
184             (byte)0xB4, (byte)0xFB, (byte)0x0C, (byte)0x2A, (byte)0xE3, (byte)0xC3, (byte)0x63,
185             (byte)0x3A, (byte)0x3B, (byte)0x0F, (byte)0xCA, (byte)0xCD, (byte)0x40, (byte)0x63,
186             (byte)0x74, (byte)0x58, (byte)0x1E, (byte)0x1E, (byte)0xD3, (byte)0xCB, (byte)0xF2,
187             (byte)0x39, (byte)0x88, (byte)0xFD, (byte)0x76, (byte)0x9F, (byte)0x59, (byte)0xA0,
188             (byte)0x76, (byte)0x39, (byte)0xEC, (byte)0x4E, (byte)0xBB, (byte)0xCF, (byte)0x20,
189             (byte)0x3A, (byte)0xBA, (byte)0x2C, (byte)0x2F, (byte)0x83, (byte)0xD2, (byte)0x73,
190             (byte)0x90, (byte)0xFB, (byte)0x0D, (byte)0x82, (byte)0x87, (byte)0xC9, (byte)0xE4,
191             (byte)0xB4, (byte)0xFB, (byte)0x1C, (byte)0x02
192     };
193 
194     private static final byte[] gsm7BitTestNoPaddingUmts = {
195             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x40,
196 
197             (byte)0x01,
198 
199             (byte)0x41, (byte)0xD0, (byte)0x71, (byte)0xDA, (byte)0x04, (byte)0x91,
200             (byte)0xCB, (byte)0xE6, (byte)0x70, (byte)0x9D, (byte)0x4D, (byte)0x07,
201             (byte)0x85, (byte)0xD9, (byte)0x70, (byte)0x74, (byte)0x58, (byte)0x5C,
202             (byte)0xA6, (byte)0x83, (byte)0xDA, (byte)0xE5, (byte)0xF9, (byte)0x3C,
203             (byte)0x7C, (byte)0x2E, (byte)0x83, (byte)0xC4, (byte)0xE5, (byte)0xB4,
204             (byte)0xFB, (byte)0x0C, (byte)0x2A, (byte)0xE3, (byte)0xC3, (byte)0x63,
205             (byte)0x3A, (byte)0x3B, (byte)0x0F, (byte)0xCA, (byte)0xCD, (byte)0x40,
206             (byte)0x63, (byte)0x74, (byte)0x58, (byte)0x1E, (byte)0x1E, (byte)0xD3,
207             (byte)0xCB, (byte)0xF2, (byte)0x39, (byte)0x88, (byte)0xFD, (byte)0x76,
208             (byte)0x9F, (byte)0x59, (byte)0xA0, (byte)0x76, (byte)0x39, (byte)0xEC,
209             (byte)0x4E, (byte)0xBB, (byte)0xCF, (byte)0x20, (byte)0x3A, (byte)0xBA,
210             (byte)0x2C, (byte)0x2F, (byte)0x83, (byte)0xD2, (byte)0x73, (byte)0x90,
211             (byte)0xFB, (byte)0x0D, (byte)0x82, (byte)0x87, (byte)0xC9, (byte)0xE4,
212             (byte)0xB4, (byte)0xFB, (byte)0x1C, (byte)0x02,
213 
214             (byte)0x52
215     };
216 
217     private static final byte[] gsm7BitTestWithLanguage = {
218             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x04, (byte)0x11, (byte)0x41,
219             (byte)0xD0, (byte)0x71, (byte)0xDA, (byte)0x04, (byte)0x91, (byte)0xCB, (byte)0xE6,
220             (byte)0x70, (byte)0x9D, (byte)0x4D, (byte)0x07, (byte)0x85, (byte)0xD9, (byte)0x70,
221             (byte)0x74, (byte)0x58, (byte)0x5C, (byte)0xA6, (byte)0x83, (byte)0xDA, (byte)0xE5,
222             (byte)0xF9, (byte)0x3C, (byte)0x7C, (byte)0x2E, (byte)0x83, (byte)0xEE, (byte)0x69,
223             (byte)0x3A, (byte)0x1A, (byte)0x34, (byte)0x0E, (byte)0xCB, (byte)0xE5, (byte)0xE9,
224             (byte)0xF0, (byte)0xB9, (byte)0x0C, (byte)0x92, (byte)0x97, (byte)0xE9, (byte)0x75,
225             (byte)0xB9, (byte)0x1B, (byte)0x04, (byte)0x0F, (byte)0x93, (byte)0xC9, (byte)0x69,
226             (byte)0xF7, (byte)0xB9, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
227             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
228             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
229             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
230             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00
231     };
232 
233     private static final byte[] gsm7BitTestWithLanguageInBody = {
234             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x10, (byte)0x11, (byte)0x73,
235             (byte)0x7B, (byte)0x23, (byte)0x08, (byte)0x3A, (byte)0x4E, (byte)0x9B, (byte)0x20,
236             (byte)0x72, (byte)0xD9, (byte)0x1C, (byte)0xAE, (byte)0xB3, (byte)0xE9, (byte)0xA0,
237             (byte)0x30, (byte)0x1B, (byte)0x8E, (byte)0x0E, (byte)0x8B, (byte)0xCB, (byte)0x74,
238             (byte)0x50, (byte)0xBB, (byte)0x3C, (byte)0x9F, (byte)0x87, (byte)0xCF, (byte)0x65,
239             (byte)0xD0, (byte)0x3D, (byte)0x4D, (byte)0x47, (byte)0x83, (byte)0xC6, (byte)0x61,
240             (byte)0xB9, (byte)0x3C, (byte)0x1D, (byte)0x3E, (byte)0x97, (byte)0x41, (byte)0xF2,
241             (byte)0x32, (byte)0xBD, (byte)0x2E, (byte)0x77, (byte)0x83, (byte)0xE0, (byte)0x61,
242             (byte)0x32, (byte)0x39, (byte)0xED, (byte)0x3E, (byte)0x37, (byte)0x1A, (byte)0x8D,
243             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
244             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
245             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
246             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00
247     };
248 
249     private static final byte[] gsm7BitTestWithLanguageInBodyUmts = {
250             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x10,
251 
252             (byte)0x01,
253 
254             (byte)0x73, (byte)0x7B, (byte)0x23, (byte)0x08, (byte)0x3A, (byte)0x4E,
255             (byte)0x9B, (byte)0x20, (byte)0x72, (byte)0xD9, (byte)0x1C, (byte)0xAE,
256             (byte)0xB3, (byte)0xE9, (byte)0xA0, (byte)0x30, (byte)0x1B, (byte)0x8E,
257             (byte)0x0E, (byte)0x8B, (byte)0xCB, (byte)0x74, (byte)0x50, (byte)0xBB,
258             (byte)0x3C, (byte)0x9F, (byte)0x87, (byte)0xCF, (byte)0x65, (byte)0xD0,
259             (byte)0x3D, (byte)0x4D, (byte)0x47, (byte)0x83, (byte)0xC6, (byte)0x61,
260             (byte)0xB9, (byte)0x3C, (byte)0x1D, (byte)0x3E, (byte)0x97, (byte)0x41,
261             (byte)0xF2, (byte)0x32, (byte)0xBD, (byte)0x2E, (byte)0x77, (byte)0x83,
262             (byte)0xE0, (byte)0x61, (byte)0x32, (byte)0x39, (byte)0xED, (byte)0x3E,
263             (byte)0x37, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3, (byte)0xD1,
264             (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46, (byte)0xA3,
265             (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D, (byte)0x46,
266             (byte)0xA3, (byte)0xD1, (byte)0x68, (byte)0x34, (byte)0x1A, (byte)0x8D,
267             (byte)0x46, (byte)0xA3, (byte)0xD1, (byte)0x00,
268 
269             (byte)0x37
270     };
271 
272     private static final byte[] gsmUcs2Test = {
273             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x48, (byte)0x11, (byte)0x00,
274             (byte)0x41, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x55, (byte)0x00, (byte)0x43,
275             (byte)0x00, (byte)0x53, (byte)0x00, (byte)0x32, (byte)0x00, (byte)0x20, (byte)0x00,
276             (byte)0x6D, (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x73,
277             (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x65, (byte)0x00,
278             (byte)0x20, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x6F, (byte)0x00, (byte)0x6E,
279             (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x69, (byte)0x00,
280             (byte)0x6E, (byte)0x00, (byte)0x69, (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x67,
281             (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x20, (byte)0x04,
282             (byte)0x34, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x68,
283             (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x72, (byte)0x00, (byte)0x61, (byte)0x00,
284             (byte)0x63, (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x72,
285             (byte)0x00, (byte)0x0D, (byte)0x00, (byte)0x0D
286     };
287 
288     private static final byte[] gsmUcs2TestUmts = {
289             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x48,
290 
291             (byte)0x01,
292 
293             (byte)0x00, (byte)0x41, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x55,
294             (byte)0x00, (byte)0x43, (byte)0x00, (byte)0x53, (byte)0x00, (byte)0x32,
295             (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x6D, (byte)0x00, (byte)0x65,
296             (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x61,
297             (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x20,
298             (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x6F, (byte)0x00, (byte)0x6E,
299             (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x69,
300             (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x69, (byte)0x00, (byte)0x6E,
301             (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x61,
302             (byte)0x00, (byte)0x20, (byte)0x04, (byte)0x34, (byte)0x00, (byte)0x20,
303             (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x68, (byte)0x00, (byte)0x61,
304             (byte)0x00, (byte)0x72, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x63,
305             (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x72,
306             (byte)0x00, (byte)0x0D, (byte)0x00, (byte)0x0D,
307 
308             (byte)0x4E
309     };
310 
311     private static final byte[] gsmUcs2TestMultipageUmts = {
312             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x48,
313 
314             (byte)0x02,
315 
316             (byte)0x00, (byte)0x41, (byte)0x00, (byte)0x41, (byte)0x00, (byte)0x41,
317             (byte)0x00, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
318             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
319             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
320             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
321             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
322             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
323             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
324             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
325             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
326             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
327             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
328             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
329             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
330 
331             (byte)0x06,
332 
333             (byte)0x00, (byte)0x42, (byte)0x00, (byte)0x42, (byte)0x00, (byte)0x42,
334             (byte)0x00, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
335             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
336             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
337             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
338             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
339             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
340             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
341             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
342             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
343             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
344             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
345             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
346             (byte)0x0D, (byte)0x0D, (byte)0x0D, (byte)0x0D,
347 
348             (byte)0x06
349     };
350 
351     private static final byte[] gsmUcs2TestWithLanguageInBody = {
352             (byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x11, (byte)0x11, (byte)0x78,
353             (byte)0x3C, (byte)0x00, (byte)0x41, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x55,
354             (byte)0x00, (byte)0x43, (byte)0x00, (byte)0x53, (byte)0x00, (byte)0x32, (byte)0x00,
355             (byte)0x20, (byte)0x00, (byte)0x6D, (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x73,
356             (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x67, (byte)0x00,
357             (byte)0x65, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x6F,
358             (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x61, (byte)0x00,
359             (byte)0x69, (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x69, (byte)0x00, (byte)0x6E,
360             (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x61, (byte)0x00,
361             (byte)0x20, (byte)0x04, (byte)0x34, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x63,
362             (byte)0x00, (byte)0x68, (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x72, (byte)0x00,
363             (byte)0x61, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x65,
364             (byte)0x00, (byte)0x72, (byte)0x00, (byte)0x0D
365     };
366 
367     private static final byte[] gsmUcs2TestWithLanguageInBodyUmts = {
368             (byte)0x01, (byte)0x00, (byte)0x01, (byte)0xC0, (byte)0x00, (byte)0x11,
369 
370             (byte)0x01,
371 
372             (byte)0x78, (byte)0x3C, (byte)0x00, (byte)0x41, (byte)0x00, (byte)0x20,
373             (byte)0x00, (byte)0x55, (byte)0x00, (byte)0x43, (byte)0x00, (byte)0x53,
374             (byte)0x00, (byte)0x32, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x6D,
375             (byte)0x00, (byte)0x65, (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x73,
376             (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x65,
377             (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x6F,
378             (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x61,
379             (byte)0x00, (byte)0x69, (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x69,
380             (byte)0x00, (byte)0x6E, (byte)0x00, (byte)0x67, (byte)0x00, (byte)0x20,
381             (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x20, (byte)0x04, (byte)0x34,
382             (byte)0x00, (byte)0x20, (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x68,
383             (byte)0x00, (byte)0x61, (byte)0x00, (byte)0x72, (byte)0x00, (byte)0x61,
384             (byte)0x00, (byte)0x63, (byte)0x00, (byte)0x74, (byte)0x00, (byte)0x65,
385             (byte)0x00, (byte)0x72, (byte)0x00, (byte)0x0D,
386 
387             (byte)0x50
388     };
389 
390     private static final SmsCbLocation sEmptyLocation = new SmsCbLocation();
391 
createFromPdu(Context context, byte[] pdu, int serialNumber, int category)392     private static SmsCbMessage createFromPdu(Context context, byte[] pdu, int serialNumber,
393                                               int category) {
394         byte[][] pdus = new byte[1][];
395         pdus[0] = pdu;
396         return createFromPdus(context, pdus, serialNumber, category);
397     }
398 
createFromPdus(Context context, byte[][] pdus, int serialNumber, int category)399     private static SmsCbMessage createFromPdus(Context context, byte[][] pdus, int serialNumber,
400                                                int category) {
401         try {
402             for (byte[] pdu : pdus) {
403                 if (pdu.length <= 88) {
404                     // GSM format cell broadcast
405                     Log.d(TAG, "setting GSM serial number to " + serialNumber);
406                     pdu[0] = (byte) ((serialNumber >>> 8) & 0xff);
407                     pdu[1] = (byte) (serialNumber & 0xff);
408                     if (category != 0) {
409                         Log.d(TAG, "setting GSM message identifier to " + category);
410                         pdu[2] = (byte) ((category >>> 8) & 0xff);
411                         pdu[3] = (byte) (category & 0xff);
412                     }
413                 } else {
414                     // UMTS format cell broadcast
415                     Log.d(TAG, "setting UMTS serial number to " + serialNumber);
416                     pdu[3] = (byte) ((serialNumber >>> 8) & 0xff);
417                     pdu[4] = (byte) (serialNumber & 0xff);
418                     if (category != 0) {
419                         Log.d(TAG, "setting UMTS message identifier to " + category);
420                         pdu[1] = (byte) ((category >>> 8) & 0xff);
421                         pdu[2] = (byte) (category & 0xff);
422                     }
423                 }
424             }
425             return GsmSmsCbMessage.createSmsCbMessage(context, new SmsCbHeader(pdus[0]),
426                     sEmptyLocation, pdus);
427         } catch (IllegalArgumentException e) {
428             return null;
429         }
430     }
431 
sendBroadcast(Activity activity, int serialNumber, int category, byte[] pdu)432     private static void sendBroadcast(Activity activity, int serialNumber, int category,
433                                       byte[] pdu) {
434         Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
435         intent.putExtra("message", createFromPdu(activity, pdu, serialNumber, category));
436         intent.setPackage(CB_RECEIVER_PKG);
437         activity.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.RECEIVE_SMS,
438                 AppOpsManager.OP_RECEIVE_SMS, null, null, Activity.RESULT_OK, null, null);
439     }
440 
testSendMessage7bit(Activity activity, int serialNumber, int category)441     public static void testSendMessage7bit(Activity activity, int serialNumber,
442             int category) {
443         sendBroadcast(activity, serialNumber, category, gsm7BitTest);
444     }
445 
testSendMessage7bitUmts(Activity activity, int serialNumber, int category)446     public static void testSendMessage7bitUmts(Activity activity, int serialNumber,
447             int category) {
448         sendBroadcast(activity, serialNumber, category, gsm7BitTestUmts);
449     }
450 
testSendMessage7bitNoPadding(Activity activity, int serialNumber, int category)451     public static void testSendMessage7bitNoPadding(Activity activity, int serialNumber,
452             int category) {
453         sendBroadcast(activity, serialNumber, category, gsm7BitTestNoPadding);
454     }
455 
testSendMessage7bitNoPaddingUmts(Activity activity, int serialNumber, int category)456     public static void testSendMessage7bitNoPaddingUmts(Activity activity, int serialNumber,
457             int category) {
458         sendBroadcast(activity, serialNumber, category, gsm7BitTestNoPaddingUmts);
459     }
460 
testSendMessage7bitMultipageGsm(Activity activity, int serialNumber, int category)461     public static void testSendMessage7bitMultipageGsm(Activity activity, int serialNumber,
462             int category) {
463         Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
464         byte[][] pdus = new byte[2][];
465         pdus[0] = gsm7BitTestMultipage1;
466         pdus[1] = gsm7BitTestMultipage2;
467         intent.putExtra("message", createFromPdus(activity, pdus, serialNumber, category));
468         intent.setPackage(CB_RECEIVER_PKG);
469         activity.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.RECEIVE_SMS,
470                 AppOpsManager.OP_RECEIVE_SMS, null, null, Activity.RESULT_OK, null, null);
471     }
472 
testSendMessage7bitMultipageUmts(Activity activity, int serialNumber, int category)473     public static void testSendMessage7bitMultipageUmts(Activity activity, int serialNumber,
474             int category) {
475         sendBroadcast(activity, serialNumber, category, gsm7BitTestMultipageUmts);
476     }
477 
testSendMessage7bitWithLanguage(Activity activity, int serialNumber, int category)478     public static void testSendMessage7bitWithLanguage(Activity activity, int serialNumber,
479             int category) {
480         sendBroadcast(activity, serialNumber, category, gsm7BitTestWithLanguage);
481     }
482 
testSendMessage7bitWithLanguageInBody(Activity activity, int serialNumber, int category)483     public static void testSendMessage7bitWithLanguageInBody(Activity activity, int serialNumber,
484             int category) {
485         sendBroadcast(activity, serialNumber, category, gsm7BitTestWithLanguageInBody);
486     }
487 
testSendMessage7bitWithLanguageInBodyUmts(Activity activity, int serialNumber, int category)488     public static void testSendMessage7bitWithLanguageInBodyUmts(Activity activity,
489             int serialNumber, int category) {
490         sendBroadcast(activity, serialNumber, category, gsm7BitTestWithLanguageInBodyUmts);
491     }
492 
testSendMessageUcs2(Activity activity, int serialNumber, int category)493     public static void testSendMessageUcs2(Activity activity, int serialNumber,
494             int category) {
495         sendBroadcast(activity, serialNumber, category, gsmUcs2Test);
496     }
497 
testSendMessageUcs2Umts(Activity activity, int serialNumber, int category)498     public static void testSendMessageUcs2Umts(Activity activity, int serialNumber,
499             int category) {
500         sendBroadcast(activity, serialNumber, category, gsmUcs2TestUmts);
501     }
502 
testSendMessageUcs2MultipageUmts(Activity activity, int serialNumber, int category)503     public static void testSendMessageUcs2MultipageUmts(Activity activity, int serialNumber,
504             int category) {
505         sendBroadcast(activity, serialNumber, category, gsmUcs2TestMultipageUmts);
506     }
507 
testSendMessageUcs2WithLanguageInBody(Activity activity, int serialNumber, int category)508     public static void testSendMessageUcs2WithLanguageInBody(Activity activity, int serialNumber,
509             int category) {
510         sendBroadcast(activity, serialNumber, category, gsmUcs2TestWithLanguageInBody);
511     }
512 
testSendMessageUcs2WithLanguageUmts(Activity activity, int serialNumber, int category)513     public static void testSendMessageUcs2WithLanguageUmts(Activity activity, int serialNumber,
514             int category) {
515         sendBroadcast(activity, serialNumber, category, gsmUcs2TestWithLanguageInBodyUmts);
516     }
517 
testSendEtwsMessageEarthquake(Activity activity, int serialNumber)518     public static void testSendEtwsMessageEarthquake(Activity activity, int serialNumber) {
519         sendBroadcast(activity, serialNumber, SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING,
520                 etwsMessageNormal);
521     }
522 
testSendEtwsMessageTsunami(Activity activity, int serialNumber)523     public static void testSendEtwsMessageTsunami(Activity activity, int serialNumber) {
524         sendBroadcast(activity, serialNumber, SmsCbConstants.MESSAGE_ID_ETWS_TSUNAMI_WARNING,
525                 etwsMessageNormal);
526     }
527 
testSendEtwsMessageEarthquakeTsunami(Activity activity, int serialNumber)528     public static void testSendEtwsMessageEarthquakeTsunami(Activity activity, int serialNumber) {
529         sendBroadcast(activity, serialNumber,
530                 SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING, etwsMessageNormal);
531     }
532 
testSendEtwsMessageOther(Activity activity, int serialNumber)533     public static void testSendEtwsMessageOther(Activity activity, int serialNumber) {
534         sendBroadcast(activity, serialNumber, SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE,
535                 etwsMessageNormal);
536     }
537 
testSendEtwsMessageCancel(Activity activity, int serialNumber)538     public static void testSendEtwsMessageCancel(Activity activity, int serialNumber) {
539         sendBroadcast(activity, serialNumber, 0, etwsMessageCancel);
540     }
541 
testSendEtwsMessageTest(Activity activity, int serialNumber)542     public static void testSendEtwsMessageTest(Activity activity, int serialNumber) {
543         sendBroadcast(activity, serialNumber, SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE,
544                 etwsMessageTest);
545     }
546 }