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 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}