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;
21448b4f31ec6ae4e50692429723170cc48fb7c7fdNancy Chenimport android.os.UserHandle;
229dc2bea5e35cf8f59d05240c061cd00d74be6f7bXiaohui Chenimport android.os.UserManager;
2357c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chenimport android.telecom.PhoneAccountHandle;
240e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.telephony.CarrierConfigManager;
250e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chenimport android.telephony.SubscriptionManager;
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;
3157c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chenimport com.android.phone.PhoneUtils;
32aa5a84bf404e46dc5cfe8ca38007404e885db684Bryce Leeimport com.android.phone.R;
3357c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chenimport com.android.phone.settings.VisualVoicemailSettingsUtil;
349cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
35e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen
36e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen/**
37e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen * This class listens to the {@link CarrierConfigManager#ACTION_CARRIER_CONFIG_CHANGED} and {@link
38e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen * TelephonyIntents#ACTION_SIM_STATE_CHANGED} to determine when a SIM is added, replaced, or
39e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen * removed.
40e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen *
41e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * When a SIM is added, send an activate SMS. When a SIM is removed, remove the sync accounts and
42e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen * change the status in the voicemail_status table.
43e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen */
44e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chenpublic class SimChangeReceiver extends BroadcastReceiver {
45e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen
46e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen    private static final String TAG = "SimChangeReceiver";
47c9cc8b3915eac1676daf3ed067179f90eba21166Nancy Chen
48e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    @Override
49e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    public void onReceive(Context context, Intent intent) {
509dc2bea5e35cf8f59d05240c061cd00d74be6f7bXiaohui Chen        if (UserHandle.myUserId() != UserHandle.USER_SYSTEM) {
519dc2bea5e35cf8f59d05240c061cd00d74be6f7bXiaohui Chen            Log.v(TAG, "Received broadcast for user that is not system.");
52448b4f31ec6ae4e50692429723170cc48fb7c7fdNancy Chen            return;
53448b4f31ec6ae4e50692429723170cc48fb7c7fdNancy Chen        }
54448b4f31ec6ae4e50692429723170cc48fb7c7fdNancy Chen
550e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        final String action = intent.getAction();
560e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        if (action == null) {
570e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            Log.w(TAG, "Null action for intent.");
580e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            return;
590e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        }
600e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen
610e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen        switch (action) {
620e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            case TelephonyIntents.ACTION_SIM_STATE_CHANGED:
630e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(
640e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                        intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE))) {
650e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                    Log.i(TAG, "Sim removed, removing inactive accounts");
669cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen                    OmtpVvmSourceManager.getInstance(context).removeInactiveSources();
670e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen                }
68e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen                break;
690e70002f75a2f71efe663d54cc7e033044bb7a72Nancy Chen            case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED:
709cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen                int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
719cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen                        SubscriptionManager.INVALID_SUBSCRIPTION_ID);
7256363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen
7356363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen                if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
7456363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen                    Log.i(TAG, "Received SIM change for invalid subscription id.");
7556363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen                    return;
7656363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen                }
7756363875d0007ca8c8886a0e1dfcfe9579c76e1fNancy Chen
78e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                if (!UserManager.get(context).isUserUnlocked()) {
79e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    OmtpBootCompletedReceiver.addDeferredSubId(context, subId);
80e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                } else {
81e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    processSubId(context, subId);
82e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                }
83e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                break;
84e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen        }
85e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen    }
86e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen
87e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen    public static void processSubId(Context context, int subId) {
88e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen        OmtpVvmCarrierConfigHelper carrierConfigHelper =
89e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                new OmtpVvmCarrierConfigHelper(context, subId);
90e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen        if (carrierConfigHelper.isOmtpVvmType()) {
91e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            PhoneAccountHandle phoneAccount = PhoneUtils.makePstnPhoneAccountHandle(
92e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    SubscriptionManager.getPhoneId(subId));
9357c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen
94e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            boolean isUserSet = VisualVoicemailSettingsUtil.isVisualVoicemailUserSet(
95e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    context, phoneAccount);
96e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            boolean isEnabledInSettings =
97e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    VisualVoicemailSettingsUtil.isVisualVoicemailEnabled(context,
985aef02b75aeade526de52d5c907932b97fbead52Nancy Chen                            phoneAccount);
99e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            boolean isSupported =
100e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    context.getResources().getBoolean(R.bool.allow_visual_voicemail);
101e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            boolean isEnabled = isSupported && (isUserSet ? isEnabledInSettings :
102e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                    carrierConfigHelper.isEnabledByDefault());
1035aef02b75aeade526de52d5c907932b97fbead52Nancy Chen
104e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            if (!isUserSet) {
105e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // Preserve the previous setting for "isVisualVoicemailEnabled" if it is
106e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // set by the user, otherwise, set this value for the first time.
107e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(context, phoneAccount,
108e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                        isEnabled, /** isUserSet */false);
109e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            }
110a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen
111e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            if (isEnabled) {
112e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                LocalLogHelper.log(TAG, "Sim state or carrier config changed: requesting"
113e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                        + " activation for " + phoneAccount.getId());
11487d7c2164e219bca5dfaaf2065767ab0e036061fNancy Chen
115e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // Add a phone state listener so that changes to the communication channels
116e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // can be recorded.
117e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                OmtpVvmSourceManager.getInstance(context).addPhoneStateListener(
118e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                        phoneAccount);
119e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                carrierConfigHelper.startActivation();
120e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            } else {
121e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // It may be that the source was not registered to begin with but we want
122e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                // to run through the steps to remove the source just in case.
123e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
124e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen                Log.v(TAG, "Sim change for disabled account.");
125e80368d449950c0d13ba78f5b8fa6eb62eafa384Ta-wei Yen            }
126e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen        }
127e53a064be1bcea3ec2acb3c7681fa9a2762f4e3eNancy Chen    }
128c9cc8b3915eac1676daf3ed067179f90eba21166Nancy Chen}