10d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/* 20d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Copyright (C) 2013 The Android Open Source Project 30d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 40d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 50d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * you may not use this file except in compliance with the License. 60d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * You may obtain a copy of the License at 70d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 80d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 90d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 100d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Unless required by applicable law or agreed to in writing, software 110d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 120d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * See the License for the specific language governing permissions and 140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * limitations under the License. 150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 160d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 170d4bcdf379842af4b6304809156971e926f374f0Jake Hambypackage com.android.internal.telephony; 180d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 190d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.Manifest; 200d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.app.Activity; 210d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.app.AppOpsManager; 220d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.content.Context; 230d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.content.Intent; 240d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.os.Message; 25feca8c8380d1109bac5101cb85e66e1789352d2bxinheimport android.os.UserHandle; 260d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.provider.Telephony; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager; 280d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.telephony.SmsCbMessage; 290d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 300d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/** 310d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Dispatch new Cell Broadcasts to receivers. Acquires a private wakelock until the broadcast 320d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * completes and our result receiver is called. 330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 340d4bcdf379842af4b6304809156971e926f374f0Jake Hambypublic class CellBroadcastHandler extends WakeLockStateMachine { 350d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 36fce951e90d421ba2ab3da3f64d0f5192ab769e22Sukanya Rajkhowa private CellBroadcastHandler(Context context, PhoneBase phone) { 37fce951e90d421ba2ab3da3f64d0f5192ab769e22Sukanya Rajkhowa this("CellBroadcastHandler", context, phone); 380d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 390d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 40d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville protected CellBroadcastHandler(String debugTag, Context context, PhoneBase phone) { 41d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super(debugTag, context, phone); 420d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 430d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 440d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 450d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Create a new CellBroadcastHandler. 460d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param context the context to use for dispatching Intents 470d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return the new handler 480d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 49fce951e90d421ba2ab3da3f64d0f5192ab769e22Sukanya Rajkhowa public static CellBroadcastHandler makeCellBroadcastHandler(Context context, PhoneBase phone) { 50fce951e90d421ba2ab3da3f64d0f5192ab769e22Sukanya Rajkhowa CellBroadcastHandler handler = new CellBroadcastHandler(context, phone); 510d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handler.start(); 520d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return handler; 530d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 540d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 550d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Handle Cell Broadcast messages from {@code CdmaInboundSmsHandler}. 570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 3GPP-format Cell Broadcast messages sent from radio are handled in the subclass. 580d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 590d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param message the message to process 600d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return true if an ordered broadcast was sent; false on failure 610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected boolean handleSmsMessage(Message message) { 640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (message.obj instanceof SmsCbMessage) { 650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handleBroadcastSms((SmsCbMessage) message.obj); 660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return true; 670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else { 680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby loge("handleMessage got object of type: " + message.obj.getClass().getName()); 690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return false; 700d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 710d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Dispatch a Cell Broadcast message to listeners. 750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param message the Cell Broadcast to broadcast 760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void handleBroadcastSms(SmsCbMessage message) { 780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby String receiverPermission; 790d4bcdf379842af4b6304809156971e926f374f0Jake Hamby int appOp; 8022f63e1953ccb581cb89585e4ab77eda185c1897xinhe 810d4bcdf379842af4b6304809156971e926f374f0Jake Hamby Intent intent; 820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (message.isEmergencyMessage()) { 8322f63e1953ccb581cb89585e4ab77eda185c1897xinhe log("Dispatching emergency SMS CB, SmsCbMessage is: " + message); 840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby receiverPermission = Manifest.permission.RECEIVE_EMERGENCY_BROADCAST; 860d4bcdf379842af4b6304809156971e926f374f0Jake Hamby appOp = AppOpsManager.OP_RECEIVE_EMERGECY_SMS; 870d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else { 8822f63e1953ccb581cb89585e4ab77eda185c1897xinhe log("Dispatching SMS CB, SmsCbMessage is: " + message); 890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent = new Intent(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION); 900d4bcdf379842af4b6304809156971e926f374f0Jake Hamby receiverPermission = Manifest.permission.RECEIVE_SMS; 910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby appOp = AppOpsManager.OP_RECEIVE_SMS; 920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 930d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent.putExtra("message", message); 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId()); 95feca8c8380d1109bac5101cb85e66e1789352d2bxinhe mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, receiverPermission, appOp, 96feca8c8380d1109bac5101cb85e66e1789352d2bxinhe mReceiver, getHandler(), Activity.RESULT_OK, null, null); 970d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 980d4bcdf379842af4b6304809156971e926f374f0Jake Hamby} 99