/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.Manifest; import android.app.Activity; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; import android.os.Message; import android.provider.Telephony; import android.telephony.SubscriptionManager; import android.telephony.SmsCbMessage; /** * Dispatch new Cell Broadcasts to receivers. Acquires a private wakelock until the broadcast * completes and our result receiver is called. */ public class CellBroadcastHandler extends WakeLockStateMachine { private CellBroadcastHandler(Context context, PhoneBase phone) { this("CellBroadcastHandler", context, phone); } protected CellBroadcastHandler(String debugTag, Context context, PhoneBase phone) { super(debugTag, context, phone); } /** * Create a new CellBroadcastHandler. * @param context the context to use for dispatching Intents * @return the new handler */ public static CellBroadcastHandler makeCellBroadcastHandler(Context context, PhoneBase phone) { CellBroadcastHandler handler = new CellBroadcastHandler(context, phone); handler.start(); return handler; } /** * Handle Cell Broadcast messages from {@code CdmaInboundSmsHandler}. * 3GPP-format Cell Broadcast messages sent from radio are handled in the subclass. * * @param message the message to process * @return true if an ordered broadcast was sent; false on failure */ @Override protected boolean handleSmsMessage(Message message) { if (message.obj instanceof SmsCbMessage) { handleBroadcastSms((SmsCbMessage) message.obj); return true; } else { loge("handleMessage got object of type: " + message.obj.getClass().getName()); return false; } } /** * Dispatch a Cell Broadcast message to listeners. * @param message the Cell Broadcast to broadcast */ protected void handleBroadcastSms(SmsCbMessage message) { String receiverPermission; int appOp; Intent intent; if (message.isEmergencyMessage()) { log("Dispatching emergency SMS CB"); intent = new Intent(Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); receiverPermission = Manifest.permission.RECEIVE_EMERGENCY_BROADCAST; appOp = AppOpsManager.OP_RECEIVE_EMERGECY_SMS; } else { log("Dispatching SMS CB"); intent = new Intent(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION); receiverPermission = Manifest.permission.RECEIVE_SMS; appOp = AppOpsManager.OP_RECEIVE_SMS; } intent.putExtra("message", message); SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId()); mContext.sendOrderedBroadcast(intent, receiverPermission, appOp, mReceiver, getHandler(), Activity.RESULT_OK, null, null); } }