package starter.kit.retrofit;
import android.text.TextUtils;
import com.orhanobut.logger.Logger;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
import starter.kit.util.Preconditions;
import starter.kit.util.Strings;
import support.ui.app.SupportApp;
import support.ui.utilities.AppInfo;
public final class Network {
private String baseUrl;
private Retrofit mRetrofit;
private OkHttpClient client;
// Make this class a thread safe singleton
private static class SingletonHolder {
private static final Network INSTANCE = new Network();
}
public static synchronized Network get() {
return SingletonHolder.INSTANCE;
}
private Network() {
}
public Retrofit retrofit() {
Preconditions.checkNotNull(baseUrl, "Base URL required.");
if (mRetrofit == null) {
mRetrofit = newRetrofitBuilder()
.baseUrl(baseUrl)
.client(client)
.addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create())
.build();
}
return mRetrofit;
}
protected Retrofit.Builder newRetrofitBuilder() {
return new Retrofit.Builder();
}
public static class Builder {
private String baseUrl;
private String accept;
private Headers.Builder headerBuilder;
private OkHttpClient mClient;
private boolean networkDebug;
public Network build() {
Preconditions.checkNotNull(baseUrl, "Base URL required.");
ensureSaneDefaults();
Network network = get();
network.baseUrl = baseUrl;
network.client = mClient;
return network;
}
private void ensureSaneDefaults() {
if (mClient == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (networkDebug) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor((message) -> Logger.d(message));
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addNetworkInterceptor(loggingInterceptor);
}
if (headerBuilder == null) {
headerBuilder = defaultHeader();
}
if (!Strings.isBlank(accept)) {
headerBuilder.add("Accept", accept);
}
DefaultHeaderInterceptor headerInterceptor = new DefaultHeaderInterceptor(headerBuilder);
builder.addInterceptor(headerInterceptor);
mClient = builder.build();
}
}
public Builder client(OkHttpClient client) {
mClient = client;
return this;
}
public Builder baseUrl(String baseUrl) {
Preconditions.checkNotNull(baseUrl, "baseUrl == null");
this.baseUrl = baseUrl;
return this;
}
public Builder networkDebug(boolean networkDebug) {
this.networkDebug = networkDebug;
return this;
}
public Builder accept(String accept) {
Preconditions.checkNotNull(accept, "accept == null");
this.accept = accept;
return this;
}
public Builder addHeader(String name, String value) {
if (headerBuilder == null) {
headerBuilder = defaultHeader();
}
headerBuilder.set(name, value);
return this;
}
private Headers.Builder defaultHeader() {
final AppInfo appInfo = SupportApp.appInfo();
Headers.Builder builder = new Headers.Builder();
builder.add("Content-Encoding", "gzip")
.add("X-Client-Build", String.valueOf(appInfo.versionCode))
.add("X-Client-Version", appInfo.version)
.add("X-Client", appInfo.deviceId)
.add("X-Language-Code", appInfo.languageCode)
.add("X-Client-Type", "android");
final String channel = appInfo.channel;
if (! TextUtils.isEmpty(channel)) {
builder.add("X-Client-Channel", channel);
}
return builder;
}
}
}