From 1efa01e3c4ee81476a43a9fb433e6b7d6e7e5abf Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Mon, 25 May 2020 15:08:00 +0400 Subject: [PATCH 01/17] Adds model for Device. --- .../com/wireguard/android/model/Device.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 ui/src/main/java/com/wireguard/android/model/Device.java diff --git a/ui/src/main/java/com/wireguard/android/model/Device.java b/ui/src/main/java/com/wireguard/android/model/Device.java new file mode 100644 index 0000000..e56963d --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/model/Device.java @@ -0,0 +1,111 @@ +/* + * Copyright © 2020 WireGuard LLC. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.wireguard.android.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class Device { + @SerializedName("uuid") + @Expose + private String uuid; + @SerializedName("related") + @Expose + private String related; + @SerializedName("ctime") + @Expose + private long ctime; + @SerializedName("name") + @Expose + private String name; + @SerializedName("account") + @Expose + private String account; + @SerializedName("deviceType") + @Expose + private String deviceType; + @SerializedName("enabled") + @Expose + private boolean enabled; + @SerializedName("network") + @Expose + private String network; + @SerializedName("shortId") + @Expose + private String shortId; + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public void setRelated(final String related) { + this.related = related; + } + + public void setCtime(final long ctime) { + this.ctime = ctime; + } + + public void setName(final String name) { + this.name = name; + } + + public void setAccount(final String account) { + this.account = account; + } + + public void setDeviceType(final String deviceType) { + this.deviceType = deviceType; + } + + public void setEnabled(final boolean enabled) { + this.enabled = enabled; + } + + public void setNetwork(final String network) { + this.network = network; + } + + public void setShortId(final String shortId) { + this.shortId = shortId; + } + + public String getUuid() { + return uuid; + } + + public String getRelated() { + return related; + } + + public long getCtime() { + return ctime; + } + + public String getName() { + return name; + } + + public String getAccount() { + return account; + } + + public String getDeviceType() { + return deviceType; + } + + public boolean isEnabled() { + return enabled; + } + + public String getNetwork() { + return network; + } + + public String getShortId() { + return shortId; + } +} -- 2.17.1 From fd457874401ea3c3aaa6c94a5ff8574cb973c19c Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Mon, 25 May 2020 15:47:46 +0400 Subject: [PATCH 02/17] Adds get all Devices API call. --- .../wireguard/android/api/ApiConstants.java | 1 + .../android/api/network/ClientApi.java | 8 +++++ .../android/repository/DataRepository.java | 30 +++++++++++++++++++ .../android/viewmodel/LoginViewModel.java | 6 ++++ 4 files changed, 45 insertions(+) diff --git a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java index 6b35206..8c188e9 100644 --- a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java +++ b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java @@ -3,6 +3,7 @@ package com.wireguard.android.api; public class ApiConstants { public static final String BASE_URL = "https://jtest2.bubblesecure.com:1443/api/"; public static final String LOGIN_URL = "auth/login"; + public static final String ALL_DEVICES_URL = "me/devices"; public static final String USERNAME = "username"; public static final String PASSWORD = "password"; } 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 index c28f08a..c3821a6 100644 --- a/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java @@ -1,14 +1,19 @@ package com.wireguard.android.api.network; import com.wireguard.android.api.ApiConstants; +import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import java.util.HashMap; +import java.util.List; import retrofit2.Call; import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.HeaderMap; import retrofit2.http.POST; + /** Interface for API Calls **/ @@ -16,4 +21,7 @@ public interface ClientApi { @POST(ApiConstants.LOGIN_URL) Call login(@Body HashMap params); + + @GET(ApiConstants.ALL_DEVICES_URL) + Call> getAllDevices(@HeaderMap HashMap header); } diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index 6e855c6..a129787 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -2,15 +2,19 @@ package com.wireguard.android.repository; import android.content.Context; +import com.wireguard.android.activity.LoginActivity; import com.wireguard.android.api.ApiConstants; import com.wireguard.android.api.network.ClientApi; import com.wireguard.android.api.network.ClientService; import com.wireguard.android.api.network.NetworkBoundStatusResource; +import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.resource.StatusResource; import com.wireguard.android.util.UserStore; import java.util.HashMap; +import java.util.List; + import androidx.lifecycle.MutableLiveData; import retrofit2.Call; import retrofit2.Callback; @@ -71,6 +75,32 @@ public class DataRepository { }.getMutableLiveData(); } + public MutableLiveData> getAllDevices(Context context) { + return new NetworkBoundStatusResource() { + @Override protected void createCall() { + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put("X-Bubble-Session",token); + clientApi.getAllDevices(header).enqueue(new Callback>() { + @Override public void onResponse(final Call> call, final Response> response) { + if (response.isSuccessful()) { + List list = response.body(); + setMutableLiveData(StatusResource.success()); + } else { + String errorMessage = createErrorMessage(call, response); + setMutableLiveData(StatusResource.error(errorMessage)); + } + } + + @Override public void onFailure(final Call> call, final Throwable t) { + if (t instanceof Exception) { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); + } + } + }); + } + }.getMutableLiveData(); + } private String createErrorMessage(Call call, retrofit2.Response response) { return "Error: User agent: " + System.getProperty("http.agent") + ", Request body: " + call.request().body() + ", URL: " + diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index 3669b85..e3a75db 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -2,6 +2,7 @@ package com.wireguard.android.viewmodel; import android.content.Context; +import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.repository.DataRepository; import com.wireguard.android.resource.StatusResource; @@ -15,4 +16,9 @@ public class LoginViewModel extends ViewModel { public LiveData> login(String username,String password, Context context){ return DataRepository.getRepositoryInstance().login(username,password,context); } + + public LiveData> getAllDevices(Context context){ + return DataRepository.getRepositoryInstance().getAllDevices(context); + } + } -- 2.17.1 From 730209cc5396d396af7a13eff9d0129a6ceb4369 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Mon, 25 May 2020 16:02:08 +0400 Subject: [PATCH 03/17] Adds add device API call. --- .../wireguard/android/api/ApiConstants.java | 4 +++ .../android/api/network/ClientApi.java | 4 +++ .../android/repository/DataRepository.java | 32 ++++++++++++++++++- .../android/viewmodel/LoginViewModel.java | 3 ++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java index 8c188e9..5a25e5b 100644 --- a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java +++ b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java @@ -4,6 +4,10 @@ public class ApiConstants { public static final String BASE_URL = "https://jtest2.bubblesecure.com:1443/api/"; public static final String LOGIN_URL = "auth/login"; public static final String ALL_DEVICES_URL = "me/devices"; + public static final String ADD_DEVICE_URL = "me/devices"; public static final String USERNAME = "username"; public static final String PASSWORD = "password"; + public static final String HEADER = "X-Bubble-Session"; + public static final String DEVICE_NAME = "name"; + public static final String DEVICE_TYPE = "deviceType"; } 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 index c3821a6..63d43b5 100644 --- a/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java @@ -12,6 +12,7 @@ import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.HeaderMap; import retrofit2.http.POST; +import retrofit2.http.PUT; /** @@ -24,4 +25,7 @@ public interface ClientApi { @GET(ApiConstants.ALL_DEVICES_URL) Call> getAllDevices(@HeaderMap HashMap header); + + @PUT(ApiConstants.ADD_DEVICE_URL) + Call addDevice(@HeaderMap HashMap header , @Body HashMap body); } diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index a129787..5c3576d 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -80,7 +80,7 @@ public class DataRepository { @Override protected void createCall() { final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); - header.put("X-Bubble-Session",token); + header.put(ApiConstants.HEADER,token); clientApi.getAllDevices(header).enqueue(new Callback>() { @Override public void onResponse(final Call> call, final Response> response) { if (response.isSuccessful()) { @@ -102,6 +102,36 @@ public class DataRepository { }.getMutableLiveData(); } + public MutableLiveData> addDevice(String name ,Context context) { + return new NetworkBoundStatusResource() { + + @Override protected void createCall() { + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put(ApiConstants.HEADER,token); + final HashMap body = new HashMap<>(); + body.put(ApiConstants.DEVICE_NAME,name); + body.put(ApiConstants.DEVICE_TYPE,"android"); + clientApi.addDevice(header, body).enqueue(new Callback() { + @Override public void onResponse(final Call call, final Response response) { + if (response.isSuccessful()) { + setMutableLiveData(StatusResource.success()); + } else { + String errorMessage = createErrorMessage(call, response); + setMutableLiveData(StatusResource.error(errorMessage)); + } + } + + @Override public void onFailure(final Call call, final Throwable t) { + if (t instanceof Exception) { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); + } + } + }); + } + }.getMutableLiveData(); + } + private String createErrorMessage(Call call, retrofit2.Response response) { return "Error: User agent: " + System.getProperty("http.agent") + ", Request body: " + call.request().body() + ", URL: " + call.request().url() + ", Code: " + response.code() + ", Message: " + diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index e3a75db..1e6ae0d 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -21,4 +21,7 @@ public class LoginViewModel extends ViewModel { return DataRepository.getRepositoryInstance().getAllDevices(context); } + public LiveData> addDevice(String name, Context context){ + return DataRepository.getRepositoryInstance().addDevice(name,context); + } } -- 2.17.1 From b9ba7cd02e7d08fd946a3c2b5895315980e0bba3 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 14:58:27 +0400 Subject: [PATCH 04/17] Adds add device functionality. --- .../android/activity/LoginActivity.java | 25 ++- .../android/repository/DataRepository.java | 166 +++++++++++++++--- .../android/viewmodel/LoginViewModel.java | 4 +- 3 files changed, 164 insertions(+), 31 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index dcad03a..3e5f136 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -4,6 +4,8 @@ package com.wireguard.android.activity; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; + +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -13,6 +15,7 @@ import android.widget.EditText; import android.widget.Toast; import com.wireguard.android.R; import com.wireguard.android.api.ApiConstants; +import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.resource.StatusResource; import com.wireguard.android.viewmodel.LoginViewModel; @@ -62,7 +65,27 @@ public class LoginActivity extends AppCompatActivity { @Override public void onChanged(final StatusResource userStatusResource) { switch (userStatusResource.status){ case SUCCESS: - Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); + loginViewModel.addDevice(LoginActivity.this).observe(LoginActivity.this, new Observer>() { + @Override public void onChanged(final StatusResource deviceStatusResource) { + switch (deviceStatusResource.status){ + case SUCCESS: + Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(LoginActivity.this,MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + Log.d("TAG","Success"); + break; + case LOADING: + Log.d("TAG","Loading"); + break; + case ERROR: + Toast.makeText(LoginActivity.this,"Login Failed",Toast.LENGTH_SHORT).show(); + Log.d("TAG","Error"); + break; + } + } + }); + // Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); Log.d("TAG","Success"); break; case LOADING: diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index 5c3576d..f85fc4b 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -1,8 +1,9 @@ package com.wireguard.android.repository; import android.content.Context; - -import com.wireguard.android.activity.LoginActivity; +import android.os.Build; +import android.provider.Settings; +import android.provider.Settings.Secure; import com.wireguard.android.api.ApiConstants; import com.wireguard.android.api.network.ClientApi; import com.wireguard.android.api.network.ClientService; @@ -11,10 +12,9 @@ import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.resource.StatusResource; import com.wireguard.android.util.UserStore; - +import java.util.ArrayList; import java.util.HashMap; import java.util.List; - import androidx.lifecycle.MutableLiveData; import retrofit2.Call; import retrofit2.Callback; @@ -102,35 +102,124 @@ public class DataRepository { }.getMutableLiveData(); } - public MutableLiveData> addDevice(String name ,Context context) { + public MutableLiveData> addDevice(Context context) { return new NetworkBoundStatusResource() { - @Override protected void createCall() { - final String token = UserStore.getInstance(context).getToken(); - final HashMap header = new HashMap<>(); - header.put(ApiConstants.HEADER,token); - final HashMap body = new HashMap<>(); - body.put(ApiConstants.DEVICE_NAME,name); - body.put(ApiConstants.DEVICE_TYPE,"android"); - clientApi.addDevice(header, body).enqueue(new Callback() { - @Override public void onResponse(final Call call, final Response response) { - if (response.isSuccessful()) { - setMutableLiveData(StatusResource.success()); - } else { - String errorMessage = createErrorMessage(call, response); - setMutableLiveData(StatusResource.error(errorMessage)); - } - } + final String brand = getBrand(); + final String model = getDeviceModel(); + final String imei = getDeviceIMEI(context); + final String deviceName = brand + " " + model + " " + ":" + " " + imei; + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put(ApiConstants.HEADER,token); + clientApi.getAllDevices(header).enqueue(new Callback>() { + @Override public void onResponse(final Call> call, final Response> response) { + if (response.isSuccessful()) { + String brandModel = brand + " " + model + " "; + final List list = response.body(); + final List arrayListDevicesName = new ArrayList<>(); + boolean flag = true; + for (final Device device : list) { + final String[] deviceNameItem = device.getName().split(":"); + final String[] myDeviceName = deviceName.split(":"); + if(deviceNameItem.length>1){ + if(deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])){ + setMutableLiveData(StatusResource.success()); + flag = false; + break; + } + else { + final String[] itemDevice = device.getName().split(":"); + if (itemDevice.length != 1) { + if(itemDevice[0].contains(brandModel)) { + arrayListDevicesName.add(itemDevice[0]); + } + } + } + + } + } + if(flag) { + if (arrayListDevicesName.isEmpty()) { + brandModel = deviceName; + final HashMap body = new HashMap<>(); + body.put(ApiConstants.DEVICE_NAME, brandModel); + body.put(ApiConstants.DEVICE_TYPE, "android"); + clientApi.addDevice(header, body).enqueue(new Callback() { + @Override public void onResponse(final Call call, final Response response) { + if (response.isSuccessful()) { + setMutableLiveData(StatusResource.success()); + } else { + final String errorMessage = createErrorMessage(call, response); + setMutableLiveData(StatusResource.error(errorMessage)); + } + } + + @Override public void onFailure(final Call call, final Throwable t) { + if (t instanceof Exception) { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); + } + } + }); + } else { + for (int i = (arrayListDevicesName.size() - 1); i >= arrayListDevicesName.size() - 1; i--) { + if (arrayListDevicesName.get(i).contains(brandModel)) { + final char[] arr = arrayListDevicesName.get(i).toCharArray(); + if (arr[arr.length - 2] != ')') { + brandModel += "(2)" + " " + ":" + " " + imei; + } else { + String countDevice = ""; + int indexfirst = 0; + int indexlast = 0; + for (int j = arr.length - 1; j >= 0; j--) { + if (arr[j] == '(') { + indexfirst = j; + } + if (arr[j] == ')') { + indexlast = j; + } + } + final String device = new String(arr); + countDevice += device.substring(indexfirst + 1, indexlast); + int count = Integer.parseInt(countDevice); + count++; + brandModel += "(" + count + ")" + " " + ":" + " " + imei; + } + } + final HashMap body = new HashMap<>(); + body.put(ApiConstants.DEVICE_NAME, brandModel); + body.put(ApiConstants.DEVICE_TYPE, "android"); + clientApi.addDevice(header, body).enqueue(new Callback() { + @Override public void onResponse(final Call call, final Response response) { + if (response.isSuccessful()) { + setMutableLiveData(StatusResource.success()); + } else { + final String errorMessage = createErrorMessage(call, response); + setMutableLiveData(StatusResource.error(errorMessage)); + } + } + + @Override public void onFailure(final Call call, final Throwable t) { + if (t instanceof Exception) { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); + } + } + }); + } + } + } + } + } + @Override public void onFailure(final Call> call, final Throwable t) { + if (t instanceof Exception) { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); + } + } + }); - @Override public void onFailure(final Call call, final Throwable t) { - if (t instanceof Exception) { - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } } - }); + }.getMutableLiveData(); } - }.getMutableLiveData(); - } private String createErrorMessage(Call call, retrofit2.Response response) { return "Error: User agent: " + System.getProperty("http.agent") + ", Request body: " + call.request().body() + ", URL: " + @@ -143,4 +232,25 @@ public class DataRepository { return !UserStore.USER_TOKEN_DEFAULT_VALUE.equals(UserStore.getInstance(context).getToken()); } + private String getBrand() { + final String brand = Build.MANUFACTURER; + return capitalize(brand); + } + + + private String capitalize(final String brand) { + if (brand == null || brand.isEmpty()) { + return ""; + } + final char first = brand.charAt(0); + return Character.isUpperCase(first) ? brand : Character.toUpperCase(first) + brand.substring(1); + } + + private String getDeviceIMEI(final Context context) { + return Settings.Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); + } + + private String getDeviceModel(){ + return Build.MODEL; + } } diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index 1e6ae0d..5a2d388 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -21,7 +21,7 @@ public class LoginViewModel extends ViewModel { return DataRepository.getRepositoryInstance().getAllDevices(context); } - public LiveData> addDevice(String name, Context context){ - return DataRepository.getRepositoryInstance().addDevice(name,context); + public LiveData> addDevice(Context context){ + return DataRepository.getRepositoryInstance().addDevice(context); } } -- 2.17.1 From 8b9ed357b15f9c64e9a32bb5b1230d14f4ba635e Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 18:45:25 +0400 Subject: [PATCH 05/17] Deletes going MainActivity after adding device. --- .../java/com/wireguard/android/activity/LoginActivity.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index 3e5f136..d4aee33 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -70,9 +70,6 @@ public class LoginActivity extends AppCompatActivity { switch (deviceStatusResource.status){ case SUCCESS: Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); - Intent intent = new Intent(LoginActivity.this,MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); Log.d("TAG","Success"); break; case LOADING: -- 2.17.1 From 5557fcc6f444eef63f41a1d7ad2341dc1ad53858 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 18:57:45 +0400 Subject: [PATCH 06/17] Refactored code. --- .../com/wireguard/android/activity/LoginActivity.java | 1 - .../main/java/com/wireguard/android/api/ApiConstants.java | 2 +- .../com/wireguard/android/repository/DataRepository.java | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index d4aee33..eccad87 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -82,7 +82,6 @@ public class LoginActivity extends AppCompatActivity { } } }); - // Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); Log.d("TAG","Success"); break; case LOADING: diff --git a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java index 5a25e5b..6498069 100644 --- a/ui/src/main/java/com/wireguard/android/api/ApiConstants.java +++ b/ui/src/main/java/com/wireguard/android/api/ApiConstants.java @@ -7,7 +7,7 @@ public class ApiConstants { public static final String ADD_DEVICE_URL = "me/devices"; public static final String USERNAME = "username"; public static final String PASSWORD = "password"; - public static final String HEADER = "X-Bubble-Session"; + public static final String AUTHORIZATION_HEADER = "X-Bubble-Session"; public static final String DEVICE_NAME = "name"; public static final String DEVICE_TYPE = "deviceType"; } diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index f85fc4b..a0945ff 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -80,7 +80,7 @@ public class DataRepository { @Override protected void createCall() { final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); - header.put(ApiConstants.HEADER,token); + header.put(ApiConstants.AUTHORIZATION_HEADER,token); clientApi.getAllDevices(header).enqueue(new Callback>() { @Override public void onResponse(final Call> call, final Response> response) { if (response.isSuccessful()) { @@ -107,11 +107,11 @@ public class DataRepository { @Override protected void createCall() { final String brand = getBrand(); final String model = getDeviceModel(); - final String imei = getDeviceIMEI(context); + final String imei = getDeviceID(context); final String deviceName = brand + " " + model + " " + ":" + " " + imei; final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); - header.put(ApiConstants.HEADER,token); + header.put(ApiConstants.AUTHORIZATION_HEADER,token); clientApi.getAllDevices(header).enqueue(new Callback>() { @Override public void onResponse(final Call> call, final Response> response) { if (response.isSuccessful()) { @@ -246,7 +246,7 @@ public class DataRepository { return Character.isUpperCase(first) ? brand : Character.toUpperCase(first) + brand.substring(1); } - private String getDeviceIMEI(final Context context) { + private String getDeviceID(final Context context) { return Settings.Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); } -- 2.17.1 From 9c14a64a1861bf53350c828e1ffb12283556b1d8 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 19:21:23 +0400 Subject: [PATCH 07/17] Adds show during in API Call. --- .../android/activity/LoginActivity.java | 50 +++++++++++++++-- .../fragment/LoadingDialogFragment.java | 56 +++++++++++++++++++ .../res/layout/fragment_loading_dialog.xml | 28 ++++++++++ ui/src/main/res/values/colors.xml | 2 + ui/src/main/res/values/strings.xml | 1 + 5 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java create mode 100644 ui/src/main/res/layout/fragment_loading_dialog.xml diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index eccad87..de65020 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -2,11 +2,11 @@ package com.wireguard.android.activity; import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; - -import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; @@ -14,14 +14,12 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.wireguard.android.R; -import com.wireguard.android.api.ApiConstants; +import com.wireguard.android.fragment.LoadingDialogFragment; import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.resource.StatusResource; import com.wireguard.android.viewmodel.LoginViewModel; -import java.util.HashMap; - public class LoginActivity extends AppCompatActivity { private LoginViewModel loginViewModel; @@ -30,6 +28,11 @@ public class LoginActivity extends AppCompatActivity { private EditText password; private Button sign; + public static final String LOADING_TAG = "loading_tag"; + private final long LOADER_DELAY = 1000; + private LoadingDialogFragment loadingDialog; + private boolean showDialog = true; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -48,6 +51,7 @@ public class LoginActivity extends AppCompatActivity { @Override public void onClick(final View v) { final String username = userName.getText().toString().trim(); final String password = LoginActivity.this.password.getText().toString().trim(); + showLoadingDialog(); login(username,password); } }); @@ -69,6 +73,7 @@ public class LoginActivity extends AppCompatActivity { @Override public void onChanged(final StatusResource deviceStatusResource) { switch (deviceStatusResource.status){ case SUCCESS: + closeLoadingDialog(); Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); Log.d("TAG","Success"); break; @@ -95,4 +100,39 @@ public class LoginActivity extends AppCompatActivity { } }); } + public void showLoadingDialog() { + showDialog = true; + + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + if (showDialog) { + if (loadingDialog == null + || loadingDialog.getDialog() == null + || !loadingDialog.getDialog().isShowing() + || loadingDialog.isRemoving()) { + if (loadingDialog != null) { + loadingDialog.dismissAllowingStateLoss(); + } + if (getLifecycle().getCurrentState() == Lifecycle.State.RESUMED) { + loadingDialog = LoadingDialogFragment.newInstance(); + getSupportFragmentManager().beginTransaction(). + add(loadingDialog, LOADING_TAG).commitAllowingStateLoss(); + } + } + } + } + + }, LOADER_DELAY); + } + + public void closeLoadingDialog() { + showDialog = false; + if (loadingDialog != null && loadingDialog.getDialog() != null + && loadingDialog.getDialog().isShowing() + && !loadingDialog.isRemoving()) { + loadingDialog.dismissAllowingStateLoss(); + } + } } diff --git a/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java b/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java new file mode 100644 index 0000000..7643a06 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java @@ -0,0 +1,56 @@ +package com.wireguard.android.fragment; + +import android.app.Dialog; +import android.graphics.PorterDuff; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; +import com.wireguard.android.R; +import com.wireguard.android.activity.LoginActivity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.DialogFragment; + +public class LoadingDialogFragment extends DialogFragment { + + + private ProgressBar progressBar; + + public static LoadingDialogFragment newInstance() { + LoadingDialogFragment fragment = new LoadingDialogFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + final Dialog dialog = new Dialog(getActivity(), getTheme()) { + @Override + public void onBackPressed() { + if (getActivity().getSupportFragmentManager().findFragmentByTag(LoginActivity.LOADING_TAG) != null) { + getActivity().onBackPressed(); + } + super.onBackPressed(); + } + }; + return dialog; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_loading_dialog, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + progressBar = view.findViewById(R.id.progress); + progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.colorPrimaryDark), PorterDuff.Mode.SRC_IN); + } +} diff --git a/ui/src/main/res/layout/fragment_loading_dialog.xml b/ui/src/main/res/layout/fragment_loading_dialog.xml new file mode 100644 index 0000000..c088797 --- /dev/null +++ b/ui/src/main/res/layout/fragment_loading_dialog.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ui/src/main/res/values/colors.xml b/ui/src/main/res/values/colors.xml index 989c6fc..38e173c 100644 --- a/ui/src/main/res/values/colors.xml +++ b/ui/src/main/res/values/colors.xml @@ -25,4 +25,6 @@ #aa0000 #00aa00 #aaaa00 + + #C04B26 diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 5bdabba..997f8f4 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -241,4 +241,5 @@ Connect Disable Apps Please turn on internet connection + Loading -- 2.17.1 From 07bc3d8ea85a1e1ce68a3653de1f11d642209daf Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 20:18:05 +0400 Subject: [PATCH 08/17] Adds save device name in shared preferences and check device exist or no. --- .../android/activity/LoginActivity.java | 60 ++++++++++--------- .../android/repository/DataRepository.java | 7 +++ .../com/wireguard/android/util/UserStore.java | 9 +++ .../android/viewmodel/LoginViewModel.java | 4 ++ 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index de65020..011ed9d 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -67,35 +67,41 @@ public class LoginActivity extends AppCompatActivity { private void login(String username, String password) { loginViewModel.login(username,password,this).observe(this, new Observer>() { @Override public void onChanged(final StatusResource userStatusResource) { - switch (userStatusResource.status){ + switch (userStatusResource.status) { case SUCCESS: - loginViewModel.addDevice(LoginActivity.this).observe(LoginActivity.this, new Observer>() { - @Override public void onChanged(final StatusResource deviceStatusResource) { - switch (deviceStatusResource.status){ - case SUCCESS: - closeLoadingDialog(); - Toast.makeText(LoginActivity.this,"Success",Toast.LENGTH_SHORT).show(); - Log.d("TAG","Success"); - break; - case LOADING: - Log.d("TAG","Loading"); - break; - case ERROR: - Toast.makeText(LoginActivity.this,"Login Failed",Toast.LENGTH_SHORT).show(); - Log.d("TAG","Error"); - break; + if (loginViewModel.isDeviceLoggedIn(LoginActivity.this)) { + Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show(); + Log.d("TAG", "Success"); + closeLoadingDialog(); + } else { + loginViewModel.addDevice(LoginActivity.this).observe(LoginActivity.this, new Observer>() { + @Override public void onChanged(final StatusResource deviceStatusResource) { + switch (deviceStatusResource.status) { + case SUCCESS: + closeLoadingDialog(); + Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show(); + Log.d("TAG", "Success"); + break; + case LOADING: + Log.d("TAG", "Loading"); + break; + case ERROR: + Toast.makeText(LoginActivity.this, "Login Failed", Toast.LENGTH_SHORT).show(); + Log.d("TAG", "Error"); + break; + } } - } - }); - Log.d("TAG","Success"); - break; - case LOADING: - Log.d("TAG","Loading"); - break; - case ERROR: - Toast.makeText(LoginActivity.this,"Login Failed",Toast.LENGTH_SHORT).show(); - Log.d("TAG","Error"); - break; + }); + } + Log.d("TAG", "Success"); + break; + case LOADING: + Log.d("TAG", "Loading"); + break; + case ERROR: + Toast.makeText(LoginActivity.this, "Login Failed", Toast.LENGTH_SHORT).show(); + Log.d("TAG", "Error"); + break; } } }); diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index a0945ff..72c4971 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -125,6 +125,7 @@ public class DataRepository { if(deviceNameItem.length>1){ if(deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])){ setMutableLiveData(StatusResource.success()); + UserStore.getInstance(context).setDevice(device.getName()); flag = false; break; } @@ -148,6 +149,7 @@ public class DataRepository { clientApi.addDevice(header, body).enqueue(new Callback() { @Override public void onResponse(final Call call, final Response response) { if (response.isSuccessful()) { + UserStore.getInstance(context).setDevice(response.body().getName()); setMutableLiveData(StatusResource.success()); } else { final String errorMessage = createErrorMessage(call, response); @@ -192,6 +194,7 @@ public class DataRepository { clientApi.addDevice(header, body).enqueue(new Callback() { @Override public void onResponse(final Call call, final Response response) { if (response.isSuccessful()) { + UserStore.getInstance(context).setDevice(response.body().getName()); setMutableLiveData(StatusResource.success()); } else { final String errorMessage = createErrorMessage(call, response); @@ -253,4 +256,8 @@ public class DataRepository { private String getDeviceModel(){ return Build.MODEL; } + + public boolean isDeviceLoggedIn(Context context){ + return !UserStore.DEVICE_DEFAULT_VALUE.equals(UserStore.getInstance(context).getDevice()); + } } diff --git a/ui/src/main/java/com/wireguard/android/util/UserStore.java b/ui/src/main/java/com/wireguard/android/util/UserStore.java index 6c378a6..438c52c 100644 --- a/ui/src/main/java/com/wireguard/android/util/UserStore.java +++ b/ui/src/main/java/com/wireguard/android/util/UserStore.java @@ -9,7 +9,9 @@ public class UserStore { private static final String USER_SHARED_PREF = "com.wireguard.android.util.bubbleUserSharedPref"; private static final String USER_DATA_KEY = "com.wireguard.android.util.bubbleUserResponse"; + private static final String DEVICE_DATA_KEY = "com.wireguard.android.util.bubbleDeviceResponse"; public static final String USER_TOKEN_DEFAULT_VALUE = ""; + public static final String DEVICE_DEFAULT_VALUE = ""; public static UserStore getInstance(Context context) { if (instance == null) { @@ -35,4 +37,11 @@ public class UserStore { return sharedPreferences.getString(USER_DATA_KEY, USER_TOKEN_DEFAULT_VALUE); } + public void setDevice(String device){ + sharedPreferences.edit().putString(DEVICE_DATA_KEY, device).apply(); + } + + public String getDevice(){ + return sharedPreferences.getString(DEVICE_DATA_KEY, DEVICE_DEFAULT_VALUE); + } } diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index 5a2d388..8c8622d 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -24,4 +24,8 @@ public class LoginViewModel extends ViewModel { public LiveData> addDevice(Context context){ return DataRepository.getRepositoryInstance().addDevice(context); } + + public boolean isDeviceLoggedIn(Context context){ + return DataRepository.getRepositoryInstance().isDeviceLoggedIn(context); + } } -- 2.17.1 From adecef06d9f234ec01923575aa4bdbfd28ba30f1 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Tue, 26 May 2020 23:11:27 +0400 Subject: [PATCH 09/17] Adds Generic loader showing class. --- ui/src/main/AndroidManifest.xml | 2 +- .../android/activity/BaseActivityBubble.java | 61 +++++++++++++++++++ .../android/activity/LoginActivity.java | 49 +-------------- 3 files changed, 65 insertions(+), 47 deletions(-) create mode 100644 ui/src/main/java/com/wireguard/android/activity/BaseActivityBubble.java diff --git a/ui/src/main/AndroidManifest.xml b/ui/src/main/AndroidManifest.xml index 299ac2c..8bc6e6b 100644 --- a/ui/src/main/AndroidManifest.xml +++ b/ui/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + Date: Wed, 27 May 2020 00:37:31 +0400 Subject: [PATCH 10/17] Implements add device methods. --- .../android/activity/LoginActivity.java | 24 ---- .../com/wireguard/android/model/Device.java | 5 - .../android/repository/DataRepository.java | 121 ++++++++++++------ .../com/wireguard/android/util/UserStore.java | 14 +- .../android/viewmodel/LoginViewModel.java | 17 --- 5 files changed, 96 insertions(+), 85 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java index 79016e7..c30ff64 100644 --- a/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java +++ b/ui/src/main/java/com/wireguard/android/activity/LoginActivity.java @@ -10,7 +10,6 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.wireguard.android.R; -import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.resource.StatusResource; import com.wireguard.android.viewmodel.LoginViewModel; @@ -59,32 +58,9 @@ public class LoginActivity extends BaseActivityBubble { @Override public void onChanged(final StatusResource userStatusResource) { switch (userStatusResource.status) { case SUCCESS: - if (loginViewModel.isDeviceLoggedIn(LoginActivity.this)) { Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show(); Log.d("TAG", "Success"); closeLoadingDialog(); - } else { - loginViewModel.addDevice(LoginActivity.this).observe(LoginActivity.this, new Observer>() { - @Override public void onChanged(final StatusResource deviceStatusResource) { - switch (deviceStatusResource.status) { - case SUCCESS: - closeLoadingDialog(); - Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show(); - Log.d("TAG", "Success"); - break; - case LOADING: - Log.d("TAG", "Loading"); - break; - case ERROR: - closeLoadingDialog(); - Toast.makeText(LoginActivity.this, "Login Failed", Toast.LENGTH_SHORT).show(); - Log.d("TAG", "Error"); - break; - } - } - }); - } - Log.d("TAG", "Success"); break; case LOADING: Log.d("TAG", "Loading"); diff --git a/ui/src/main/java/com/wireguard/android/model/Device.java b/ui/src/main/java/com/wireguard/android/model/Device.java index e56963d..7820e68 100644 --- a/ui/src/main/java/com/wireguard/android/model/Device.java +++ b/ui/src/main/java/com/wireguard/android/model/Device.java @@ -1,8 +1,3 @@ -/* - * Copyright © 2020 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - package com.wireguard.android.model; import com.google.gson.annotations.Expose; diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index 72c4971..e0838c1 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -15,7 +15,9 @@ import com.wireguard.android.util.UserStore; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -57,10 +59,55 @@ public class DataRepository { if(response.isSuccessful()) { String token = response.body().getToken(); UserStore.getInstance(context).setToken(token); - setMutableLiveData(StatusResource.success()); + if(!isDeviceLoggedIn(context)){ + addDevice(context).observe((LifecycleOwner) context, new Observer>() { + @Override public void onChanged(final StatusResource deviceStatusResource) { + switch (deviceStatusResource.status){ + case SUCCESS: + setMutableLiveData(StatusResource.success()); + break; + case LOADING: + break; + case ERROR: + setMutableLiveData(StatusResource.error(createErrorMessage(call,response))); + break; + } + } + }); + } + else { + getAllDevices(context).observe((LifecycleOwner) context, new Observer>() { + @Override public void onChanged(final List devices) { + boolean flag = true; + for (Device item : devices) { + if (UserStore.getInstance(context).getDeviceID().equals(item.getUuid())) { + setMutableLiveData(StatusResource.success()); + flag = false; + break; + } + } + if(flag) { + addDevice(context).observe((LifecycleOwner) context, new Observer>() { + @Override public void onChanged(final StatusResource deviceStatusResource) { + switch (deviceStatusResource.status) { + case SUCCESS: + setMutableLiveData(StatusResource.success()); + break; + case LOADING: + break; + case ERROR: + setMutableLiveData(StatusResource.error(createErrorMessage(call, response))); + break; + } + } + }); + } + } + }); + } } else { - String errorMessage = createErrorMessage(call,response); + final String errorMessage = createErrorMessage(call,response); setMutableLiveData(StatusResource.error(errorMessage)); } } @@ -75,34 +122,7 @@ public class DataRepository { }.getMutableLiveData(); } - public MutableLiveData> getAllDevices(Context context) { - return new NetworkBoundStatusResource() { - @Override protected void createCall() { - final String token = UserStore.getInstance(context).getToken(); - final HashMap header = new HashMap<>(); - header.put(ApiConstants.AUTHORIZATION_HEADER,token); - clientApi.getAllDevices(header).enqueue(new Callback>() { - @Override public void onResponse(final Call> call, final Response> response) { - if (response.isSuccessful()) { - List list = response.body(); - setMutableLiveData(StatusResource.success()); - } else { - String errorMessage = createErrorMessage(call, response); - setMutableLiveData(StatusResource.error(errorMessage)); - } - } - - @Override public void onFailure(final Call> call, final Throwable t) { - if (t instanceof Exception) { - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } - } - }); - } - }.getMutableLiveData(); - } - - public MutableLiveData> addDevice(Context context) { + private MutableLiveData> addDevice(Context context) { return new NetworkBoundStatusResource() { @Override protected void createCall() { final String brand = getBrand(); @@ -125,7 +145,8 @@ public class DataRepository { if(deviceNameItem.length>1){ if(deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])){ setMutableLiveData(StatusResource.success()); - UserStore.getInstance(context).setDevice(device.getName()); + UserStore.getInstance(context).setDeviceName(device.getName()); + UserStore.getInstance(context).setDeviceID(device.getUuid()); flag = false; break; } @@ -149,7 +170,8 @@ public class DataRepository { clientApi.addDevice(header, body).enqueue(new Callback() { @Override public void onResponse(final Call call, final Response response) { if (response.isSuccessful()) { - UserStore.getInstance(context).setDevice(response.body().getName()); + UserStore.getInstance(context).setDeviceName(response.body().getName()); + UserStore.getInstance(context).setDeviceID(response.body().getUuid()); setMutableLiveData(StatusResource.success()); } else { final String errorMessage = createErrorMessage(call, response); @@ -194,7 +216,8 @@ public class DataRepository { clientApi.addDevice(header, body).enqueue(new Callback() { @Override public void onResponse(final Call call, final Response response) { if (response.isSuccessful()) { - UserStore.getInstance(context).setDevice(response.body().getName()); + UserStore.getInstance(context).setDeviceName(response.body().getName()); + UserStore.getInstance(context).setDeviceID(response.body().getUuid()); setMutableLiveData(StatusResource.success()); } else { final String errorMessage = createErrorMessage(call, response); @@ -224,6 +247,34 @@ public class DataRepository { }.getMutableLiveData(); } + private MutableLiveData> getAllDevices(Context context){ + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put(ApiConstants.AUTHORIZATION_HEADER,token); + MutableLiveData> liveData = new MutableLiveData<>(); + clientApi.getAllDevices(header).enqueue(new Callback>() { + @Override public void onResponse(final Call> call, final Response> response) { + if (response.isSuccessful()) { + liveData.setValue(response.body()); + } else { + + } + } + + @Override public void onFailure(final Call> call, final Throwable t) { + if (t instanceof Exception) { + + } + } + }); + + return liveData; + } + + private boolean isDeviceLoggedIn(Context context){ + return !UserStore.DEVICE_DEFAULT_VALUE.equals(UserStore.getInstance(context).getDeviceName()); + } + private String createErrorMessage(Call call, retrofit2.Response response) { return "Error: User agent: " + System.getProperty("http.agent") + ", Request body: " + call.request().body() + ", URL: " + call.request().url() + ", Code: " + response.code() + ", Message: " + @@ -256,8 +307,4 @@ public class DataRepository { private String getDeviceModel(){ return Build.MODEL; } - - public boolean isDeviceLoggedIn(Context context){ - return !UserStore.DEVICE_DEFAULT_VALUE.equals(UserStore.getInstance(context).getDevice()); - } } diff --git a/ui/src/main/java/com/wireguard/android/util/UserStore.java b/ui/src/main/java/com/wireguard/android/util/UserStore.java index 438c52c..8537f31 100644 --- a/ui/src/main/java/com/wireguard/android/util/UserStore.java +++ b/ui/src/main/java/com/wireguard/android/util/UserStore.java @@ -10,8 +10,10 @@ public class UserStore { private static final String USER_SHARED_PREF = "com.wireguard.android.util.bubbleUserSharedPref"; private static final String USER_DATA_KEY = "com.wireguard.android.util.bubbleUserResponse"; private static final String DEVICE_DATA_KEY = "com.wireguard.android.util.bubbleDeviceResponse"; + private static final String DEVICE_ID_KEY = "com.wireguard.android.util.bubbleDeviceIDResponse"; public static final String USER_TOKEN_DEFAULT_VALUE = ""; public static final String DEVICE_DEFAULT_VALUE = ""; + public static final String DEVICE_ID_DEFAULT_VALUE = ""; public static UserStore getInstance(Context context) { if (instance == null) { @@ -37,11 +39,19 @@ public class UserStore { return sharedPreferences.getString(USER_DATA_KEY, USER_TOKEN_DEFAULT_VALUE); } - public void setDevice(String device){ + public void setDeviceName(String device){ sharedPreferences.edit().putString(DEVICE_DATA_KEY, device).apply(); } - public String getDevice(){ + public String getDeviceName(){ return sharedPreferences.getString(DEVICE_DATA_KEY, DEVICE_DEFAULT_VALUE); } + + public void setDeviceID(String id){ + sharedPreferences.edit().putString(DEVICE_ID_KEY,id).apply(); + } + + public String getDeviceID(){ + return sharedPreferences.getString(DEVICE_ID_KEY,DEVICE_ID_DEFAULT_VALUE); + } } diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index 8c8622d..3b3b0ec 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -1,14 +1,9 @@ package com.wireguard.android.viewmodel; import android.content.Context; - -import com.wireguard.android.model.Device; import com.wireguard.android.model.User; import com.wireguard.android.repository.DataRepository; import com.wireguard.android.resource.StatusResource; - -import java.util.HashMap; - import androidx.lifecycle.LiveData; import androidx.lifecycle.ViewModel; @@ -16,16 +11,4 @@ public class LoginViewModel extends ViewModel { public LiveData> login(String username,String password, Context context){ return DataRepository.getRepositoryInstance().login(username,password,context); } - - public LiveData> getAllDevices(Context context){ - return DataRepository.getRepositoryInstance().getAllDevices(context); - } - - public LiveData> addDevice(Context context){ - return DataRepository.getRepositoryInstance().addDevice(context); - } - - public boolean isDeviceLoggedIn(Context context){ - return DataRepository.getRepositoryInstance().isDeviceLoggedIn(context); - } } -- 2.17.1 From e8ffc8f8bf151df2e1d8ebd8dfe6e68568bd6569 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Wed, 27 May 2020 19:19:54 +0400 Subject: [PATCH 11/17] Adds dependencies for RxJava. --- build.gradle | 3 +++ ui/build.gradle | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 6e60a78..6555854 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,9 @@ buildscript { constraintlayoutVersion = '1.1.3' lifecycleExtensionVersion = '2.2.0' lifecycleViewModelVersion = '2.2.0' + rxandroidVersion = '2.0.1' + rxjavaVersion = '2.1.6' + adapterrxjava2Version = '2.3.0' groupName = 'com.wireguard.android' } diff --git a/ui/build.gradle b/ui/build.gradle index a855be0..8bd3f6a 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -90,6 +90,10 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionVersion" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycleViewModelVersion" + //RxJava + implementation "io.reactivex.rxjava2:rxandroid:$rxandroidVersion" + implementation "io.reactivex.rxjava2:rxjava:$rxjavaVersion" + implementation "com.squareup.retrofit2:adapter-rxjava2:$adapterrxjava2Version" } tasks.withType(JavaCompile) { -- 2.17.1 From c633443f249c83f0151623216cdcd1178bb0c7c3 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Thu, 28 May 2020 13:15:24 +0400 Subject: [PATCH 12/17] Change login,getAllDevices and addDevice methods implementation in RxJava. --- .../android/api/network/ClientApi.java | 7 +- .../android/api/network/ClientService.java | 2 + .../android/repository/DataRepository.java | 356 +++++++----------- .../android/viewmodel/LoginViewModel.java | 5 + 4 files changed, 156 insertions(+), 214 deletions(-) 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 index 63d43b5..4a40cfc 100644 --- a/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientApi.java @@ -7,6 +7,7 @@ import com.wireguard.android.model.User; import java.util.HashMap; import java.util.List; +import io.reactivex.Single; import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.GET; @@ -21,11 +22,11 @@ import retrofit2.http.PUT; public interface ClientApi { @POST(ApiConstants.LOGIN_URL) - Call login(@Body HashMap params); + Single login(@Body HashMap params); @GET(ApiConstants.ALL_DEVICES_URL) - Call> getAllDevices(@HeaderMap HashMap header); + Single> getAllDevices(@HeaderMap HashMap header); @PUT(ApiConstants.ADD_DEVICE_URL) - Call addDevice(@HeaderMap HashMap header , @Body HashMap body); + Single addDevice(@HeaderMap HashMap header , @Body HashMap body); } 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 index 4fc0d7a..2b2b419 100644 --- a/ui/src/main/java/com/wireguard/android/api/network/ClientService.java +++ b/ui/src/main/java/com/wireguard/android/api/network/ClientService.java @@ -6,6 +6,7 @@ import com.wireguard.android.api.interceptor.UserAgentInterceptor; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class ClientService { @@ -41,6 +42,7 @@ public class ClientService { return new Retrofit.Builder() .baseUrl(ApiConstants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(httpClient.build()) .build().create(ClientApi.class); } diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index e0838c1..7eb3371 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -15,22 +15,23 @@ import com.wireguard.android.util.UserStore; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; public class DataRepository { private static volatile DataRepository instance; private ClientApi clientApi; + private CompositeDisposable compositeDisposable; public static final String NO_INTERNET_CONNECTION = "no_internet_connection"; - private DataRepository() - { + private DataRepository() { clientApi = ClientService.getInstance().createClientApi(); + compositeDisposable = new CompositeDisposable(); } public static void buildRepositoryInstance() { @@ -47,231 +48,161 @@ public class DataRepository { return instance; } - public MutableLiveData> login(String username,String password , Context context){ - return new NetworkBoundStatusResource(){ + public MutableLiveData> login(String username, String password, Context context) { + return new NetworkBoundStatusResource() { @Override protected void createCall() { - HashMap data = new HashMap<>(); - data.put(ApiConstants.USERNAME,username); - data.put(ApiConstants.PASSWORD,password); - clientApi.login(data).enqueue(new Callback() { - @Override public void onResponse(final Call call, final Response response) { - if(response.isSuccessful()) { - String token = response.body().getToken(); - UserStore.getInstance(context).setToken(token); - if(!isDeviceLoggedIn(context)){ - addDevice(context).observe((LifecycleOwner) context, new Observer>() { - @Override public void onChanged(final StatusResource deviceStatusResource) { - switch (deviceStatusResource.status){ - case SUCCESS: - setMutableLiveData(StatusResource.success()); - break; - case LOADING: - break; - case ERROR: - setMutableLiveData(StatusResource.error(createErrorMessage(call,response))); - break; - } - } - }); + HashMap data = new HashMap<>(); + data.put(ApiConstants.USERNAME, username); + data.put(ApiConstants.PASSWORD, password); + Disposable disposable = clientApi.login(data) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(user -> { + UserStore.getInstance(context).setToken(user.getToken()); + if (!isDeviceLoggedIn(context)) { + addDevice(context); } else { - getAllDevices(context).observe((LifecycleOwner) context, new Observer>() { - @Override public void onChanged(final List devices) { - boolean flag = true; - for (Device item : devices) { - if (UserStore.getInstance(context).getDeviceID().equals(item.getUuid())) { - setMutableLiveData(StatusResource.success()); - flag = false; - break; - } - } - if(flag) { - addDevice(context).observe((LifecycleOwner) context, new Observer>() { - @Override public void onChanged(final StatusResource deviceStatusResource) { - switch (deviceStatusResource.status) { - case SUCCESS: - setMutableLiveData(StatusResource.success()); - break; - case LOADING: - break; - case ERROR: - setMutableLiveData(StatusResource.error(createErrorMessage(call, response))); - break; - } - } - }); - } - } - }); + getAllDevices(context); } - } - else { - final String errorMessage = createErrorMessage(call,response); - setMutableLiveData(StatusResource.error(errorMessage)); - } - } + }, throwable -> { + setMutableLiveData(StatusResource.error(throwable.getMessage())); + }); + compositeDisposable.add(disposable); + } - @Override public void onFailure(final Call call, final Throwable t) { - if(t instanceof Exception){ - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } - } - }); + private void getAllDevices(final Context context) { + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put(ApiConstants.AUTHORIZATION_HEADER,token); + Disposable disposable1 = clientApi.getAllDevices(header) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listDevices->{ + boolean flag = true; + for (Device item : listDevices) { + if (UserStore.getInstance(context).getDeviceID().equals(item.getUuid())) { + setMutableLiveData(StatusResource.success()); + flag = false; + break; + } + } + if(flag) { + addDevice(context); + } + },throwable -> { + + }); + compositeDisposable.add(disposable1); } - }.getMutableLiveData(); - } - private MutableLiveData> addDevice(Context context) { - return new NetworkBoundStatusResource() { - @Override protected void createCall() { - final String brand = getBrand(); - final String model = getDeviceModel(); - final String imei = getDeviceID(context); - final String deviceName = brand + " " + model + " " + ":" + " " + imei; - final String token = UserStore.getInstance(context).getToken(); - final HashMap header = new HashMap<>(); - header.put(ApiConstants.AUTHORIZATION_HEADER,token); - clientApi.getAllDevices(header).enqueue(new Callback>() { - @Override public void onResponse(final Call> call, final Response> response) { - if (response.isSuccessful()) { - String brandModel = brand + " " + model + " "; - final List list = response.body(); - final List arrayListDevicesName = new ArrayList<>(); - boolean flag = true; - for (final Device device : list) { - final String[] deviceNameItem = device.getName().split(":"); - final String[] myDeviceName = deviceName.split(":"); - if(deviceNameItem.length>1){ - if(deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])){ - setMutableLiveData(StatusResource.success()); - UserStore.getInstance(context).setDeviceName(device.getName()); - UserStore.getInstance(context).setDeviceID(device.getUuid()); - flag = false; - break; - } - else { - final String[] itemDevice = device.getName().split(":"); - if (itemDevice.length != 1) { - if(itemDevice[0].contains(brandModel)) { - arrayListDevicesName.add(itemDevice[0]); - } - } + private void addDevice(final Context context) { + final String brand = getBrand(); + final String model = getDeviceModel(); + final String imei = getDeviceID(context); + final String deviceName = brand + " " + model + " " + ":" + " " + imei; + final String token = UserStore.getInstance(context).getToken(); + final HashMap header = new HashMap<>(); + header.put(ApiConstants.AUTHORIZATION_HEADER, token); + final Disposable disposable1 = clientApi.getAllDevices(header) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listDevices -> { + String brandModel = brand + " " + model + " "; + final List list = listDevices; + final List arrayListDevicesName = new ArrayList<>(); + boolean flag = true; + for (final Device device : list) { + final String[] deviceNameItem = device.getName().split(":"); + final String[] myDeviceName = deviceName.split(":"); + if (deviceNameItem.length > 1) { + if (deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])) { + UserStore.getInstance(context).setDeviceName(device.getName()); + UserStore.getInstance(context).setDeviceID(device.getUuid()); + flag = false; + setMutableLiveData(StatusResource.success()); + break; + } else { + final String[] itemDevice = device.getName().split(":"); + if (itemDevice.length != 1) { + if (itemDevice[0].contains(brandModel)) { + arrayListDevicesName.add(itemDevice[0]); } - } } - if(flag) { - if (arrayListDevicesName.isEmpty()) { - brandModel = deviceName; - final HashMap body = new HashMap<>(); - body.put(ApiConstants.DEVICE_NAME, brandModel); - body.put(ApiConstants.DEVICE_TYPE, "android"); - clientApi.addDevice(header, body).enqueue(new Callback() { - @Override public void onResponse(final Call call, final Response response) { - if (response.isSuccessful()) { - UserStore.getInstance(context).setDeviceName(response.body().getName()); - UserStore.getInstance(context).setDeviceID(response.body().getUuid()); - setMutableLiveData(StatusResource.success()); - } else { - final String errorMessage = createErrorMessage(call, response); - setMutableLiveData(StatusResource.error(errorMessage)); - } - } - @Override public void onFailure(final Call call, final Throwable t) { - if (t instanceof Exception) { - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } - } + } + } + if (flag) { + if (arrayListDevicesName.isEmpty()) { + brandModel = deviceName; + final HashMap body = new HashMap<>(); + body.put(ApiConstants.DEVICE_NAME, brandModel); + body.put(ApiConstants.DEVICE_TYPE, "android"); + final Disposable disposable2 = clientApi.addDevice(header, body) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(device -> { + UserStore.getInstance(context).setDeviceName(device.getName()); + UserStore.getInstance(context).setDeviceID(device.getUuid()); + setMutableLiveData(StatusResource.success()); + }, throwable -> { + setMutableLiveData(StatusResource.error(throwable.getMessage())); }); - } else { - for (int i = (arrayListDevicesName.size() - 1); i >= arrayListDevicesName.size() - 1; i--) { - if (arrayListDevicesName.get(i).contains(brandModel)) { - final char[] arr = arrayListDevicesName.get(i).toCharArray(); - if (arr[arr.length - 2] != ')') { - brandModel += "(2)" + " " + ":" + " " + imei; - } else { - String countDevice = ""; - int indexfirst = 0; - int indexlast = 0; - for (int j = arr.length - 1; j >= 0; j--) { - if (arr[j] == '(') { - indexfirst = j; - } - if (arr[j] == ')') { - indexlast = j; - } - } - final String device = new String(arr); - countDevice += device.substring(indexfirst + 1, indexlast); - int count = Integer.parseInt(countDevice); - count++; - brandModel += "(" + count + ")" + " " + ":" + " " + imei; - } - } - final HashMap body = new HashMap<>(); - body.put(ApiConstants.DEVICE_NAME, brandModel); - body.put(ApiConstants.DEVICE_TYPE, "android"); - clientApi.addDevice(header, body).enqueue(new Callback() { - @Override public void onResponse(final Call call, final Response response) { - if (response.isSuccessful()) { - UserStore.getInstance(context).setDeviceName(response.body().getName()); - UserStore.getInstance(context).setDeviceID(response.body().getUuid()); - setMutableLiveData(StatusResource.success()); - } else { - final String errorMessage = createErrorMessage(call, response); - setMutableLiveData(StatusResource.error(errorMessage)); - } + compositeDisposable.add(disposable2); + } + else { + for (int i = (arrayListDevicesName.size() - 1); i >= arrayListDevicesName.size() - 1; i--) { + if (arrayListDevicesName.get(i).contains(brandModel)) { + final char[] arr = arrayListDevicesName.get(i).toCharArray(); + if (arr[arr.length - 2] != ')') { + brandModel += "(2)" + " " + ":" + " " + imei; + } else { + String countDevice = ""; + int indexfirst = 0; + int indexlast = 0; + for (int j = arr.length - 1; j >= 0; j--) { + if (arr[j] == '(') { + indexfirst = j; } - - @Override public void onFailure(final Call call, final Throwable t) { - if (t instanceof Exception) { - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } + if (arr[j] == ')') { + indexlast = j; } - }); + } + final String device = new String(arr); + countDevice += device.substring(indexfirst + 1, indexlast); + int count = Integer.parseInt(countDevice); + count++; + brandModel += "(" + count + ")" + " " + ":" + " " + imei; } } + final HashMap body = new HashMap<>(); + body.put(ApiConstants.DEVICE_NAME, brandModel); + body.put(ApiConstants.DEVICE_TYPE, "android"); + Disposable disposable2 = clientApi.addDevice(header,body) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(device -> { + UserStore.getInstance(context).setDeviceName(device.getName()); + UserStore.getInstance(context).setDeviceID(device.getUuid()); + setMutableLiveData(StatusResource.success()); + },throwable -> { + setMutableLiveData(StatusResource.error(throwable.getMessage())); + }); + compositeDisposable.add(disposable2); } } } - @Override public void onFailure(final Call> call, final Throwable t) { - if (t instanceof Exception) { - setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); - } - } + }, throwable -> { + setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); }); - - } - }.getMutableLiveData(); - } - - private MutableLiveData> getAllDevices(Context context){ - final String token = UserStore.getInstance(context).getToken(); - final HashMap header = new HashMap<>(); - header.put(ApiConstants.AUTHORIZATION_HEADER,token); - MutableLiveData> liveData = new MutableLiveData<>(); - clientApi.getAllDevices(header).enqueue(new Callback>() { - @Override public void onResponse(final Call> call, final Response> response) { - if (response.isSuccessful()) { - liveData.setValue(response.body()); - } else { - - } - } - - @Override public void onFailure(final Call> call, final Throwable t) { - if (t instanceof Exception) { - - } - } - }); - - return liveData; + compositeDisposable.add(disposable1); } + }.getMutableLiveData(); + } - private boolean isDeviceLoggedIn(Context context){ + private boolean isDeviceLoggedIn(Context context) { return !UserStore.DEVICE_DEFAULT_VALUE.equals(UserStore.getInstance(context).getDeviceName()); } @@ -281,8 +212,7 @@ public class DataRepository { response.message(); } - public boolean isUserLoggedIn(Context context) - { + public boolean isUserLoggedIn(Context context) { return !UserStore.USER_TOKEN_DEFAULT_VALUE.equals(UserStore.getInstance(context).getToken()); } @@ -304,7 +234,11 @@ public class DataRepository { return Settings.Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); } - private String getDeviceModel(){ + private String getDeviceModel() { return Build.MODEL; } + + public void clearDisposable(){ + compositeDisposable.clear(); + } } diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java index 3b3b0ec..b804581 100644 --- a/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java +++ b/ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java @@ -11,4 +11,9 @@ public class LoginViewModel extends ViewModel { public LiveData> login(String username,String password, Context context){ return DataRepository.getRepositoryInstance().login(username,password,context); } + + @Override protected void onCleared() { + super.onCleared(); + DataRepository.getRepositoryInstance().clearDisposable(); + } } -- 2.17.1 From 431242b3f857cac61bf5a6c38ce396e0681763aa Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Thu, 28 May 2020 13:17:56 +0400 Subject: [PATCH 13/17] Remove BaseActivityBubble in manifest. --- ui/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/main/AndroidManifest.xml b/ui/src/main/AndroidManifest.xml index 8bc6e6b..a708955 100644 --- a/ui/src/main/AndroidManifest.xml +++ b/ui/src/main/AndroidManifest.xml @@ -72,7 +72,6 @@ - Date: Thu, 28 May 2020 13:19:32 +0400 Subject: [PATCH 14/17] Change LoginActivity tag in BaseActivityBubble tag. --- .../com/wireguard/android/fragment/LoadingDialogFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java b/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java index 7643a06..1bcfea1 100644 --- a/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java +++ b/ui/src/main/java/com/wireguard/android/fragment/LoadingDialogFragment.java @@ -8,6 +8,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import com.wireguard.android.R; +import com.wireguard.android.activity.BaseActivityBubble; import com.wireguard.android.activity.LoginActivity; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -32,7 +33,7 @@ public class LoadingDialogFragment extends DialogFragment { final Dialog dialog = new Dialog(getActivity(), getTheme()) { @Override public void onBackPressed() { - if (getActivity().getSupportFragmentManager().findFragmentByTag(LoginActivity.LOADING_TAG) != null) { + if (getActivity().getSupportFragmentManager().findFragmentByTag(BaseActivityBubble.LOADING_TAG) != null) { getActivity().onBackPressed(); } super.onBackPressed(); -- 2.17.1 From ef966882d958103a03f6b97cf9adfa153a420696 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Thu, 28 May 2020 13:44:03 +0400 Subject: [PATCH 15/17] Refactor code. --- .../android/repository/DataRepository.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index 7eb3371..b7a7876 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -28,6 +28,9 @@ public class DataRepository { private CompositeDisposable compositeDisposable; public static final String NO_INTERNET_CONNECTION = "no_internet_connection"; + private static final String SEPARATOR = ":"; + private static final String SPACE = " "; + private static final int ANDROID_ID = 1; private DataRepository() { clientApi = ClientService.getInstance().createClientApi(); @@ -101,7 +104,7 @@ public class DataRepository { final String brand = getBrand(); final String model = getDeviceModel(); final String imei = getDeviceID(context); - final String deviceName = brand + " " + model + " " + ":" + " " + imei; + final String deviceName = brand + SPACE + model + SPACE + SEPARATOR + SPACE + imei; final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); header.put(ApiConstants.AUTHORIZATION_HEADER, token); @@ -109,22 +112,22 @@ public class DataRepository { .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(listDevices -> { - String brandModel = brand + " " + model + " "; + String brandModel = brand + SPACE + model + SPACE; final List list = listDevices; final List arrayListDevicesName = new ArrayList<>(); - boolean flag = true; + boolean isHaveDevice = false; for (final Device device : list) { - final String[] deviceNameItem = device.getName().split(":"); - final String[] myDeviceName = deviceName.split(":"); + final String[] deviceNameItem = device.getName().split(SEPARATOR); + final String[] myDeviceName = deviceName.split(SEPARATOR); if (deviceNameItem.length > 1) { - if (deviceNameItem[0].contains(myDeviceName[0]) && deviceNameItem[1].contains(myDeviceName[1])) { + if (deviceNameItem[ANDROID_ID].equals(myDeviceName[ANDROID_ID])) { UserStore.getInstance(context).setDeviceName(device.getName()); UserStore.getInstance(context).setDeviceID(device.getUuid()); - flag = false; + isHaveDevice = true; setMutableLiveData(StatusResource.success()); break; } else { - final String[] itemDevice = device.getName().split(":"); + final String[] itemDevice = device.getName().split(SEPARATOR); if (itemDevice.length != 1) { if (itemDevice[0].contains(brandModel)) { arrayListDevicesName.add(itemDevice[0]); @@ -134,7 +137,7 @@ public class DataRepository { } } - if (flag) { + if (!isHaveDevice) { if (arrayListDevicesName.isEmpty()) { brandModel = deviceName; final HashMap body = new HashMap<>(); @@ -157,7 +160,7 @@ public class DataRepository { if (arrayListDevicesName.get(i).contains(brandModel)) { final char[] arr = arrayListDevicesName.get(i).toCharArray(); if (arr[arr.length - 2] != ')') { - brandModel += "(2)" + " " + ":" + " " + imei; + brandModel += "(2)" + SPACE + SEPARATOR + SPACE + imei; } else { String countDevice = ""; int indexfirst = 0; @@ -174,7 +177,7 @@ public class DataRepository { countDevice += device.substring(indexfirst + 1, indexlast); int count = Integer.parseInt(countDevice); count++; - brandModel += "(" + count + ")" + " " + ":" + " " + imei; + brandModel += "(" + count + ")" + SPACE + SEPARATOR + SPACE + imei; } } final HashMap body = new HashMap<>(); -- 2.17.1 From efff387e500a521033a7e931990ec2f6c39971f8 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Thu, 28 May 2020 14:40:36 +0400 Subject: [PATCH 16/17] Refactor code changes disposable variable names. --- .../android/repository/DataRepository.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index b7a7876..50d378d 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -58,7 +58,7 @@ public class DataRepository { HashMap data = new HashMap<>(); data.put(ApiConstants.USERNAME, username); data.put(ApiConstants.PASSWORD, password); - Disposable disposable = clientApi.login(data) + Disposable disposableLogin = clientApi.login(data) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(user -> { @@ -72,14 +72,14 @@ public class DataRepository { }, throwable -> { setMutableLiveData(StatusResource.error(throwable.getMessage())); }); - compositeDisposable.add(disposable); + compositeDisposable.add(disposableLogin); } private void getAllDevices(final Context context) { final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); header.put(ApiConstants.AUTHORIZATION_HEADER,token); - Disposable disposable1 = clientApi.getAllDevices(header) + Disposable disposableAllDevices = clientApi.getAllDevices(header) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(listDevices->{ @@ -97,7 +97,7 @@ public class DataRepository { },throwable -> { }); - compositeDisposable.add(disposable1); + compositeDisposable.add(disposableAllDevices); } private void addDevice(final Context context) { @@ -108,14 +108,14 @@ public class DataRepository { final String token = UserStore.getInstance(context).getToken(); final HashMap header = new HashMap<>(); header.put(ApiConstants.AUTHORIZATION_HEADER, token); - final Disposable disposable1 = clientApi.getAllDevices(header) + final Disposable disposableAllDevices = clientApi.getAllDevices(header) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(listDevices -> { String brandModel = brand + SPACE + model + SPACE; final List list = listDevices; final List arrayListDevicesName = new ArrayList<>(); - boolean isHaveDevice = false; + boolean hasDevice = false; for (final Device device : list) { final String[] deviceNameItem = device.getName().split(SEPARATOR); final String[] myDeviceName = deviceName.split(SEPARATOR); @@ -123,7 +123,7 @@ public class DataRepository { if (deviceNameItem[ANDROID_ID].equals(myDeviceName[ANDROID_ID])) { UserStore.getInstance(context).setDeviceName(device.getName()); UserStore.getInstance(context).setDeviceID(device.getUuid()); - isHaveDevice = true; + hasDevice = true; setMutableLiveData(StatusResource.success()); break; } else { @@ -137,13 +137,13 @@ public class DataRepository { } } - if (!isHaveDevice) { + if (!hasDevice) { if (arrayListDevicesName.isEmpty()) { brandModel = deviceName; final HashMap body = new HashMap<>(); body.put(ApiConstants.DEVICE_NAME, brandModel); body.put(ApiConstants.DEVICE_TYPE, "android"); - final Disposable disposable2 = clientApi.addDevice(header, body) + final Disposable disposableAddDevice = clientApi.addDevice(header, body) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(device -> { @@ -153,7 +153,7 @@ public class DataRepository { }, throwable -> { setMutableLiveData(StatusResource.error(throwable.getMessage())); }); - compositeDisposable.add(disposable2); + compositeDisposable.add(disposableAddDevice); } else { for (int i = (arrayListDevicesName.size() - 1); i >= arrayListDevicesName.size() - 1; i--) { @@ -183,7 +183,7 @@ public class DataRepository { final HashMap body = new HashMap<>(); body.put(ApiConstants.DEVICE_NAME, brandModel); body.put(ApiConstants.DEVICE_TYPE, "android"); - Disposable disposable2 = clientApi.addDevice(header,body) + Disposable disposableAddDevice = clientApi.addDevice(header,body) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(device -> { @@ -193,14 +193,14 @@ public class DataRepository { },throwable -> { setMutableLiveData(StatusResource.error(throwable.getMessage())); }); - compositeDisposable.add(disposable2); + compositeDisposable.add(disposableAddDevice); } } } }, throwable -> { setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION)); }); - compositeDisposable.add(disposable1); + compositeDisposable.add(disposableAllDevices); } }.getMutableLiveData(); } -- 2.17.1 From 55c12c270f394bfabd7b1fb2fd0f21060dedb8b2 Mon Sep 17 00:00:00 2001 From: Mushegh98 Date: Thu, 28 May 2020 14:52:30 +0400 Subject: [PATCH 17/17] Refactor code rename flag variable in hasDevice. --- .../com/wireguard/android/repository/DataRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java index 50d378d..a8c4873 100644 --- a/ui/src/main/java/com/wireguard/android/repository/DataRepository.java +++ b/ui/src/main/java/com/wireguard/android/repository/DataRepository.java @@ -83,15 +83,15 @@ public class DataRepository { .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(listDevices->{ - boolean flag = true; + boolean hasDevice = false; for (Device item : listDevices) { if (UserStore.getInstance(context).getDeviceID().equals(item.getUuid())) { setMutableLiveData(StatusResource.success()); - flag = false; + hasDevice = true; break; } } - if(flag) { + if(!hasDevice) { addDevice(context); } },throwable -> { -- 2.17.1