1/* 2 * Copyright (C) 2016 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.dialer.app.voicemail.error; 18 19import android.content.Context; 20import android.content.Intent; 21import android.net.Uri; 22import android.os.Build.VERSION_CODES; 23import android.support.annotation.NonNull; 24import android.support.annotation.Nullable; 25import android.support.annotation.RequiresApi; 26import android.view.View; 27import android.view.View.OnClickListener; 28import com.android.contacts.common.util.ContactDisplayUtils; 29import com.android.dialer.app.voicemail.error.VoicemailErrorMessage.Action; 30import com.android.dialer.logging.DialerImpression; 31import com.android.dialer.logging.Logger; 32 33/** 34 * Create error message from {@link VoicemailStatus} for VVM3 visual voicemail. VVM3 is used only by 35 * Verizon Wireless. 36 */ 37@RequiresApi(VERSION_CODES.N_MR1) 38public class Vvm3VoicemailMessageCreator { 39 40 // Copied from com.android.phone.vvm.omtp.protocol.Vvm3EventHandler 41 // TODO(b/28380841): unbundle VVM client so we can access these values directly 42 public static final int VMS_DNS_FAILURE = -9001; 43 public static final int VMG_DNS_FAILURE = -9002; 44 public static final int SPG_DNS_FAILURE = -9003; 45 public static final int VMS_NO_CELLULAR = -9004; 46 public static final int VMG_NO_CELLULAR = -9005; 47 public static final int SPG_NO_CELLULAR = -9006; 48 public static final int VMS_TIMEOUT = -9007; 49 public static final int VMG_TIMEOUT = -9008; 50 public static final int STATUS_SMS_TIMEOUT = -9009; 51 52 public static final int SUBSCRIBER_BLOCKED = -9990; 53 public static final int UNKNOWN_USER = -9991; 54 public static final int UNKNOWN_DEVICE = -9992; 55 public static final int INVALID_PASSWORD = -9993; 56 public static final int MAILBOX_NOT_INITIALIZED = -9994; 57 public static final int SERVICE_NOT_PROVISIONED = -9995; 58 public static final int SERVICE_NOT_ACTIVATED = -9996; 59 public static final int USER_BLOCKED = -9998; 60 public static final int IMAP_GETQUOTA_ERROR = -9997; 61 public static final int IMAP_SELECT_ERROR = -9989; 62 public static final int IMAP_ERROR = -9999; 63 64 public static final int VMG_INTERNAL_ERROR = -101; 65 public static final int VMG_DB_ERROR = -102; 66 public static final int VMG_COMMUNICATION_ERROR = -103; 67 public static final int SPG_URL_NOT_FOUND = -301; 68 69 // Non VVM3 codes: 70 public static final int VMG_UNKNOWN_ERROR = -1; 71 public static final int PIN_NOT_SET = -100; 72 public static final int SUBSCRIBER_UNKNOWN = -99; 73 74 @Nullable 75 public static VoicemailErrorMessage create( 76 final Context context, 77 final VoicemailStatus status, 78 final VoicemailStatusReader statusReader) { 79 VoicemailErrorMessage tosMessage = 80 new VoicemailTosMessageCreator(context, status, statusReader).maybeCreateTosMessage(); 81 if (tosMessage != null) { 82 return tosMessage; 83 } 84 85 if (VMS_DNS_FAILURE == status.dataChannelState) { 86 return new VoicemailErrorMessage( 87 context.getString(R.string.vvm3_error_vms_dns_failure_title), 88 getCustomerSupportString(context, R.string.vvm3_error_vms_dns_failure_message), 89 VoicemailErrorMessage.createRetryAction(context, status), 90 createCallCustomerSupportAction(context)); 91 } 92 93 if (VMG_DNS_FAILURE == status.configurationState) { 94 return new VoicemailErrorMessage( 95 context.getString(R.string.vvm3_error_vmg_dns_failure_title), 96 getCustomerSupportString(context, R.string.vvm3_error_vmg_dns_failure_message), 97 VoicemailErrorMessage.createRetryAction(context, status), 98 createCallCustomerSupportAction(context)); 99 } 100 101 if (SPG_DNS_FAILURE == status.configurationState) { 102 return new VoicemailErrorMessage( 103 context.getString(R.string.vvm3_error_spg_dns_failure_title), 104 getCustomerSupportString(context, R.string.vvm3_error_spg_dns_failure_message), 105 VoicemailErrorMessage.createRetryAction(context, status), 106 createCallCustomerSupportAction(context)); 107 } 108 109 if (VMS_NO_CELLULAR == status.dataChannelState) { 110 return new VoicemailErrorMessage( 111 context.getString(R.string.vvm3_error_vms_no_cellular_title), 112 getCustomerSupportString(context, R.string.vvm3_error_vms_no_cellular_message), 113 VoicemailErrorMessage.createRetryAction(context, status), 114 createCallCustomerSupportAction(context)); 115 } 116 117 if (VMG_NO_CELLULAR == status.configurationState) { 118 return new VoicemailErrorMessage( 119 context.getString(R.string.vvm3_error_vmg_no_cellular_title), 120 getCustomerSupportString(context, R.string.vvm3_error_vmg_no_cellular_message), 121 VoicemailErrorMessage.createRetryAction(context, status), 122 createCallCustomerSupportAction(context)); 123 } 124 125 if (SPG_NO_CELLULAR == status.configurationState) { 126 return new VoicemailErrorMessage( 127 context.getString(R.string.vvm3_error_spg_no_cellular_title), 128 getCustomerSupportString(context, R.string.vvm3_error_spg_no_cellular_message), 129 VoicemailErrorMessage.createRetryAction(context, status), 130 createCallCustomerSupportAction(context)); 131 } 132 133 if (VMS_TIMEOUT == status.dataChannelState) { 134 return new VoicemailErrorMessage( 135 context.getString(R.string.vvm3_error_vms_timeout_title), 136 getCustomerSupportString(context, R.string.vvm3_error_vms_timeout_message), 137 VoicemailErrorMessage.createRetryAction(context, status), 138 createCallCustomerSupportAction(context)); 139 } 140 141 if (VMG_TIMEOUT == status.configurationState) { 142 return new VoicemailErrorMessage( 143 context.getString(R.string.vvm3_error_vmg_timeout_title), 144 getCustomerSupportString(context, R.string.vvm3_error_vmg_timeout_message), 145 VoicemailErrorMessage.createRetryAction(context, status), 146 createCallCustomerSupportAction(context)); 147 } 148 149 if (STATUS_SMS_TIMEOUT == status.notificationChannelState) { 150 return new VoicemailErrorMessage( 151 context.getString(R.string.vvm3_error_status_sms_timeout_title), 152 getCustomerSupportString(context, R.string.vvm3_error_status_sms_timeout_message), 153 VoicemailErrorMessage.createRetryAction(context, status), 154 createCallCustomerSupportAction(context)); 155 } 156 157 if (SUBSCRIBER_BLOCKED == status.configurationState) { 158 return new VoicemailErrorMessage( 159 context.getString(R.string.vvm3_error_subscriber_blocked_title), 160 getCustomerSupportString(context, R.string.vvm3_error_subscriber_blocked_message), 161 VoicemailErrorMessage.createRetryAction(context, status), 162 createCallCustomerSupportAction(context)); 163 } 164 165 if (UNKNOWN_USER == status.configurationState) { 166 return new VoicemailErrorMessage( 167 context.getString(R.string.vvm3_error_unknown_user_title), 168 getCustomerSupportString(context, R.string.vvm3_error_unknown_user_message), 169 VoicemailErrorMessage.createCallVoicemailAction(context), 170 createCallCustomerSupportAction(context)); 171 } 172 173 if (UNKNOWN_DEVICE == status.configurationState) { 174 return new VoicemailErrorMessage( 175 context.getString(R.string.vvm3_error_unknown_device_title), 176 getCustomerSupportString(context, R.string.vvm3_error_unknown_device_message), 177 VoicemailErrorMessage.createCallVoicemailAction(context), 178 createCallCustomerSupportAction(context)); 179 } 180 181 if (INVALID_PASSWORD == status.configurationState) { 182 return new VoicemailErrorMessage( 183 context.getString(R.string.vvm3_error_invalid_password_title), 184 getCustomerSupportString(context, R.string.vvm3_error_invalid_password_message), 185 VoicemailErrorMessage.createCallVoicemailAction(context), 186 createCallCustomerSupportAction(context)); 187 } 188 189 if (MAILBOX_NOT_INITIALIZED == status.configurationState) { 190 return new VoicemailErrorMessage( 191 context.getString(R.string.vvm3_error_mailbox_not_initialized_title), 192 getCustomerSupportString(context, R.string.vvm3_error_mailbox_not_initialized_message), 193 createCallCustomerSupportAction(context)); 194 } 195 196 if (SERVICE_NOT_PROVISIONED == status.configurationState) { 197 return new VoicemailErrorMessage( 198 context.getString(R.string.vvm3_error_service_not_provisioned_title), 199 getCustomerSupportString(context, R.string.vvm3_error_service_not_provisioned_message), 200 createCallCustomerSupportAction(context)); 201 } 202 203 if (SERVICE_NOT_ACTIVATED == status.configurationState) { 204 return new VoicemailErrorMessage( 205 context.getString(R.string.vvm3_error_service_not_activated_title), 206 getCustomerSupportString(context, R.string.vvm3_error_service_not_activated_message), 207 createCallCustomerSupportAction(context)); 208 } 209 210 if (USER_BLOCKED == status.configurationState) { 211 return new VoicemailErrorMessage( 212 context.getString(R.string.vvm3_error_user_blocked_title), 213 getCustomerSupportString(context, R.string.vvm3_error_user_blocked_message), 214 createCallCustomerSupportAction(context)); 215 } 216 217 if (SUBSCRIBER_UNKNOWN == status.configurationState) { 218 return new VoicemailErrorMessage( 219 context.getString(R.string.vvm3_error_subscriber_unknown_title), 220 getCustomerSupportString(context, R.string.vvm3_error_subscriber_unknown_message), 221 VoicemailErrorMessage.createCallVoicemailAction(context), 222 createCallCustomerSupportAction(context)); 223 } 224 225 if (IMAP_GETQUOTA_ERROR == status.dataChannelState) { 226 return new VoicemailErrorMessage( 227 context.getString(R.string.vvm3_error_imap_getquota_error_title), 228 getCustomerSupportString(context, R.string.vvm3_error_imap_getquota_error_message), 229 VoicemailErrorMessage.createCallVoicemailAction(context), 230 createCallCustomerSupportAction(context)); 231 } 232 233 if (IMAP_SELECT_ERROR == status.dataChannelState) { 234 return new VoicemailErrorMessage( 235 context.getString(R.string.vvm3_error_imap_select_error_title), 236 getCustomerSupportString(context, R.string.vvm3_error_imap_select_error_message), 237 VoicemailErrorMessage.createCallVoicemailAction(context), 238 createCallCustomerSupportAction(context)); 239 } 240 241 if (IMAP_ERROR == status.dataChannelState) { 242 return new VoicemailErrorMessage( 243 context.getString(R.string.vvm3_error_imap_error_title), 244 getCustomerSupportString(context, R.string.vvm3_error_imap_error_message), 245 VoicemailErrorMessage.createCallVoicemailAction(context), 246 createCallCustomerSupportAction(context)); 247 } 248 249 if (PIN_NOT_SET == status.configurationState) { 250 Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_ALERT_SET_PIN_SHOWN); 251 return new VoicemailErrorMessage( 252 context.getString(R.string.voicemail_error_pin_not_set_title), 253 getCustomerSupportString(context, R.string.voicemail_error_pin_not_set_message), 254 VoicemailErrorMessage.createSetPinAction(context, status.getPhoneAccountHandle())); 255 } 256 257 return OmtpVoicemailMessageCreator.create(context, status, statusReader); 258 } 259 260 @NonNull 261 private static CharSequence getCustomerSupportString(Context context, int id) { 262 // TODO: get number based on the country the user is currently in. 263 return ContactDisplayUtils.getTtsSpannedPhoneNumber( 264 context.getResources(), 265 id, 266 context.getString(R.string.verizon_domestic_customer_support_display_number)); 267 } 268 269 @NonNull 270 private static Action createCallCustomerSupportAction(final Context context) { 271 return new Action( 272 context.getString(R.string.voicemail_action_call_customer_support), 273 new OnClickListener() { 274 @Override 275 public void onClick(View v) { 276 Intent intent = 277 new Intent( 278 Intent.ACTION_CALL, 279 Uri.parse( 280 "tel:" 281 + context.getString( 282 R.string.verizon_domestic_customer_support_number))); 283 context.startActivity(intent); 284 } 285 }); 286 } 287} 288