CellBroadcastHandler.java revision d2feaf918ab0c1173d4ada182532e48d0c0d3f77
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; 250d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.provider.Telephony; 260d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.telephony.SmsCbMessage; 270d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 280d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/** 290d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Dispatch new Cell Broadcasts to receivers. Acquires a private wakelock until the broadcast 300d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * completes and our result receiver is called. 310d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 320d4bcdf379842af4b6304809156971e926f374f0Jake Hambypublic class CellBroadcastHandler extends WakeLockStateMachine { 330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 340d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private CellBroadcastHandler(Context context) { 35d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville this("CellBroadcastHandler", context, null); 360d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 370d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 38d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville protected CellBroadcastHandler(String debugTag, Context context, PhoneBase phone) { 39d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super(debugTag, context, phone); 400d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 410d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 420d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 430d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Create a new CellBroadcastHandler. 440d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param context the context to use for dispatching Intents 450d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return the new handler 460d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 470d4bcdf379842af4b6304809156971e926f374f0Jake Hamby public static CellBroadcastHandler makeCellBroadcastHandler(Context context) { 480d4bcdf379842af4b6304809156971e926f374f0Jake Hamby CellBroadcastHandler handler = new CellBroadcastHandler(context); 490d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handler.start(); 500d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return handler; 510d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 520d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 530d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 540d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Handle Cell Broadcast messages from {@code CdmaInboundSmsHandler}. 550d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 3GPP-format Cell Broadcast messages sent from radio are handled in the subclass. 560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param message the message to process 580d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return true if an ordered broadcast was sent; false on failure 590d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 600d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected boolean handleSmsMessage(Message message) { 620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (message.obj instanceof SmsCbMessage) { 630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handleBroadcastSms((SmsCbMessage) message.obj); 640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return true; 650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else { 660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby loge("handleMessage got object of type: " + message.obj.getClass().getName()); 670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return false; 680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 700d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 710d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Dispatch a Cell Broadcast message to listeners. 730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param message the Cell Broadcast to broadcast 740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void handleBroadcastSms(SmsCbMessage message) { 760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby String receiverPermission; 770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby int appOp; 780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby Intent intent; 790d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (message.isEmergencyMessage()) { 800d4bcdf379842af4b6304809156971e926f374f0Jake Hamby log("Dispatching emergency SMS CB"); 810d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby receiverPermission = Manifest.permission.RECEIVE_EMERGENCY_BROADCAST; 830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby appOp = AppOpsManager.OP_RECEIVE_EMERGECY_SMS; 840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else { 850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby log("Dispatching SMS CB"); 860d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent = new Intent(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION); 870d4bcdf379842af4b6304809156971e926f374f0Jake Hamby receiverPermission = Manifest.permission.RECEIVE_SMS; 880d4bcdf379842af4b6304809156971e926f374f0Jake Hamby appOp = AppOpsManager.OP_RECEIVE_SMS; 890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 900d4bcdf379842af4b6304809156971e926f374f0Jake Hamby intent.putExtra("message", message); 910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mContext.sendOrderedBroadcast(intent, receiverPermission, appOp, mReceiver, 920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby getHandler(), Activity.RESULT_OK, null, null); 930d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 940d4bcdf379842af4b6304809156971e926f374f0Jake Hamby} 95