/*
* Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.network;
import android.content.Context;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Authenticator;
import com.android.volley.toolbox.DiskBasedCache;
import com.android.volley.toolbox.HttpStack;
import java.io.File;
import me.zhanghai.android.douya.DouyaApplication;
import me.zhanghai.android.douya.account.info.AccountContract;
import me.zhanghai.android.douya.account.util.AccountUtils;
import me.zhanghai.android.douya.network.api.ApiRequest;
public class Volley {
private static final Volley INSTANCE = new Volley();
private Authenticator mApiV2Authenticator;
private Authenticator mFrodoAuthenticator;
private RequestQueue mRequestQueue;
public static Volley getInstance() {
return INSTANCE;
}
private Volley() {
createAuthenticatorsForActiveAccount();
createAndStartRequestQueue();
}
private void createAuthenticatorsForActiveAccount() {
Context context = DouyaApplication.getInstance();
mApiV2Authenticator = new SynchronizedAndroidAuthenticator(context,
AccountUtils.getActiveAccount(), AccountContract.AUTH_TOKEN_TYPE_API_V2, true);
mFrodoAuthenticator = new SynchronizedAndroidAuthenticator(context,
AccountUtils.getActiveAccount(), AccountContract.AUTH_TOKEN_TYPE_FRODO, true);
}
public void notifyActiveAccountChanged() {
createAuthenticatorsForActiveAccount();
}
public Authenticator getAuthenticator(String authTokenType) {
switch (authTokenType) {
case AccountContract.AUTH_TOKEN_TYPE_API_V2:
return mApiV2Authenticator;
case AccountContract.AUTH_TOKEN_TYPE_FRODO:
return mFrodoAuthenticator;
default:
throw new IllegalArgumentException("Unknown authTokenType: " + authTokenType);
}
}
/**
* @see com.android.volley.toolbox.Volley#newRequestQueue(Context, HttpStack)
*/
private void createAndStartRequestQueue() {
mRequestQueue = new RequestQueue(new DiskBasedCache(new File(
DouyaApplication.getInstance().getCacheDir(), "volley")), new BasicNetwork(
new HurlStack()));
mRequestQueue.start();
}
public RequestQueue getRequestQueue() {
return mRequestQueue;
}
public <T> Request<T> addToRequestQueue(Request<T> request) {
mRequestQueue.add(request);
return request;
}
public void cancelRequests(Object tag) {
mRequestQueue.cancelAll(tag);
}
public void cancelApiRequests() {
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(com.android.volley.Request<?> request) {
return request instanceof ApiRequest;
}
});
}
}