diff --git a/build.gradle b/build.gradle index 1c2eac1..6acab36 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,10 @@ buildscript { threetenabpVersion = '1.2.4' zxingEmbeddedVersion = '3.6.0' tunnelVersion = '1.0.20200407' + interceptorVersion = '3.12.2' + gsonVersion = '2.8.6' + retrofitVersion = '2.7.2' + converterGsonVersion = '2.7.2' groupName = 'com.wireguard.android' } diff --git a/ui/build.gradle b/ui/build.gradle index 99845b4..5901b65 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -81,6 +81,11 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion" implementation "net.sourceforge.streamsupport:android-retrofuture:$streamsupportVersion" + //Add for API Calls + implementation "com.squareup.okhttp3:logging-interceptor:$interceptorVersion" + implementation "com.google.code.gson:gson:$gsonVersion" + implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" + implementation "com.squareup.retrofit2:converter-gson:$converterGsonVersion" } tasks.withType(JavaCompile) { diff --git a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java new file mode 100644 index 0000000..57c2854 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java @@ -0,0 +1,5 @@ +package com.wireguard.android.api; + +public class ApiConstants { + public static final String BASE_URL = "https://jtest2.bubblesecure.com:1443/api/"; +} diff --git a/ui/src/main/java/com/wireguard/android/api/enums/Status.java b/ui/src/main/java/com/wireguard/android/api/enums/Status.java new file mode 100644 index 0000000..c868895 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/enums/Status.java @@ -0,0 +1,9 @@ +package com.wireguard.android.api.enums; +/** + Enum for status connection + **/ +public enum Status { + SUCCESS, + ERROR, + LOADING +} diff --git a/ui/src/main/java/com/wireguard/android/api/interceptor/AcceptInterceptor.java b/ui/src/main/java/com/wireguard/android/api/interceptor/AcceptInterceptor.java new file mode 100644 index 0000000..928385c --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/interceptor/AcceptInterceptor.java @@ -0,0 +1,21 @@ +package com.wireguard.android.api.interceptor; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + + +public class AcceptInterceptor implements Interceptor { + private final String ACCEPT_KEY = "Content-Type"; + private final String ACCEPT_HEADER = "application/json"; + + @Override + public Response intercept(Chain chain) throws IOException { + Request original = chain.request(); + Request.Builder builder = original.newBuilder().header(ACCEPT_KEY, ACCEPT_HEADER); + Request request = builder.build(); + return chain.proceed(request); + } +} diff --git a/ui/src/main/java/com/wireguard/android/api/interceptor/UserAgentInterceptor.java b/ui/src/main/java/com/wireguard/android/api/interceptor/UserAgentInterceptor.java new file mode 100644 index 0000000..73bf136 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/interceptor/UserAgentInterceptor.java @@ -0,0 +1,25 @@ +package com.wireguard.android.api.interceptor; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + + +public class UserAgentInterceptor implements Interceptor { + private final String USER_AGENT_HEADER_KEY = "User-Agent"; + private String userAgent; + + public UserAgentInterceptor(String userAgent) { + this.userAgent = userAgent; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request original = chain.request(); + Request.Builder builder = original.newBuilder().header(USER_AGENT_HEADER_KEY, userAgent); + Request request = builder.build(); + return chain.proceed(request); + } +} diff --git a/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java b/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java new file mode 100644 index 0000000..524c1c2 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java @@ -0,0 +1,6 @@ +package com.wireguard.android.api.network; +/** + Interface for API Calls + **/ +public interface ClientApi { +} diff --git a/ui/src/main/java/com/wireguard/android/api/network/ClientService.java b/ui/src/main/java/com/wireguard/android/api/network/ClientService.java new file mode 100644 index 0000000..4fc0d7a --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientService.java @@ -0,0 +1,47 @@ +package com.wireguard.android.api.network; + +import com.wireguard.android.api.ApiConstants; +import com.wireguard.android.api.interceptor.AcceptInterceptor; +import com.wireguard.android.api.interceptor.UserAgentInterceptor; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class ClientService { + private static volatile ClientService clientService = null; + + private ClientService() { + + } + + public static ClientService getInstance() { + if (clientService == null) { + synchronized (ClientService.class) { + if (clientService == null) { + clientService = new ClientService(); + } + } + } + return clientService; + } + + + public ClientApi createClientApi() { + + OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); + + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + httpClient.addInterceptor(interceptor); + + httpClient.addInterceptor(new AcceptInterceptor()); + httpClient.addInterceptor(new UserAgentInterceptor(System.getProperty("http.agent"))); + + return new Retrofit.Builder() + .baseUrl(ApiConstants.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(httpClient.build()) + .build().create(ClientApi.class); + } +} diff --git a/ui/src/main/java/com/wireguard/android/api/network/NetworkBoundStatusResource.java b/ui/src/main/java/com/wireguard/android/api/network/NetworkBoundStatusResource.java new file mode 100644 index 0000000..937a620 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/api/network/NetworkBoundStatusResource.java @@ -0,0 +1,27 @@ +package com.wireguard.android.api.network; + +import com.wireguard.android.resource.StatusResource; + +import androidx.annotation.MainThread; +import androidx.lifecycle.MutableLiveData; + +public abstract class NetworkBoundStatusResource { + private final MutableLiveData> mutableLiveData = new MutableLiveData<>(); + + @MainThread + public NetworkBoundStatusResource() { + mutableLiveData.setValue(StatusResource.loading()); + createCall(); + } + + @MainThread + protected abstract void createCall(); + + public void setMutableLiveData(StatusResource value) { + mutableLiveData.setValue(value); + } + + public final MutableLiveData> getMutableLiveData() { + return mutableLiveData; + } +} diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java new file mode 100644 index 0000000..1c85b1c --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -0,0 +1,29 @@ +package com.wireguard.android.repository; + +import com.wireguard.android.api.network.ClientApi; +import com.wireguard.android.api.network.ClientService; + +public class DataRepository { + private static volatile DataRepository instance; + private ClientApi clientApi; + + private DataRepository() + { + clientApi = ClientService.getInstance().createClientApi(); + } + + public static void buildRepositoryInstance() { + if (instance == null) { + synchronized (DataRepository.class) { + if (instance == null) { + instance = new DataRepository(); + } + } + } + } + + public static DataRepository getRepositoryInstance() { + return instance; + } + +} diff --git a/ui/src/main/java/com/wireguard/android/resource/StatusResource.java b/ui/src/main/java/com/wireguard/android/resource/StatusResource.java new file mode 100644 index 0000000..5317a6c --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/resource/StatusResource.java @@ -0,0 +1,32 @@ +package com.wireguard.android.resource; + +import com.wireguard.android.api.enums.Status; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class StatusResource { + @NonNull + public final Status status; + + @Nullable + public final String message; + + + private StatusResource(@NonNull Status status, @Nullable String message) { + this.status = status; + this.message = message; + } + + + public static StatusResource success() { + return new StatusResource<>(Status.SUCCESS,null); + } + + public static StatusResource error(String msg) { + return new StatusResource<>(Status.ERROR,msg); + } + + public static StatusResource loading() { + return new StatusResource<>(Status.LOADING,null); + } +}