150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/*
250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Copyright (C) 2011 The Android Open Source Project
350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * you may not use this file except in compliance with the License.
650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * You may obtain a copy of the License at
750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
1050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Unless required by applicable law or agreed to in writing, software
1150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
1250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * See the License for the specific language governing permissions and
1450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * limitations under the License.
1550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */
1650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
1750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypackage com.android.cellbroadcastreceiver;
1850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
1950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.BroadcastReceiver;
2050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Context;
2150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent;
2250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.RemoteException;
2350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.ServiceManager;
2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.provider.Telephony;
2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.TelephonyManager;
2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log;
2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.ITelephony;
2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastReceiver extends BroadcastReceiver {
3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final String TAG = "CellBroadcastReceiver";
3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    static final boolean DBG = true;    // TODO: change to false before ship
3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    @Override
3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void onReceive(Context context, Intent intent) {
3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        onReceiveWithPrivilege(context, intent, false);
3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (DBG) Log.d(TAG, "onReceive " + intent);
4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        String action = intent.getAction();
4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            startConfigService(context);
4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            boolean airplaneModeOn = intent.getBooleanExtra("state", false);
4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (!airplaneModeOn) {
4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                startConfigService(context);
5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) ||
5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) {
5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // If 'privileged' is false, it means that the intent was delivered to the base
5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // no-permissions receiver class.  If we get an SMS_CB_RECEIVED message that way, it
5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // means someone has tried to spoof the message by delivering it outside the normal
5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // permission-checked route, so we just ignore it.
5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (privileged) {
5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                intent.setClass(context, CellBroadcastAlertService.class);
5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                context.startService(intent);
6050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            } else {
6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Log.e(TAG, "ignoring unprivileged action received " + action);
6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else {
6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "onReceive() unexpected action " + action);
6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * Tell {@link CellBroadcastConfigService} to enable the CB channels.
7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @param context the broadcast receiver context
7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    static void startConfigService(Context context) {
7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (phoneIsCdma()) {
7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.d(TAG, "CDMA phone detected; doing nothing");
7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else {
7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS,
7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    null, context, CellBroadcastConfigService.class);
7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            context.startService(serviceIntent);
7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
8050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
8250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
8350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @return true if the phone is a CDMA phone type
8450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
8550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static boolean phoneIsCdma() {
8650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        boolean isCdma = false;
8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        try {
8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
8950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (phone != null) {
9050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                isCdma = (phone.getActivePhoneType() == TelephonyManager.PHONE_TYPE_CDMA);
9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } catch (RemoteException e) {
9350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "phone.getActivePhoneType() failed", e);
9450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        return isCdma;
9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
9750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby}
98