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;
2200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.content.SharedPreferences;
238524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.content.pm.PackageManager;
2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.RemoteException;
2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.ServiceManager;
268524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.os.UserHandle;
2700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.preference.PreferenceManager;
2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.provider.Telephony;
298524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.telephony.CellBroadcastMessage;
303500edaa3e297762f096fb84af9c83a2b12ff7deJake Hambyimport android.telephony.ServiceState;
3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.TelephonyManager;
3200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.cdma.CdmaSmsCbProgramData;
3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log;
3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.ITelephony;
3600b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.SmsEnvelope;
370a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinheimport com.android.internal.telephony.TelephonyIntents;
3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastReceiver extends BroadcastReceiver {
4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final String TAG = "CellBroadcastReceiver";
4100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    static final boolean DBG = true;    // STOPSHIP: change to false before ship
420a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe    private int mServiceState = -1;
438524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby    private static final String GET_LATEST_CB_AREA_INFO_ACTION =
448524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            "android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO";
458524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby
4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    @Override
4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void onReceive(Context context, Intent intent) {
4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        onReceiveWithPrivilege(context, intent, false);
4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
52da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby        if (DBG) log("onReceive " + intent);
5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        String action = intent.getAction();
5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
560a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe        if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) {
570a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe            if (DBG) log("Intent ACTION_SERVICE_STATE_CHANGED");
580a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe            ServiceState serviceState = ServiceState.newFromBundle(intent.getExtras());
590a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe            int newState = serviceState.getState();
600a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe            if (newState != mServiceState) {
610a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe                Log.d(TAG, "Service state changed! " + newState + " Full: " + serviceState +
620a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe                        " Current state=" + mServiceState);
630a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe                mServiceState = newState;
640224babc0bec527dd7e44babb2cd644836f8e1fbxinhe                if (((newState == ServiceState.STATE_IN_SERVICE) ||
650224babc0bec527dd7e44babb2cd644836f8e1fbxinhe                        (newState == ServiceState.STATE_EMERGENCY_ONLY)) &&
660224babc0bec527dd7e44babb2cd644836f8e1fbxinhe                        (UserHandle.myUserId() == UserHandle.USER_OWNER)) {
670a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe                    startConfigService(context.getApplicationContext());
680a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe                }
690a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe            }
7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) ||
7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) {
7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // If 'privileged' is false, it means that the intent was delivered to the base
7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // no-permissions receiver class.  If we get an SMS_CB_RECEIVED message that way, it
7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // means someone has tried to spoof the message by delivering it outside the normal
7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // permission-checked route, so we just ignore it.
7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (privileged) {
7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                intent.setClass(context, CellBroadcastAlertService.class);
7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                context.startService(intent);
7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            } else {
80a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks                loge("ignoring unprivileged action received " + action);
8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
8200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        } else if (Telephony.Sms.Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION
8300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                .equals(action)) {
8400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            if (privileged) {
85e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                CdmaSmsCbProgramData[] programDataList = (CdmaSmsCbProgramData[])
86e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        intent.getParcelableArrayExtra("program_data_list");
87e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                if (programDataList != null) {
88e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    handleCdmaSmsCbProgramData(context, programDataList);
89e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                } else {
90a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks                    loge("SCPD intent received with no program_data_list");
9100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                }
9200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            } else {
93a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks                loge("ignoring unprivileged action received " + action);
9400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            }
958524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby        } else if (GET_LATEST_CB_AREA_INFO_ACTION.equals(action)) {
968524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            if (privileged) {
978524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                CellBroadcastMessage message = CellBroadcastReceiverApp.getLatestAreaInfo();
988524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                if (message != null) {
998524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    Intent areaInfoIntent = new Intent(
1008524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                            CellBroadcastAlertService.CB_AREA_INFO_RECEIVED_ACTION);
1018524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    areaInfoIntent.putExtra("message", message);
1028524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    context.sendBroadcastAsUser(areaInfoIntent, UserHandle.ALL,
1038524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                            android.Manifest.permission.READ_PHONE_STATE);
1048524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                }
1058524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            } else {
1068524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                Log.e(TAG, "caller missing READ_PHONE_STATE permission, returning");
1078524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            }
10850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else {
10950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "onReceive() unexpected action " + action);
11050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
11150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
11250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
11350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
114e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * Handle Service Category Program Data message.
115e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * TODO: Send Service Category Program Results response message to sender
11600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     *
117e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * @param context
118e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * @param programDataList
11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     */
120e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl    private void handleCdmaSmsCbProgramData(Context context,
121e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl            CdmaSmsCbProgramData[] programDataList) {
12200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        for (CdmaSmsCbProgramData programData : programDataList) {
12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            switch (programData.getOperation()) {
12400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY:
125e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    tryCdmaSetCategory(context, programData.getCategory(), true);
12600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
12700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
12800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY:
129e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    tryCdmaSetCategory(context, programData.getCategory(), false);
13000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
13100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
13200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_CLEAR_CATEGORIES:
13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, false);
13500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, false);
13700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, false);
13900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
14000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, false);
14100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
14200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
14300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                default:
144a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks                    loge("Ignoring unknown SCPD operation " + programData.getOperation());
14500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            }
14600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        }
14721f2b9ac08ca93cee099292ba597b9a45e846030Jake Hamby    }
14800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
149e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl    private void tryCdmaSetCategory(Context context, int category, boolean enable) {
150e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
151e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl
15200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        switch (category) {
15300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT:
154e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
155e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, enable)
156e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        .apply();
15700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
15800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
15900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT:
160e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
161e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, enable)
162e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        .apply();
16300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
16400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY:
166e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
167e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, enable).apply();
16800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
16900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
17000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE:
171e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
172e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, enable).apply();
17300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
17400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
17500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            default:
176e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                Log.w(TAG, "Ignoring SCPD command to " + (enable ? "enable" : "disable")
177e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        + " alerts in category " + category);
17800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        }
17900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
18000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
18100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    /**
18250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * Tell {@link CellBroadcastConfigService} to enable the CB channels.
18350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @param context the broadcast receiver context
18450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
18550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    static void startConfigService(Context context) {
186a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks        Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS,
187a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks                null, context, CellBroadcastConfigService.class);
188a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks        context.startService(serviceIntent);
18950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
19050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
19150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
19250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @return true if the phone is a CDMA phone type
19350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
194a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks    static boolean phoneIsCdma() {
19550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        boolean isCdma = false;
19650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        try {
19750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
19850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (phone != null) {
19950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                isCdma = (phone.getActivePhoneType() == TelephonyManager.PHONE_TYPE_CDMA);
20050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
20150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } catch (RemoteException e) {
20250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "phone.getActivePhoneType() failed", e);
20350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
20450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        return isCdma;
20550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
206da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby
207da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby    private static void log(String msg) {
208da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby        Log.d(TAG, msg);
209da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby    }
210a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks
211a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks    private static void loge(String msg) {
212a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks        Log.e(TAG, msg);
213a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks    }
21450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby}
215