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); } }