package tellh.com.gitclub.model.net.client;
import android.content.Context;
import java.io.File;
import java.io.IOException;
import javax.inject.Inject;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.utils.Utils;
/**
* Created by tlh on 2016/8/26 :)
*/
public class CacheOkHttpClient extends BaseOkHttpClient {
public static final long SIZE_OF_CACHE = 1024 * 1024 * 50;
protected Context mCtx;
@Inject
public CacheOkHttpClient(Context ctx) {
mCtx = ctx;
}
@Override
protected OkHttpClient.Builder enrichBuilder(OkHttpClient.Builder builder) {
File cacheFile = new File(mCtx.getCacheDir(), mCtx.getString(R.string.app_name));
Cache cache = new Cache(cacheFile, SIZE_OF_CACHE); //50Mb
//the NetworkInterceptor is to cache setup the response caching.
//the Interceptor is to force using cache when Network is unavailable.
//don't combine them into a interceptor.
builder.cache(cache).addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
if (Utils.isNetworkAvailable(mCtx)) {
return response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=600")
.build();
} else {
return response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", CacheControl.FORCE_CACHE.toString())
.build();
}
}
}).addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!Utils.isNetworkAvailable(mCtx)) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
return chain.proceed(request);
}
});
return super.enrichBuilder(builder);
}
}