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; 24c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport android.os.Bundle; 2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.RemoteException; 2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.ServiceManager; 278524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.os.UserHandle; 2800b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.preference.PreferenceManager; 2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.provider.Telephony; 308524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.telephony.CellBroadcastMessage; 313500edaa3e297762f096fb84af9c83a2b12ff7deJake Hambyimport android.telephony.ServiceState; 32c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport android.telephony.SubscriptionInfo; 33c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport android.telephony.SubscriptionManager; 3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.TelephonyManager; 3500b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.cdma.CdmaSmsCbProgramData; 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log; 37c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport com.android.internal.telephony.PhoneConstants; 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.ITelephony; 40c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport com.android.internal.telephony.IccCardConstants; 4100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.cdma.sms.SmsEnvelope; 420a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinheimport com.android.internal.telephony.TelephonyIntents; 43c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport com.android.internal.telephony.uicc.IccCardProxy; 44c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe 45c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padaweimport java.util.List; 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastReceiver extends BroadcastReceiver { 4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final String TAG = "CellBroadcastReceiver"; 49dd9555e7e5eb29852576197de1c61fa99007ba34Jack Yu static final boolean DBG = false; // STOPSHIP: change to false before ship 5075e70083cfaab821a3847b56e7cbb55c8283687aAmit Mahajan private static int mServiceState = -1; 518524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby private static final String GET_LATEST_CB_AREA_INFO_ACTION = 528524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby "android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO"; 538524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby 5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby @Override 5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void onReceive(Context context, Intent intent) { 5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby onReceiveWithPrivilege(context, intent, false); 5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) { 60da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby if (DBG) log("onReceive " + intent); 6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby String action = intent.getAction(); 6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 640a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) { 650a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe if (DBG) log("Intent ACTION_SERVICE_STATE_CHANGED"); 66c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe int subId = intent.getExtras().getInt(PhoneConstants.SUBSCRIPTION_KEY); 67c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe Log.d(TAG, "subscriptionId = " + subId); 68c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe if (!SubscriptionManager.isValidSubscriptionId(subId)) { 69c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe return; 70c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe } 710a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe ServiceState serviceState = ServiceState.newFromBundle(intent.getExtras()); 720a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe int newState = serviceState.getState(); 730a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe if (newState != mServiceState) { 740a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe Log.d(TAG, "Service state changed! " + newState + " Full: " + serviceState + 750a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe " Current state=" + mServiceState); 760a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe mServiceState = newState; 77c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe 780224babc0bec527dd7e44babb2cd644836f8e1fbxinhe if (((newState == ServiceState.STATE_IN_SERVICE) || 790224babc0bec527dd7e44babb2cd644836f8e1fbxinhe (newState == ServiceState.STATE_EMERGENCY_ONLY)) && 800224babc0bec527dd7e44babb2cd644836f8e1fbxinhe (UserHandle.myUserId() == UserHandle.USER_OWNER)) { 81c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe startConfigService(context.getApplicationContext(), subId); 82c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe } 83c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe } 84c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe } else if (IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED.equals(action)){ 85c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); 86c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus)) { 87c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe List<SubscriptionInfo> subscriptionInfoList = SubscriptionManager.from( 88c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe context).getActiveSubscriptionInfoList(); 89c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe if (subscriptionInfoList != null) { 90c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe for (SubscriptionInfo subInfo : subscriptionInfoList) { 91c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe startConfigService(context, subInfo.getSubscriptionId()); 92c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe } 930a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe } 940a2aef9d9ece08c4821f3eaf8208314af4d77dd0xinhe } 9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) || 9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) { 9750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // If 'privileged' is false, it means that the intent was delivered to the base 9850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // no-permissions receiver class. If we get an SMS_CB_RECEIVED message that way, it 9950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // means someone has tried to spoof the message by delivering it outside the normal 10050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // permission-checked route, so we just ignore it. 10150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (privileged) { 10250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby intent.setClass(context, CellBroadcastAlertService.class); 10350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby context.startService(intent); 10450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 105a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks loge("ignoring unprivileged action received " + action); 10650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 10700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } else if (Telephony.Sms.Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION 10800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .equals(action)) { 10900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (privileged) { 110e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl CdmaSmsCbProgramData[] programDataList = (CdmaSmsCbProgramData[]) 111e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl intent.getParcelableArrayExtra("program_data_list"); 112e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl if (programDataList != null) { 113c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe int subId = intent.getExtras().getInt(PhoneConstants.SUBSCRIPTION_KEY); 114c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe Log.d(TAG, "subscriptionId = " + subId); 115c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe handleCdmaSmsCbProgramData(context, programDataList, subId); 116e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl } else { 117a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks loge("SCPD intent received with no program_data_list"); 11800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } else { 120a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks loge("ignoring unprivileged action received " + action); 12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 1228524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby } else if (GET_LATEST_CB_AREA_INFO_ACTION.equals(action)) { 1238524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby if (privileged) { 1248524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby CellBroadcastMessage message = CellBroadcastReceiverApp.getLatestAreaInfo(); 1258524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby if (message != null) { 1268524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby Intent areaInfoIntent = new Intent( 1278524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby CellBroadcastAlertService.CB_AREA_INFO_RECEIVED_ACTION); 1288524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby areaInfoIntent.putExtra("message", message); 129141aca85bca75dd69830539594ac74115f966568Amit Mahajan // Send broadcast twice, once for apps that have PRIVILEGED permission and once 130141aca85bca75dd69830539594ac74115f966568Amit Mahajan // for those that have the runtime one 131141aca85bca75dd69830539594ac74115f966568Amit Mahajan context.sendBroadcastAsUser(areaInfoIntent, UserHandle.ALL, 132141aca85bca75dd69830539594ac74115f966568Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE); 1338524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby context.sendBroadcastAsUser(areaInfoIntent, UserHandle.ALL, 1348524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby android.Manifest.permission.READ_PHONE_STATE); 1358524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby } 1368524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby } else { 1378524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby Log.e(TAG, "caller missing READ_PHONE_STATE permission, returning"); 1388524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby } 13950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 14050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.w(TAG, "onReceive() unexpected action " + action); 14150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 14250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 14350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 14450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby /** 145e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl * Handle Service Category Program Data message. 146e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl * TODO: Send Service Category Program Results response message to sender 14700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * 148e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl * @param context 149e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl * @param programDataList 15000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 151e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl private void handleCdmaSmsCbProgramData(Context context, 152c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe CdmaSmsCbProgramData[] programDataList, int subId) { 15300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby for (CdmaSmsCbProgramData programData : programDataList) { 15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch (programData.getOperation()) { 15500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY: 156c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe tryCdmaSetCategory(context, programData.getCategory(), true, subId); 15700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 15800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 15900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY: 160c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe tryCdmaSetCategory(context, programData.getCategory(), false, subId); 16100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 16200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 16300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case CdmaSmsCbProgramData.OPERATION_CLEAR_CATEGORIES: 16400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby tryCdmaSetCategory(context, 165c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, false, subId); 16600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby tryCdmaSetCategory(context, 167c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, false, subId); 16800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby tryCdmaSetCategory(context, 169c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, false, 170c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe subId); 17100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby tryCdmaSetCategory(context, 172c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, false, subId); 17300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 17400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 17500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby default: 176a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks loge("Ignoring unknown SCPD operation " + programData.getOperation()); 17700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 17800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 17921f2b9ac08ca93cee099292ba597b9a45e846030Jake Hamby } 18000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 181c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe private void tryCdmaSetCategory(Context context, int category, boolean enable, int subId) { 18200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch (category) { 18300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT: 184c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.setSubscriptionProperty(subId, 185c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.CB_EXTREME_THREAT_ALERT, 186c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe (enable ? "1" : "0")); 18700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 18800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 18900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT: 190c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.setSubscriptionProperty(subId, 191c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.CB_SEVERE_THREAT_ALERT, 192c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe (enable ? "1" : "0")); 19300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 19400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 19500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY: 196c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.setSubscriptionProperty(subId, 197c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.CB_AMBER_ALERT, 198c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe (enable ? "1" : "0")); 19900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 20100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE: 202c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.setSubscriptionProperty(subId, 203c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe SubscriptionManager.CB_CMAS_TEST_ALERT, 204c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe (enable ? "1" : "0")); 20500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 20700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby default: 208e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl Log.w(TAG, "Ignoring SCPD command to " + (enable ? "enable" : "disable") 209e707fd18bd5170f8f8f0320921899f1683747c6bEd Heyl + " alerts in category " + category); 21000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 21100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 21200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 21300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 21450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Tell {@link CellBroadcastConfigService} to enable the CB channels. 21550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * @param context the broadcast receiver context 21650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 217c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe static void startConfigService(Context context, int subId) { 218a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS, 219a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks null, context, CellBroadcastConfigService.class); 220c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe serviceIntent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 221a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks context.startService(serviceIntent); 22250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 22350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 22450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby /** 22550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * @return true if the phone is a CDMA phone type 22650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 227c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe static boolean phoneIsCdma(int subId) { 22850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby boolean isCdma = false; 22950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby try { 23050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 23150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (phone != null) { 232c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe isCdma = (phone.getActivePhoneTypeForSubscriber(subId) == 233c4ef6116a83db3b93f93d32be29a36bf54622d9dSanket Padawe TelephonyManager.PHONE_TYPE_CDMA); 23450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 23550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } catch (RemoteException e) { 23650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.w(TAG, "phone.getActivePhoneType() failed", e); 23750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 23850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return isCdma; 23950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 240da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby 241da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby private static void log(String msg) { 242da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby Log.d(TAG, msg); 243da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby } 244a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks 245a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks private static void loge(String msg) { 246a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks Log.e(TAG, msg); 247a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks } 24850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 249