1package eu.siacs.conversations.ui.util;
2
3import android.app.AlertDialog;
4import android.app.Dialog;
5import android.content.Context;
6import android.content.DialogInterface;
7import android.content.Intent;
8import android.net.Uri;
9import android.os.SystemClock;
10import androidx.annotation.StringRes;
11
12import eu.siacs.conversations.R;
13import eu.siacs.conversations.services.QuickConversationsService;
14import eu.siacs.conversations.utils.TimeFrameUtils;
15
16public class ApiDialogHelper {
17
18 public static Dialog createError(final Context context, final int code) {
19 @StringRes final int res;
20 switch (code) {
21 case QuickConversationsService.API_ERROR_AIRPLANE_MODE:
22 res = R.string.no_network_connection;
23 break;
24 case QuickConversationsService.API_ERROR_OTHER:
25 res = R.string.unknown_api_error_network;
26 break;
27 case QuickConversationsService.API_ERROR_CONNECT:
28 res = R.string.unable_to_connect_to_server;
29 break;
30 case QuickConversationsService.API_ERROR_SSL_HANDSHAKE:
31 res = R.string.unable_to_establish_secure_connection;
32 break;
33 case QuickConversationsService.API_ERROR_UNKNOWN_HOST:
34 res = R.string.unable_to_find_server;
35 break;
36 case QuickConversationsService.API_ERROR_SSL_CERTIFICATE:
37 res = R.string.unable_to_verify_server_identity;
38 break;
39 case QuickConversationsService.API_ERROR_SSL_GENERAL:
40 res = R.string.unknown_security_error;
41 break;
42 case QuickConversationsService.API_ERROR_TIMEOUT:
43 res = R.string.timeout_while_connecting_to_server;
44 break;
45 case 400:
46 res = R.string.invalid_user_input;
47 break;
48 case 403:
49 res = R.string.the_app_is_out_of_date;
50 break;
51 case 409:
52 res = R.string.logged_in_with_another_device;
53 break;
54 case 451:
55 res = R.string.not_available_in_your_country;
56 break;
57 case 500:
58 res = R.string.something_went_wrong_processing_your_request;
59 break;
60 case 502:
61 case 503:
62 case 504:
63 res = R.string.temporarily_unavailable;
64 break;
65 default:
66 res = R.string.unknown_api_error_response;
67 }
68 final AlertDialog.Builder builder = new AlertDialog.Builder(context);
69 builder.setMessage(res);
70 if (code == 403 && resolvable(context, getMarketViewIntent(context))) {
71 builder.setNegativeButton(R.string.cancel, null);
72 builder.setPositiveButton(R.string.update, (dialog, which) -> context.startActivity(getMarketViewIntent(context)));
73 } else {
74 builder.setPositiveButton(R.string.ok, null);
75 }
76 return builder.create();
77 }
78
79 public static Dialog createRateLimited(final Context context, final long timestamp) {
80 final AlertDialog.Builder builder = new AlertDialog.Builder(context);
81 builder.setTitle(R.string.rate_limited);
82 builder.setMessage(context.getString(R.string.try_again_in_x, TimeFrameUtils.resolve(context, timestamp - SystemClock.elapsedRealtime())));
83 builder.setPositiveButton(R.string.ok, null);
84 return builder.create();
85 }
86
87 public static Dialog createTooManyAttempts(final Context context) {
88 final AlertDialog.Builder builder = new AlertDialog.Builder(context);
89 builder.setMessage(R.string.too_many_attempts);
90 builder.setPositiveButton(R.string.ok, null);
91 return builder.create();
92 }
93
94 private static Intent getMarketViewIntent(Context context) {
95 return new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName()));
96 }
97
98 private static boolean resolvable(Context context, Intent intent) {
99 return context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
100 }
101}