1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package com.android.voicemail.impl; 18 19import android.annotation.TargetApi; 20import android.content.Intent; 21import android.os.Build.VERSION_CODES; 22import android.os.UserManager; 23import android.telecom.PhoneAccountHandle; 24import android.telephony.VisualVoicemailService; 25import android.telephony.VisualVoicemailSms; 26import com.android.dialer.logging.DialerImpression; 27import com.android.dialer.logging.Logger; 28import com.android.voicemail.VoicemailComponent; 29import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; 30import com.android.voicemail.impl.sms.LegacyModeSmsHandler; 31import com.android.voicemail.impl.sync.VvmAccountManager; 32 33/** Implements {@link VisualVoicemailService} to receive visual voicemail events */ 34@TargetApi(VERSION_CODES.O) 35public class OmtpService extends VisualVoicemailService { 36 37 private static final String TAG = "VvmOmtpService"; 38 39 public static final String ACTION_SMS_RECEIVED = "com.android.vociemailomtp.sms.sms_received"; 40 41 public static final String EXTRA_VOICEMAIL_SMS = "extra_voicemail_sms"; 42 43 @Override 44 public void onCellServiceConnected( 45 VisualVoicemailTask task, final PhoneAccountHandle phoneAccountHandle) { 46 VvmLog.i(TAG, "onCellServiceConnected"); 47 if (!isModuleEnabled()) { 48 VvmLog.e(TAG, "onCellServiceConnected received when module is disabled"); 49 task.finish(); 50 return; 51 } 52 53 if (!isUserUnlocked()) { 54 VvmLog.i(TAG, "onCellServiceConnected: user locked"); 55 task.finish(); 56 return; 57 } 58 59 if (!isServiceEnabled(phoneAccountHandle)) { 60 task.finish(); 61 return; 62 } 63 64 Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); 65 ActivationTask.start(OmtpService.this, phoneAccountHandle, null); 66 task.finish(); 67 } 68 69 @Override 70 public void onSmsReceived(VisualVoicemailTask task, final VisualVoicemailSms sms) { 71 VvmLog.i(TAG, "onSmsReceived"); 72 if (!isModuleEnabled()) { 73 VvmLog.e(TAG, "onSmsReceived received when module is disabled"); 74 task.finish(); 75 return; 76 } 77 78 if (!isUserUnlocked()) { 79 LegacyModeSmsHandler.handle(this, sms); 80 return; 81 } 82 83 if (!isServiceEnabled(sms.getPhoneAccountHandle())) { 84 task.finish(); 85 return; 86 } 87 88 // isUserUnlocked() is not checked. OmtpMessageReceiver will handle the locked case. 89 90 Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); 91 Intent intent = new Intent(ACTION_SMS_RECEIVED); 92 intent.setPackage(getPackageName()); 93 intent.putExtra(EXTRA_VOICEMAIL_SMS, sms); 94 sendBroadcast(intent); 95 task.finish(); 96 } 97 98 @Override 99 public void onSimRemoved( 100 final VisualVoicemailTask task, final PhoneAccountHandle phoneAccountHandle) { 101 VvmLog.i(TAG, "onSimRemoved"); 102 if (!isModuleEnabled()) { 103 VvmLog.e(TAG, "onSimRemoved called when module is disabled"); 104 task.finish(); 105 return; 106 } 107 108 if (!isUserUnlocked()) { 109 VvmLog.i(TAG, "onSimRemoved: user locked"); 110 task.finish(); 111 return; 112 } 113 114 Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); 115 VvmAccountManager.removeAccount(this, phoneAccountHandle); 116 task.finish(); 117 } 118 119 @Override 120 public void onStopped(VisualVoicemailTask task) { 121 VvmLog.i(TAG, "onStopped"); 122 if (!isModuleEnabled()) { 123 VvmLog.e(TAG, "onStopped called when module is disabled"); 124 task.finish(); 125 return; 126 } 127 if (!isUserUnlocked()) { 128 VvmLog.i(TAG, "onStopped: user locked"); 129 task.finish(); 130 return; 131 } 132 Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); 133 } 134 135 private boolean isModuleEnabled() { 136 return VoicemailComponent.get(this).getVoicemailClient().isVoicemailModuleEnabled(); 137 } 138 139 private boolean isServiceEnabled(PhoneAccountHandle phoneAccountHandle) { 140 OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(this, phoneAccountHandle); 141 if (!config.isValid()) { 142 VvmLog.i(TAG, "VVM not supported on " + phoneAccountHandle); 143 return false; 144 } 145 if (!VisualVoicemailSettingsUtil.isEnabled(this, phoneAccountHandle) 146 && !config.isLegacyModeEnabled()) { 147 VvmLog.i(TAG, "VVM is disabled"); 148 return false; 149 } 150 return true; 151 } 152 153 private boolean isUserUnlocked() { 154 UserManager userManager = getSystemService(UserManager.class); 155 return userManager.isUserUnlocked(); 156 } 157} 158