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