package com.fastaccess.provider.rest;
import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.fastaccess.BuildConfig;
import com.fastaccess.R;
import com.fastaccess.data.dao.GitHubErrorResponse;
import com.fastaccess.data.dao.NameParser;
import com.fastaccess.data.service.GistService;
import com.fastaccess.data.service.IssueService;
import com.fastaccess.data.service.NotificationService;
import com.fastaccess.data.service.OrganizationService;
import com.fastaccess.data.service.PullRequestService;
import com.fastaccess.data.service.ReactionsService;
import com.fastaccess.data.service.RepoService;
import com.fastaccess.data.service.ReviewService;
import com.fastaccess.data.service.SearchService;
import com.fastaccess.data.service.SlackService;
import com.fastaccess.data.service.UserRestService;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.PrefGetter;
import com.fastaccess.provider.rest.converters.GithubResponseConverter;
import com.fastaccess.provider.rest.interceptors.AuthenticationInterceptor;
import com.fastaccess.provider.rest.interceptors.PaginationInterceptor;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.File;
import java.lang.reflect.Modifier;
import java.net.URI;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.HttpException;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
/**
* Created by Kosh on 08 Feb 2017, 8:37 PM
*/
public class RestProvider {
public static final int PAGE_SIZE = 30;
private static OkHttpClient okHttpClient;
public final static Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.setPrettyPrinting()
.create();
private static OkHttpClient provideOkHttpClient(boolean isRawString) {
if (okHttpClient == null) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
client.addInterceptor(new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY));
}
client.addInterceptor(new AuthenticationInterceptor(PrefGetter.getToken(), PrefGetter.getOtpCode()));
if (!isRawString) client.addInterceptor(new PaginationInterceptor());
client.addInterceptor(chain -> {
Request original = chain.request();
if (original.url() != HttpUrl.get(URI.create(NotificationService.SUBSCRIPTION_URL))) {
Request.Builder requestBuilder = original.newBuilder();
requestBuilder.addHeader("Accept", "application/vnd.github.v3+json")
.addHeader("Content-type", "application/vnd.github.v3+json");
requestBuilder.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
return chain.proceed(original);
});
okHttpClient = client.build();
}
return okHttpClient;
}
private static Retrofit provideRetrofit(boolean isRawString) {
return new Retrofit.Builder()
.baseUrl(BuildConfig.REST_URL)
.client(provideOkHttpClient(isRawString))
.addConverterFactory(new GithubResponseConverter(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
private static Retrofit provideRetrofit() {
return provideRetrofit(false);
}
public static void downloadFile(@NonNull Context context, @NonNull String url) {
if (InputHelper.isEmpty(url)) return;
Uri uri = Uri.parse(url);
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(uri);
File direct = new File(Environment.getExternalStorageDirectory() + File.separator + context.getString(R.string.app_name));
if (!direct.exists()) {
direct.mkdirs();
}
String fileName = "";
NameParser nameParser = new NameParser(url);
if (nameParser.getUsername() != null) {
fileName += nameParser.getUsername() + "_";
}
if (nameParser.getName() != null) {
fileName += nameParser.getName() + "_";
}
fileName += new File(url).getName();
request.setDestinationInExternalPublicDir(context.getString(R.string.app_name), fileName);
request.setTitle(fileName);
request.setDescription(context.getString(R.string.downloading_file));
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
downloadManager.enqueue(request);
}
public static int getErrorCode(Throwable throwable) {
if (throwable instanceof HttpException) {
return ((HttpException) throwable).code();
}
return -1;
}
@NonNull public static UserRestService getUserService() {
return provideRetrofit().create(UserRestService.class);
}
@NonNull public static GistService getGistService() {
return provideRetrofit().create(GistService.class);
}
@NonNull public static RepoService getRepoService() {
return getRepoService(false);
}
@NonNull public static RepoService getRepoService(boolean isRawString) {
return provideRetrofit(isRawString).create(RepoService.class);
}
@NonNull public static IssueService getIssueService() {
return provideRetrofit().create(IssueService.class);
}
@NonNull public static PullRequestService getPullRequestService() {
return provideRetrofit().create(PullRequestService.class);
}
@NonNull public static SearchService getSearchService() {
return provideRetrofit().create(SearchService.class);
}
@NonNull public static NotificationService getNotificationService() {
return provideRetrofit().create(NotificationService.class);
}
@NonNull public static ReactionsService getReactionsService() {
return provideRetrofit().create(ReactionsService.class);
}
@NonNull public static OrganizationService getOrgService() {
return provideRetrofit().create(OrganizationService.class);
}
@NonNull public static ReviewService getReviewService() {
return provideRetrofit().create(ReviewService.class);
}
@Nullable public static GitHubErrorResponse getErrorResponse(@NonNull Throwable throwable) {
ResponseBody body = null;
if (throwable instanceof HttpException) {
body = ((HttpException) throwable).response().errorBody();
}
if (body != null) {
try {
return gson.fromJson(body.string(), GitHubErrorResponse.class);
} catch (Exception ignored) {}
}
return null;
}
@NonNull public static SlackService getSlackService() {
return new Retrofit.Builder()
.baseUrl("https://ok13pknpj4.execute-api.eu-central-1.amazonaws.com/prod/")
.addConverterFactory(new GithubResponseConverter(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
.create(SlackService.class);
}
public static void clearHttpClient() {
okHttpClient = null;
}
}