SimChangeReceiver.java revision 0e70002f75a2f71efe663d54cc7e033044bb7a72
1e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen/*
2e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * Copyright (C) 2015 The Android Open Source Project
3e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *
4e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * Licensed under the Apache License, Version 2.0 (the "License");
5e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * you may not use this file except in compliance with the License.
6e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * You may obtain a copy of the License at
7e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *
8e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *      http://www.apache.org/licenses/LICENSE-2.0
9e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *
10e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * Unless required by applicable law or agreed to in writing, software
11e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * distributed under the License is distributed on an "AS IS" BASIS,
12e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * See the License for the specific language governing permissions and
14e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * limitations under the License
15e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen */
16e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenpackage com.android.phone.vvm.omtp;
17e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen
18e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenimport android.content.BroadcastReceiver;
19e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenimport android.content.Context;
20e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenimport android.content.Intent;
210e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.os.Bundle;
220e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.telephony.CarrierConfigManager;
230e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.telephony.SmsManager;
240e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.telephony.SubscriptionManager;
250e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.text.TextUtils;
26e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenimport android.util.Log;
27e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen
28e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenimport com.android.internal.telephony.IccCardConstants;
290e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport com.android.internal.telephony.PhoneConstants;
300e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport com.android.internal.telephony.TelephonyIntents;
310e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport com.android.phone.vvm.omtp.sms.OmtpMessageSender;
32e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen
33e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen/**
340e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen * This class listens to the {@link CarrierConfigManager#ACTION_CARRIER_CONFIG_CHANGED} and
350e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen * {@link TelephonyIntents#ACTION_SIM_STATE_CHANGED} to determine when a SIM is added, replaced,
360e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen * or removed.
37e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *
38e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * When a SIM is added, send an activate SMS. When a SIM is removed, remove the sync accounts and
39e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * change the status in the voicemail_status table.
40e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen */
41e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenpublic class SimChangeReceiver extends BroadcastReceiver {
42e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    private final String TAG = "SimChangeReceiver";
43e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    @Override
44e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    public void onReceive(Context context, Intent intent) {
450e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        final String action = intent.getAction();
460e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (action == null) {
470e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "Null action for intent.");
480e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
490e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
500e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
510e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        switch (action) {
520e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            case TelephonyIntents.ACTION_SIM_STATE_CHANGED:
530e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(
540e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                        intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE))) {
550e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                    Log.i(TAG, "Sim removed, removing inactive accounts");
560e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                    OmtpVvmSyncAccountManager.getInstance(context).removeInactiveAccounts();
570e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                }
58e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen                break;
590e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED:
600e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                handleCarrierConfigChange(context, intent);
61e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen                break;
62e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen        }
63e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    }
640e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
650e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen    private void handleCarrierConfigChange(Context context, Intent intent) {
660e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
670e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
680e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
690e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "subscriptionId not provided in intent.");
700e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
710e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
720e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
730e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        CarrierConfigManager carrierConfigManager = (CarrierConfigManager)
740e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
750e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (carrierConfigManager == null) {
760e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "No carrier config service found.");
770e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
780e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
790e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
800e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        Bundle carrierConfig = carrierConfigManager.getConfigForSubId(subId);
810e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (carrierConfig == null) {
820e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "Empty carrier config.");
830e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
840e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
850e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        String vvmType = carrierConfig.getString(
860e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                CarrierConfigManager.STRING_VVM_TYPE, null);
870e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
880e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (!CarrierConfigManager.VVM_TYPE_OMTP.equals(vvmType)) {
890e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            // This is not an OMTP visual voicemail compatible carrier.
900e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
910e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
920e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
930e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        int applicationPort = carrierConfig.getInt(
940e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                CarrierConfigManager.INT_VVM_PORT_NUMBER, 0);
950e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        String destinationNumber = carrierConfig.getString(
960e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                CarrierConfigManager.STRING_VVM_DESTINATION_NUMBER);
970e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (TextUtils.isEmpty(destinationNumber)) {
980e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "No destination number for this carrier.");
990e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
1000e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
1010e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
1020e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        Log.i(TAG, "Requesting VVM activation for subId: " + subId);
1030e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(subId);
1040e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        OmtpMessageSender messageSender = new OmtpMessageSender(smsManager,
1050e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                (short) applicationPort, destinationNumber, null,
1060e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                OmtpConstants.PROTOCOL_VERSION1_1, null);
1070e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        messageSender.requestVvmActivation(null);
1080e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen    }
109e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen}