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