ApiDialogHelper.java

 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 android.support.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 400:
37                res = R.string.invalid_user_input;
38                break;
39            case 403:
40                res = R.string.the_app_is_out_of_date;
41                break;
42            case 409:
43                res = R.string.logged_in_with_another_device;
44                break;
45            case 451:
46                res = R.string.not_available_in_your_country;
47                break;
48            case 500:
49                res = R.string.something_went_wrong_processing_your_request;
50                break;
51            case 502:
52            case 503:
53            case 504:
54                res = R.string.temporarily_unavailable;
55                break;
56            default:
57                res = R.string.unknown_api_error_response;
58        }
59        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
60        builder.setMessage(res);
61        if (code == 403 && resolvable(context, getMarketViewIntent(context))) {
62            builder.setNegativeButton(R.string.cancel, null);
63            builder.setPositiveButton(R.string.update, (dialog, which) -> context.startActivity(getMarketViewIntent(context)));
64        } else {
65            builder.setPositiveButton(R.string.ok, null);
66        }
67        return builder.create();
68    }
69
70    public static Dialog createRateLimited(final Context context, final long timestamp) {
71        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
72        builder.setTitle(R.string.rate_limited);
73        builder.setMessage(context.getString(R.string.try_again_in_x, TimeframeUtils.resolve(context, timestamp - SystemClock.elapsedRealtime())));
74        builder.setPositiveButton(R.string.ok, null);
75        return builder.create();
76    }
77
78    public static Dialog createTooManyAttempts(final Context context) {
79        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
80        builder.setMessage(R.string.too_many_attempts);
81        builder.setPositiveButton(R.string.ok, null);
82        return builder.create();
83    }
84
85    private static Intent getMarketViewIntent(Context context) {
86        return new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName()));
87    }
88
89    private static boolean resolvable(Context context, Intent intent) {
90        return context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
91    }
92}