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