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 17 package com.android.voicemail; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.os.PersistableBundle; 22 import android.provider.VoicemailContract.Voicemails; 23 import android.support.annotation.MainThread; 24 import android.support.annotation.NonNull; 25 import android.support.annotation.Nullable; 26 import android.telecom.PhoneAccountHandle; 27 import android.telephony.TelephonyManager; 28 import java.util.List; 29 30 /** Public interface for the voicemail module */ 31 public interface VoicemailClient { 32 33 /** 34 * Whether the voicemail module is enabled (OS has support and not disabled by flags, etc.). This 35 * does not mean the carrier has support or user has enabled the feature. 36 */ 37 boolean isVoicemailModuleEnabled(); 38 39 /** 40 * Broadcast to tell the client to upload local database changes to the server. Since the dialer 41 * UI and the client are in the same package, the {@link 42 * android.content.Intent#ACTION_PROVIDER_CHANGED} will always be a self-change even if the UI is 43 * external to the client. 44 */ 45 String ACTION_UPLOAD = "com.android.voicemail.VoicemailClient.ACTION_UPLOAD"; 46 47 /** Common key for passing {@link PhoneAccountHandle} in bundles. */ 48 String PARAM_PHONE_ACCOUNT_HANDLE = "phone_account_handle"; 49 50 /** 51 * Broadcast from the client to inform the app to show a legacy voicemail notification. This 52 * broadcast is same as {@link TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION}. 53 */ 54 String ACTION_SHOW_LEGACY_VOICEMAIL = 55 "com.android.voicemail.VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL"; 56 57 /** 58 * Secret code to launch the voicemail config activity intended for OEMs and Carriers. {@code 59 * *#*#VVMCONFIG#*#*} 60 */ 61 String VOICEMAIL_SECRET_CODE = "886266344"; 62 63 /** 64 * Whether the visual voicemail service is enabled for the {@code phoneAccountHandle}. "Enable" 65 * means the user "wants" to have this service on, and does not mean the service is actually 66 * functional(For example, the service is blocked on the carrier side. The service will be 67 * "enabled" but all it will do is show the error). 68 */ 69 boolean isVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle); 70 71 /** 72 * Enable or disable visual voicemail service for the {@code phoneAccountHandle}. Setting to 73 * enabled will initiate provisioning and activation. Setting to disabled will initiate 74 * deactivation. 75 */ 76 void setVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled); 77 78 /** 79 * Appends the selection to ignore voicemails from non-active OMTP voicemail package. In OC there 80 * can be multiple packages handling OMTP voicemails which represents the same source of truth. 81 * These packages should mark their voicemails as {@link Voicemails#IS_OMTP_VOICEMAIL} and only 82 * the voicemails from {@link TelephonyManager#getVisualVoicemailPackageName()} should be shown. 83 * For example, the user synced voicemails with DialerA, and then switched to DialerB, voicemails 84 * from DialerA should be ignored as they are no longer current. Voicemails from {@link 85 * #OMTP_VOICEMAIL_BLACKLIST} will also be ignored as they are voicemail source only valid pre-OC. 86 */ 87 void appendOmtpVoicemailSelectionClause( 88 Context context, StringBuilder where, List<String> selectionArgs); 89 90 /** 91 * Appends the selection to ignore voicemail status from non-active OMTP voicemail package. The 92 * {@link android.provider.VoicemailContract.Status#SOURCE_TYPE} is checked against a list of 93 * known OMTP types. Voicemails from {@link #OMTP_VOICEMAIL_BLACKLIST} will also be ignored as 94 * they are voicemail source only valid pre-OC. 95 * 96 * @see #appendOmtpVoicemailSelectionClause(Context, StringBuilder, List) 97 */ 98 void appendOmtpVoicemailStatusSelectionClause( 99 Context context, StringBuilder where, List<String> selectionArgs); 100 101 /** 102 * @return the class name of the {@link android.preference.PreferenceFragment} for voicemail 103 * settings, or {@code null} if dialer cannot control voicemail settings. Always return {@code 104 * null} before OC. 105 */ 106 @Nullable 107 String getSettingsFragment(); 108 109 boolean isVoicemailArchiveEnabled(Context context, PhoneAccountHandle phoneAccountHandle); 110 111 /** 112 * @return if the voicemail archive feature is available on the current device. This depends on 113 * whether the server side flag is turned on for the feature, and if the OS meets the 114 * requirement for this feature. 115 */ 116 boolean isVoicemailArchiveAvailable(Context context); 117 118 void setVoicemailArchiveEnabled( 119 Context context, PhoneAccountHandle phoneAccountHandle, boolean value); 120 121 /** 122 * @return an intent that will launch the activity to change the voicemail PIN. The PIN is used 123 * when calling into the mailbox. 124 */ 125 Intent getSetPinIntent(Context context, PhoneAccountHandle phoneAccountHandle); 126 127 /** 128 * Whether the client is activated and handling visual voicemail for the {@code 129 * phoneAccountHandle}. "Enable" is the intention to use VVM. For example VVM can be enabled but 130 * prevented from working because the carrier blocked it, or a connection problem is blocking the 131 * provisioning. Being "activated" means all setup are completed, and VVM is expected to work. 132 */ 133 boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle); 134 135 /** 136 * Called when {@link #VOICEMAIL_SECRET_CODE} is dialed. {@code context} will be a broadcast 137 * receiver context. 138 */ 139 @MainThread 140 void showConfigUi(@NonNull Context context); 141 142 @NonNull 143 PersistableBundle getConfig( 144 @NonNull Context context, @Nullable PhoneAccountHandle phoneAccountHandle); 145 146 @MainThread 147 void onBoot(@NonNull Context context); 148 149 @MainThread 150 void onShutdown(@NonNull Context context); 151 } 152