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