package cn.alphabets.light.network;
import android.net.Uri;
import android.widget.ImageView;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import java.util.Map;
import cn.alphabets.light.R;
import cn.alphabets.light.setting.Default;
import cn.alphabets.light.store.Eternal;
import cn.alphabets.light.util.SharedData;
/**
* 单例RequestQueue管理器
* Created by lin on 14/12/1.
*/
public class VolleyManager {
public static final String DATA_SERVER_ADDRESS = "cn_alphabets_light_network_VolleyManager_Server";
/** Internal instance variable. */
private static VolleyManager sInstance;
/** The request queue. */
private RequestQueue mRequestQueue;
/** Volley image loader */
private AuthImageLoader mImageLoader;
/** Image cache implementation */
private AuthImageLoader.ImageCache mImageCache;
/**
* No instances
*/
private VolleyManager() {
}
/**
* This is the initializer.
*/
public static void init() {
if (sInstance == null) {
sInstance = new VolleyManager();
sInstance.mRequestQueue = Volley.newRequestQueue(ContextManager.getInstance());
sInstance.mImageCache = new LruImageCache();
sInstance.mImageLoader = new AuthImageLoader(getRequestQueue(), sInstance.mImageCache);
}
}
/**
* Gets the image loader from the singleton.
* @return The RequestQueue.
* @throws java.lang.IllegalStateException This is thrown if init has not been called.
*/
public static RequestQueue getRequestQueue() {
if (sInstance == null) {
throw new IllegalStateException("The VolleyManager must be initialized.");
}
return sInstance.mRequestQueue;
}
/**
* Gets the image loader from the singleton.
* @return The ImageLoader.
* @throws java.lang.IllegalStateException This is thrown if init has not been called.
*/
public static AuthImageLoader getImageLoader() {
if (sInstance == null) {
throw new IllegalStateException("The VolleyManager must be initialized.");
}
return sInstance.mImageLoader;
}
/**
* Load image and set the image to view.
* @param file image path
* @param view image view instance
*/
public static void loadImage(String file, ImageView view) {
ImageLoader.ImageListener listener = ImageLoader.getImageListener(view,
R.drawable.progress_loading,
android.R.drawable.stat_notify_error
);
String uri = getURL(Default.UrlLoadFile + file, Request.Method.GET, null);
getImageLoader().get(uri, listener);
}
/**
* Load image. Callback Mode. The callback function where you can get Bitmap.
* @param file image path
* @param success Callback
*/
public static void loadImage(String file, final AuthImageLoader.Success success) {
final ImageView view = new ImageView(ContextManager.getInstance());
final int errorImageResId = android.R.drawable.stat_notify_error;
final int defaultImageResId = android.R.drawable.progress_indeterminate_horizontal;
ImageLoader.ImageListener listener = new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
}
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
view.setImageBitmap(response.getBitmap());
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
success.onResponse(response.getBitmap());
}
};
String uri = getURL(Default.UrlLoadFile + file, Request.Method.GET, null);
getImageLoader().get(uri, listener);
}
/**
* 加载不需要认证的图片,比如公开的网络图片
* @param fileUrl
* @param success
*/
public static void loadPublicImage(String fileUrl, final AuthImageLoader.Success success) {
final ImageView view = new ImageView(ContextManager.getInstance());
final int errorImageResId = android.R.drawable.stat_notify_error;
final int defaultImageResId = android.R.drawable.progress_indeterminate_horizontal;
ImageLoader.ImageListener listener = new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
}
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
view.setImageBitmap(response.getBitmap());
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
success.onResponse(response.getBitmap());
}
};
getImageLoader().get(fileUrl, listener);
}
/**
* Gets the JSON Request Instance
* @param method Request.Method
* @param url url
* @param jsonRequest params
* @param listener success
* @param errorListener error
* @return Request instance
*/
public static AuthJsonRequest getJsonRequest(
int method,
String url,
JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
String uri = getURL(url, method, jsonRequest);
AuthJsonRequest request = new AuthJsonRequest(method, uri, jsonRequest, listener, errorListener);
// 添加到Queue
getRequestQueue().add(request);
// 设定超时
request.setRetryPolicy(new DefaultRetryPolicy(
Default.RequestTimeout,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
return request;
}
/**
* Gets the File Request Instance
* @param url url
* @param params params
* @param listener success
* @param errorListener error
* @return Request instance
*/
public static AuthMultipartRequest getMultipartRequest(
String url,
Map<String, Object> params,
Response.Listener<String> listener,
Response.ErrorListener errorListener) {
return getMultipartRequest(url, params, listener, null, errorListener);
}
public static AuthMultipartRequest getMultipartRequest(
String url,
Map<String, Object> params,
Response.Listener<String> listener,
AuthMultipartRequest.MultipartProgressListener progress,
Response.ErrorListener errorListener) {
String uri = getURL(url, Request.Method.POST, null);
AuthMultipartRequest request = new AuthMultipartRequest(uri, params, listener, errorListener, progress);
// 添加到Queue
getRequestQueue().add(request);
// 设定超时
request.setRetryPolicy(new DefaultRetryPolicy(
Default.FileRequestTimeout,
Default.MaxReTries,
Default.BackOffMultiplier));
return request;
}
/**
* Gets URL
* @param url url
* @param method Request.Method
* @param params params
* @return url
*/
public static String getURL(String url, int method, JSONObject params) {
Uri.Builder builder = new Uri.Builder();
// make server address (Support to specify the full URL)
if (url.toLowerCase().contains("http") || url.toLowerCase().contains("https")) {
builder.encodedPath(url);
} else {
builder.scheme(Default.Protocol()).encodedAuthority(getAddress()).appendEncodedPath(url);
}
// add csrf token
if (method == Request.Method.POST || method == Request.Method.PUT || method == Request.Method.DELETE) {
builder.appendQueryParameter(Default.CsrfName, SessionManager.getCsrf());
}
// add params
if (method == Request.Method.GET && params != null) {
ParameterQueryParser.parse(params, builder);
}
return builder.build().toString();
}
/**
* 获取服务器地址
* @return 地址
*/
public static String getAddress() {
// Try to get address from obbDir
String authority = Eternal.getString(DATA_SERVER_ADDRESS);
if (authority != null && !StringUtils.isEmpty(authority)) {
return authority;
}
// Try to get address from SharedData
authority = SharedData.getInstance().get(DATA_SERVER_ADDRESS);
if (authority != null && !StringUtils.isEmpty(authority)) {
}
return Default.Server() + ":" + Default.Port();
}
}