package com.android.volley.error;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import com.android.volley.NetworkResponse;
import com.android.volley.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class VolleyErrorHelper {
private VolleyErrorHelper() {}
/**
*
* @param error
* @param context
* @return Returns appropriate message which is to be displayed to the user against
* the specified error object.
*/
public static String getMessage(Object error, Context context) {
if (error instanceof TimeoutError) {
return context.getResources().getString(R.string.generic_server_down);
} else if (isServerProblem(error)) {
return handleServerError(error, context);
} else if (isNetworkProblem(error)) {
return context.getResources().getString(R.string.no_internet);
}
return context.getResources().getString(R.string.generic_error);
}
/**
*
* @param error
* @param context
* @return Return generic message for errors
*/
public static String getErrorType(Object error, Context context) {
if (error instanceof TimeoutError) {
return context.getResources().getString(R.string.generic_server_timeout);
} else if (error instanceof ServerError) {
return context.getResources().getString(R.string.generic_server_down);
} else if (error instanceof AuthFailureError) {
return context.getResources().getString(R.string.auth_failed);
} else if (error instanceof NetworkError) {
return context.getResources().getString(R.string.no_internet);
} else if (error instanceof NoConnectionError) {
return context.getResources().getString(R.string.no_network_connection);
} else if (error instanceof ParseError) {
return context.getResources().getString(R.string.parsing_failed);
}
return context.getResources().getString(R.string.generic_error);
}
/**
* Determines whether the error is related to network
*
* @param error
* @return
*/
private static boolean isNetworkProblem(Object error) {
return (error instanceof NetworkError) || (error instanceof NoConnectionError);
}
/**
* Determines whether the error is related to server
*
* @param error
* @return
*/
private static boolean isServerProblem(Object error) {
return (error instanceof ServerError) || (error instanceof AuthFailureError);
}
/**
* Handles the server error, tries to determine whether to show a stock
* message or to show a message retrieved from the server.
*
* @param err
* @param context
* @return
*/
private static String handleServerError(Object err, Context context) {
VolleyError error = (VolleyError) err;
NetworkResponse response = error.networkResponse;
if (response != null) {
switch (response.statusCode) {
case 404:
case 422:
case 401:
try {
// server might return error like this { "error":
// "Some error occured" }
// Use "Gson" to parse the result
HashMap<String, String> result = new Gson().fromJson(new String(response.data),
new TypeToken<Map<String, String>>() { }.getType());
if (result != null && result.containsKey("error")) {
return result.get("error");
}
} catch (Exception e) {
e.printStackTrace();
}
// invalid request
return error.getMessage();
default:
return context.getResources().getString(R.string.generic_server_down);
}
}
return context.getResources().getString(R.string.generic_error);
}
}