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