Skip to content

Commit

Permalink
Network Response Caching
Browse files Browse the repository at this point in the history
- Cache for 2 months and use if you are offline.
- Will most likely be changing to sqlite db for groups at least
- Take into account root of crest on when to update from the server
  • Loading branch information
w9jds committed Mar 10, 2016
1 parent 7ccaf4a commit 916b865
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 11 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.w9jds.marketbot">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />

<application
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
*/
public abstract class BaseDataManager implements DataLoadingSubject {

private Context context;
private Crest publicCrestApi;

private AtomicInteger loadingCount;
private List<DataLoadingCallbacks> loadingCallbacks;

public BaseDataManager(Context context) {
// setup the API access objects

this.context = context;
createPublicCrestApi();
loadingCount = new AtomicInteger(0);
}
Expand Down Expand Up @@ -51,7 +52,7 @@ protected void resetLoadingCount() {
private void createPublicCrestApi() {
publicCrestApi = new Crest.Builder()
.setPublicTranquilityEndpoint()
.build();
.build(context);
}

public Crest getPublicCrestApi() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public CheckMarketOrders(Context context) {

publicCrestApi = new Crest.Builder()
.setPublicTranquilityEndpoint()
.build();
.build(context);
}

@Override
Expand Down
82 changes: 74 additions & 8 deletions eveapi/src/main/java/com/w9jds/eveapi/Client/Crest.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
package com.w9jds.eveapi.Client;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;

import com.w9jds.eveapi.Callback;
import com.w9jds.eveapi.Models.MarketGroup;
import com.w9jds.eveapi.Models.MarketItemBase;
import com.w9jds.eveapi.Models.OrderType;
import com.w9jds.eveapi.Models.Type;
import com.w9jds.eveapi.Models.TypeInfo;
import com.w9jds.eveapi.Models.containers.MarketGroups;
import com.w9jds.eveapi.Models.Region;
import com.w9jds.eveapi.Models.containers.MarketOrders;
import com.w9jds.eveapi.Models.containers.Regions;
import com.w9jds.eveapi.Models.containers.Types;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
Expand All @@ -39,9 +48,16 @@ public final class Crest {
public static final String PUBLIC_TRANQUILITY = "https://public-crest.eveonline.com/";
public static final String TRANQUILITY = "https://crest-tq.eveonline.com/";

Endpoint crestEndpoint = new Builder()
.setTranquilityEndpoint()
.buildEndpoint();
final Context context;
Endpoint crestEndpoint;

public Crest (Context context) {
this.context = context;

this.crestEndpoint = new Builder()
.setTranquilityEndpoint()
.buildEndpoint(context);
}

public void setCrestEndpoint(Endpoint crestEndpoint) {
this.crestEndpoint = crestEndpoint;
Expand Down Expand Up @@ -227,6 +243,30 @@ public static class Builder {

private String basePath;

private Interceptor FORCE_CACHE_INTERCEPTOR = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();

request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();

return chain.proceed(request);
}
};

private Interceptor CACHE_2MONTHS_INTERCEPTOR = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Response response = chain.proceed(chain.request());

return response.newBuilder()
.header("Cache-Control", "private, max-age=5184000")
.build();
}
};

public Builder setSingularityEndpoint() {
this.basePath = SINGULARITY;
return this;
Expand All @@ -247,16 +287,42 @@ public Builder setTranquilityEndpoint() {
return this;
}

public Crest build() {
Crest crest = new Crest();
crest.setCrestEndpoint(buildEndpoint());
public Crest build(Context context) {
Crest crest = new Crest(context);
crest.setCrestEndpoint(buildEndpoint(context));
return crest;
}

public Endpoint buildEndpoint() {
private boolean isConnected(final Context context) {
ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}

private OkHttpClient createCachedClient(final Context context) {
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
int cacheSize = 10 * 1024 * 1024;
Cache cache = new Cache(httpCacheDirectory, cacheSize);

OkHttpClient.Builder builder = new OkHttpClient.Builder()
.cache(cache);

if (!isConnected(context)) {
builder.addNetworkInterceptor(FORCE_CACHE_INTERCEPTOR);
}
else {
builder.addNetworkInterceptor(CACHE_2MONTHS_INTERCEPTOR);
}

return builder.build();
}

public Endpoint buildEndpoint(Context context) {
return new Retrofit.Builder()
.baseUrl(basePath)
.addConverterFactory(GsonConverterFactory.create())
.client(createCachedClient(context))
.build()
.create(Endpoint.class);
}
Expand Down

0 comments on commit 916b865

Please sign in to comment.