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.PhoneStateListener;
313500edaa3e297762f096fb84af9c83a2b12ff7deJake Hambyimport android.telephony.ServiceState;
3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.TelephonyManager;
3300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.cdma.CdmaSmsCbProgramData;
3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log;
3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.ITelephony;
3700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.SmsEnvelope;
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
4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
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
5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
573500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            if (DBG) log("Registering for ServiceState updates");
583500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            TelephonyManager tm = (TelephonyManager) context.getSystemService(
593500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                    Context.TELEPHONY_SERVICE);
603500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            tm.listen(new ServiceStateListener(context.getApplicationContext()),
613500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                    PhoneStateListener.LISTEN_SERVICE_STATE);
6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            boolean airplaneModeOn = intent.getBooleanExtra("state", false);
6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (!airplaneModeOn) {
6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                startConfigService(context);
6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) ||
6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) {
6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // If 'privileged' is false, it means that the intent was delivered to the base
7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // no-permissions receiver class.  If we get an SMS_CB_RECEIVED message that way, it
7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // means someone has tried to spoof the message by delivering it outside the normal
7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            // permission-checked route, so we just ignore it.
7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (privileged) {
7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                intent.setClass(context, CellBroadcastAlertService.class);
7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                context.startService(intent);
7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            } else {
7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Log.e(TAG, "ignoring unprivileged action received " + action);
7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
7900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        } else if (Telephony.Sms.Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION
8000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                .equals(action)) {
8100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            if (privileged) {
82e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                CdmaSmsCbProgramData[] programDataList = (CdmaSmsCbProgramData[])
83e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        intent.getParcelableArrayExtra("program_data_list");
84e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                if (programDataList != null) {
85e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    handleCdmaSmsCbProgramData(context, programDataList);
86e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                } else {
87e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    Log.e(TAG, "SCPD intent received with no program_data_list");
8800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                }
8900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            } else {
9000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                Log.e(TAG, "ignoring unprivileged action received " + action);
9100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            }
928524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby        } else if (GET_LATEST_CB_AREA_INFO_ACTION.equals(action)) {
938524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            if (privileged) {
948524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                CellBroadcastMessage message = CellBroadcastReceiverApp.getLatestAreaInfo();
958524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                if (message != null) {
968524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    Intent areaInfoIntent = new Intent(
978524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                            CellBroadcastAlertService.CB_AREA_INFO_RECEIVED_ACTION);
988524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    areaInfoIntent.putExtra("message", message);
998524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                    context.sendBroadcastAsUser(areaInfoIntent, UserHandle.ALL,
1008524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                            android.Manifest.permission.READ_PHONE_STATE);
1018524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                }
1028524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            } else {
1038524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby                Log.e(TAG, "caller missing READ_PHONE_STATE permission, returning");
1048524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby            }
10550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else {
10650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "onReceive() unexpected action " + action);
10750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
10850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
10950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
11050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
111e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * Handle Service Category Program Data message.
112e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * TODO: Send Service Category Program Results response message to sender
11300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     *
114e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * @param context
115e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl     * @param programDataList
11600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby     */
117e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl    private void handleCdmaSmsCbProgramData(Context context,
118e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl            CdmaSmsCbProgramData[] programDataList) {
11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        for (CdmaSmsCbProgramData programData : programDataList) {
12000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            switch (programData.getOperation()) {
12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY:
122e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    tryCdmaSetCategory(context, programData.getCategory(), true);
12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
12400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
12500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY:
126e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                    tryCdmaSetCategory(context, programData.getCategory(), false);
12700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
12800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
12900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                case CdmaSmsCbProgramData.OPERATION_CLEAR_CATEGORIES:
13000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, false);
13200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, false);
13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, false);
13600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    tryCdmaSetCategory(context,
13700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                            SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, false);
13800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    break;
13900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
14000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                default:
14100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                    Log.e(TAG, "Ignoring unknown SCPD operation " + programData.getOperation());
14200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            }
14300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        }
14421f2b9ac08ca93cee099292ba597b9a45e846030Jake Hamby    }
14500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
146e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl    private void tryCdmaSetCategory(Context context, int category, boolean enable) {
147e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
148e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl
14900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        switch (category) {
15000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT:
151e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
152e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, enable)
153e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        .apply();
15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
15500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
15600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT:
157e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
158e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, enable)
159e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        .apply();
16000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
16100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY:
163e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
164e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, enable).apply();
16500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
16600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
16700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE:
168e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                sharedPrefs.edit().putBoolean(
169e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, enable).apply();
17000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby                break;
17100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
17200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby            default:
173e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                Log.w(TAG, "Ignoring SCPD command to " + (enable ? "enable" : "disable")
174e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl                        + " alerts in category " + category);
17500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby        }
17600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    }
17700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby
17800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby    /**
17950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * Tell {@link CellBroadcastConfigService} to enable the CB channels.
18050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @param context the broadcast receiver context
18150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
18250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    static void startConfigService(Context context) {
18350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (phoneIsCdma()) {
184da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby            if (DBG) log("CDMA phone detected; doing nothing");
18550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } else {
18650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS,
18750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    null, context, CellBroadcastConfigService.class);
18850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            context.startService(serviceIntent);
18950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
19050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
19150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
19250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /**
19350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     * @return true if the phone is a CDMA phone type
19450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby     */
19550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static boolean phoneIsCdma() {
19650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        boolean isCdma = false;
19750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        try {
19850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
19950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (phone != null) {
20050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                isCdma = (phone.getActivePhoneType() == TelephonyManager.PHONE_TYPE_CDMA);
20150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
20250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } catch (RemoteException e) {
20350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.w(TAG, "phone.getActivePhoneType() failed", e);
20450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
20550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        return isCdma;
20650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
207da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby
2083500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby    private static class ServiceStateListener extends PhoneStateListener {
2093500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        private final Context mContext;
2103500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        private int mServiceState = -1;
2113500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby
2123500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        ServiceStateListener(Context context) {
2133500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            mContext = context;
2143500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        }
2153500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby
2163500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        @Override
2173500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        public void onServiceStateChanged(ServiceState ss) {
2183500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            int newState = ss.getState();
2193500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            if (newState != mServiceState) {
2203500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                Log.d(TAG, "Service state changed! " + newState + " Full: " + ss);
2213500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                mServiceState = newState;
2223500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                if (newState == ServiceState.STATE_IN_SERVICE ||
2233500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                        newState == ServiceState.STATE_EMERGENCY_ONLY) {
2243500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                    startConfigService(mContext);
2253500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby                }
2263500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby            }
2273500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby        }
2283500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby    }
2293500edaa3e297762f096fb84af9c83a2b12ff7deJake Hamby
230da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby    private static void log(String msg) {
231da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby        Log.d(TAG, msg);
232da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby    }
23350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby}
234