1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/*
2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2015 The Android Open Source Project
3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License.
6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at
7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and
14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License
15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */
16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl;
17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.content.Context;
19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.telecom.PhoneAccountHandle;
20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.telephony.PhoneStateListener;
21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.telephony.ServiceState;
22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.sync.OmtpVvmSyncService;
23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.sync.SyncTask;
24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.sync.VoicemailStatusQueryHelper;
25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.sync.VvmAccountManager;
26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/**
28d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Check if service is lost and indicate this in the voicemail status. TODO(b/35125657): Not used
29d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * for now, restore it.
30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */
31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class VvmPhoneStateListener extends PhoneStateListener {
32d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private static final String TAG = "VvmPhoneStateListener";
34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private PhoneAccountHandle mPhoneAccount;
36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private Context mContext;
37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private int mPreviousState = -1;
38d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public VvmPhoneStateListener(Context context, PhoneAccountHandle accountHandle) {
4010ae593a59aa50963e1d3159747da2d65ca79bedEric Erfanian    // TODO: b/32637799 too much trouble to call super constructor through reflection,
41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    // just use non-phoneAccountHandle version for now.
42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    super();
43d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mContext = context;
44d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mPhoneAccount = accountHandle;
45d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  @Override
48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public void onServiceStateChanged(ServiceState serviceState) {
49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (mPhoneAccount == null) {
50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      VvmLog.e(
51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          TAG,
52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          "onServiceStateChanged on phoneAccount "
53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian              + mPhoneAccount
54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian              + " with invalid phoneAccountHandle, ignoring");
55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return;
56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    int state = serviceState.getState();
59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (state == mPreviousState
60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        || (state != ServiceState.STATE_IN_SERVICE
61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian            && mPreviousState != ServiceState.STATE_IN_SERVICE)) {
62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      // Only interested in state changes or transitioning into or out of "in service".
63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      // Otherwise just quit.
64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mPreviousState = state;
65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return;
66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(mContext, mPhoneAccount);
69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (state == ServiceState.STATE_IN_SERVICE) {
71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      VoicemailStatusQueryHelper voicemailStatusQueryHelper =
72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          new VoicemailStatusQueryHelper(mContext);
73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      if (voicemailStatusQueryHelper.isVoicemailSourceConfigured(mPhoneAccount)) {
74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        if (!voicemailStatusQueryHelper.isNotificationsChannelActive(mPhoneAccount)) {
75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          VvmLog.v(TAG, "Notifications channel is active for " + mPhoneAccount);
76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          helper.handleEvent(
77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian              VoicemailStatus.edit(mContext, mPhoneAccount), OmtpEvents.NOTIFICATION_IN_SERVICE);
78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        }
79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      }
80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
81d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      if (VvmAccountManager.isAccountActivated(mContext, mPhoneAccount)) {
82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        VvmLog.v(TAG, "Signal returned: requesting resync for " + mPhoneAccount);
83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        // If the source is already registered, run a full sync in case something was missed
84d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        // while signal was down.
85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        SyncTask.start(mContext, mPhoneAccount, OmtpVvmSyncService.SYNC_FULL_SYNC);
86d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      } else {
87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        VvmLog.v(TAG, "Signal returned: reattempting activation for " + mPhoneAccount);
88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        // Otherwise initiate an activation because this means that an OMTP source was
89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        // recognized but either the activation text was not successfully sent or a response
90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        // was not received.
91d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        helper.startActivation();
92d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      }
93d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
94d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      VvmLog.v(TAG, "Notifications channel is inactive for " + mPhoneAccount);
95d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
96d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      if (!VvmAccountManager.isAccountActivated(mContext, mPhoneAccount)) {
97d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        return;
98d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      }
99d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      helper.handleEvent(
100d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          VoicemailStatus.edit(mContext, mPhoneAccount), OmtpEvents.NOTIFICATION_SERVICE_LOST);
101d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
102d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mPreviousState = state;
103d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
104d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian}
105