diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index cf9149f6..25db81a3 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -7,6 +7,14 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java
index 87864ab3..dbab9566 100644
--- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java
+++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java
@@ -19,6 +19,7 @@ import it.integry.integrywmsnative.core.data_store.db.AppDatabase;
import it.integry.integrywmsnative.core.ean128.Ean128Service;
import it.integry.integrywmsnative.core.menu.MenuRESTConsumer;
import it.integry.integrywmsnative.core.menu.MenuService;
+import it.integry.integrywmsnative.core.rest.AuthInterceptor;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.AziendaRESTConsumer;
@@ -50,7 +51,7 @@ import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.sound.SoundAlertService;
import it.integry.integrywmsnative.core.update.UpdatesManager;
import it.integry.integrywmsnative.gest.contab_doc_interni.rest.DocInterniRESTConsumer;
-import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer;
+import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.rest.ProdFabbisognoLineeProdRESTConsumer;
import it.integry.integrywmsnative.view.dialogs.DialogProgressView;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View;
@@ -96,8 +97,8 @@ public class MainApplicationModule {
@Provides
@Singleton
- MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) {
- return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, systemRESTConsumer, authRESTConsumer);
+ MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
+ return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, systemRESTConsumer, authenticationRESTConsumer);
}
@Provides
@@ -117,8 +118,8 @@ public class MainApplicationModule {
@Provides
@Singleton
- RESTBuilder providesRESTBuilder() {
- return new RESTBuilder();
+ RESTBuilder providesRESTBuilder(AuthInterceptor authInterceptor) {
+ return new RESTBuilder(authInterceptor);
}
@Provides
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
index 4d35d1d7..12b98b0b 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java
@@ -19,7 +19,7 @@ import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityThread;
-import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer;
+import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
@Singleton
public class MainContext {
@@ -28,16 +28,16 @@ public class MainContext {
private final MenuService menuService;
private final AppDatabase appDatabase;
private final SystemRESTConsumer systemRESTConsumer;
- private final AuthRESTConsumer authRESTConsumer;
+ private final AuthenticationRESTConsumer authenticationRESTConsumer;
private Listener mListener;
- public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) {
+ public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
this.applicationContext = applicationContext;
this.menuService = menuService;
this.appDatabase = appDatabase;
this.systemRESTConsumer = systemRESTConsumer;
- this.authRESTConsumer = authRESTConsumer;
+ this.authenticationRESTConsumer = authenticationRESTConsumer;
}
public void init() {
@@ -67,7 +67,7 @@ public class MainContext {
private void initAuthSession(Runnable onComplete) {
- this.authRESTConsumer.me(obj -> {
+ this.authenticationRESTConsumer.me(obj -> {
onComplete.run();
}, ex -> {
if (mListener != null) mListener.onError(new SpannedString(ex.getMessage()));
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java
index c4ca240a..b4bc2593 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java
@@ -2,23 +2,58 @@ package it.integry.integrywmsnative.core.rest;
import androidx.annotation.NonNull;
+import com.auth0.android.jwt.JWT;
+
import java.io.IOException;
-import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer;
+import it.integry.integrywmsnative.core.settings.SettingsManager;
+import it.integry.integrywmsnative.core.utility.UtilityDate;
+import it.integry.integrywmsnative.gest.login.rest.RefreshRESTConsumer;
import okhttp3.Interceptor;
import okhttp3.Response;
public class AuthInterceptor implements Interceptor {
- private final AuthRESTConsumer authRESTConsumer;
+ private final RefreshRESTConsumer refreshRESTConsumer;
- public AuthInterceptor(AuthRESTConsumer authRESTConsumer) {
- this.authRESTConsumer = authRESTConsumer;
+ public AuthInterceptor(RefreshRESTConsumer refreshRESTConsumer) {
+ this.refreshRESTConsumer = refreshRESTConsumer;
}
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
- return null;
+ var originalRequest = chain.request();
+ var accessToken = SettingsManager.i().getUserSession().getAccessToken();
+ var accessTokenExpiryDate = SettingsManager.i().getUserSession().getAccessTokenExpiryDate();
+
+ if(accessToken != null && (accessTokenExpiryDate == null || UtilityDate.getNowTime().isAfter(accessTokenExpiryDate))) {
+
+ // Make the token refresh request
+ try {
+ var response = refreshRESTConsumer.makeSynchronousRefreshTokenRequest();
+
+ JWT jwt = new JWT(response.getAccessToken());
+
+ SettingsManager.i().getUserSession()
+ .setAccessToken(response.getAccessToken())
+ .setAccessTokenExpiryDate(UtilityDate.toLocalDateTime(jwt.getExpiresAt()))
+ .setRefreshToken(response.getRefreshToken())
+ .setRefreshTokenExpiryDate(response.getExpiryDate());
+
+ SettingsManager.update();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+
+ // Add the access token to the request header
+ var authorizedRequest = originalRequest.newBuilder()
+ .header("Authorization", "Bearer " + SettingsManager.i().getUserSession().getAccessToken())
+ .build();
+
+ return chain.proceed(authorizedRequest);
+ } else
+ return chain.proceed(originalRequest);
}
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java
index 2aa26fdf..0bc1bef5 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java
@@ -3,6 +3,7 @@ package it.integry.integrywmsnative.core.rest;
import java.io.IOException;
import it.integry.integrywmsnative.core.settings.SettingsManager;
+import it.integry.integrywmsnative.core.utility.UtilityDate;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
@@ -18,19 +19,30 @@ public class HttpInterceptor implements Interceptor {
public Response intercept(Chain chain) throws IOException {
final String PROFILE_DB = SettingsManager.i().getUserSession() == null ? null : SettingsManager.i().getUserSession().getProfileDB();
- final String ACCESS_TOKEN = SettingsManager.i().getUserSession().getAccessToken();
final String APP_TOKEN = "fa3a21af-606b-4129-a22b-aedc2a52c7b6";
+ String accessToken = null;
+
+ if(SettingsManager.i().getUserSession().getAccessTokenExpiryDate() != null &&
+ UtilityDate.getNowTime().isBefore(SettingsManager.i().getUserSession().getAccessTokenExpiryDate())) {
+ accessToken = SettingsManager.i().getUserSession().getAccessToken();
+ }
+
final Request request = chain.request();
final HttpUrl url = request.url().newBuilder()
.addQueryParameter("profileDb", PROFILE_DB)
.build();
- final Request newRequest = chain.request().newBuilder()
- .addHeader("Authorization", "Bearer " + ACCESS_TOKEN)
+ Request.Builder builder = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "*/*")
- .addHeader("x-app-token", APP_TOKEN)
+ .addHeader("x-app-token", APP_TOKEN);
+
+ if(accessToken != null)
+ builder
+ .addHeader("Authorization", "Bearer " + accessToken);
+
+ var newRequest = builder
.url(url)
.build();
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java
index 7630d1f2..24f4e4c4 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java
@@ -24,7 +24,12 @@ import retrofit2.converter.gson.GsonConverterFactory;
@Singleton
public class RESTBuilder {
- private static final boolean ADD_LOGGER_INTERCEPTOR = false;
+ private final boolean ADD_LOGGER_INTERCEPTOR = false;
+ private final AuthInterceptor authInterceptor;
+
+ public RESTBuilder(AuthInterceptor authInterceptor) {
+ this.authInterceptor = authInterceptor;
+ }
public T getService(final Class service) {
return getService(service, SettingsManager.i().getServer().getProtocol(), SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true);
@@ -53,6 +58,7 @@ public class RESTBuilder {
clientBuilder.retryOnConnectionFailure(true);
+ clientBuilder.addInterceptor(authInterceptor);
if (addInterceptors) clientBuilder.addInterceptor(new HttpInterceptor());
if (ADD_LOGGER_INTERCEPTOR) clientBuilder.addInterceptor(new HttpLoggerInterceptor());
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java
index a8cb448b..dc66ed20 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java
@@ -80,6 +80,7 @@ public class SettingsModel {
public static class UserSession {
private String accessToken;
+ private LocalDateTime accessTokenExpiryDate;
private String refreshToken;
private LocalDateTime refreshTokenExpiryDate;
private String deviceId;
@@ -159,6 +160,15 @@ public class SettingsModel {
this.defaultOrdinamentoPickingAccettazioneBolle = defaultOrdinamentoPickingAccettazioneBolle;
return this;
}
+
+ public LocalDateTime getAccessTokenExpiryDate() {
+ return accessTokenExpiryDate;
+ }
+
+ public UserSession setAccessTokenExpiryDate(LocalDateTime accessTokenExpiryDate) {
+ this.accessTokenExpiryDate = accessTokenExpiryDate;
+ return this;
+ }
}
public Server getServer() {
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java
index a846c388..649a3533 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java
@@ -1,12 +1,16 @@
package it.integry.integrywmsnative.gest.login;
+import java.util.concurrent.ExecutorService;
+
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
+import it.integry.integrywmsnative.core.rest.AuthInterceptor;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
-import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer;
+import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
+import it.integry.integrywmsnative.gest.login.rest.RefreshRESTConsumer;
import it.integry.integrywmsnative.gest.login.viewmodel.LoginViewModel;
@Module(subcomponents = LoginComponent.class)
@@ -14,13 +18,25 @@ public class LoginModule {
@Provides
@Singleton
- AuthRESTConsumer provideLoginRESTConsumer(RESTBuilder restBuilder) {
- return new AuthRESTConsumer(restBuilder);
+ AuthenticationRESTConsumer provideAuthenticationRESTConsumer(RESTBuilder restBuilder) {
+ return new AuthenticationRESTConsumer(restBuilder);
}
@Provides
- LoginViewModel providesSpedizioneViewModel(SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) {
- return new LoginViewModel(systemRESTConsumer, authRESTConsumer);
+ @Singleton
+ AuthInterceptor provideAuthInterceptor(RefreshRESTConsumer refreshRESTConsumer) {
+ return new AuthInterceptor(refreshRESTConsumer);
+ }
+
+ @Provides
+ @Singleton
+ RefreshRESTConsumer provideRefreshRESTConsumer(ExecutorService executorService) {
+ return new RefreshRESTConsumer(executorService);
+ }
+
+ @Provides
+ LoginViewModel providesLoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
+ return new LoginViewModel(systemRESTConsumer, authenticationRESTConsumer);
}
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java
similarity index 68%
rename from app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java
rename to app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java
index 1440c75e..f51af87e 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java
@@ -2,7 +2,7 @@ package it.integry.integrywmsnative.gest.login.dto;
import java.time.LocalDateTime;
-public class LoginJwtResponseDTO {
+public class AuthenticationJwtResponseDTO {
private String accessToken;
private String refreshToken;
@@ -14,7 +14,7 @@ public class LoginJwtResponseDTO {
return accessToken;
}
- public LoginJwtResponseDTO setAccessToken(String accessToken) {
+ public AuthenticationJwtResponseDTO setAccessToken(String accessToken) {
this.accessToken = accessToken;
return this;
}
@@ -23,7 +23,7 @@ public class LoginJwtResponseDTO {
return refreshToken;
}
- public LoginJwtResponseDTO setRefreshToken(String refreshToken) {
+ public AuthenticationJwtResponseDTO setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
return this;
}
@@ -32,7 +32,7 @@ public class LoginJwtResponseDTO {
return expiryDate;
}
- public LoginJwtResponseDTO setExpiryDate(LocalDateTime expiryDate) {
+ public AuthenticationJwtResponseDTO setExpiryDate(LocalDateTime expiryDate) {
this.expiryDate = expiryDate;
return this;
}
@@ -41,7 +41,7 @@ public class LoginJwtResponseDTO {
return expireIn;
}
- public LoginJwtResponseDTO setExpireIn(long expireIn) {
+ public AuthenticationJwtResponseDTO setExpireIn(long expireIn) {
this.expireIn = expireIn;
return this;
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java
similarity index 74%
rename from app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java
rename to app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java
index bb1fad19..73230b25 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java
@@ -13,21 +13,20 @@ import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.gest.login.dto.LoginAziendaDTO;
-import it.integry.integrywmsnative.gest.login.dto.LoginJwtResponseDTO;
+import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO;
import it.integry.integrywmsnative.gest.login.dto.LoginRequestDTO;
-import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@Singleton
-public class AuthRESTConsumer extends _BaseRESTConsumer {
+public class AuthenticationRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
@Inject
- public AuthRESTConsumer(RESTBuilder restBuilder) {
+ public AuthenticationRESTConsumer(RESTBuilder restBuilder) {
this.restBuilder = restBuilder;
}
@@ -71,7 +70,7 @@ public class AuthRESTConsumer extends _BaseRESTConsumer {
}
- public void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) {
+ public void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) {
AuthenticationRESTConsumerService service = restBuilder.getService(AuthenticationRESTConsumerService.class, protocol, host, port, false);
LoginRequestDTO loginRequestDTO = new LoginRequestDTO()
@@ -85,12 +84,12 @@ public class AuthRESTConsumer extends _BaseRESTConsumer {
.enqueue(new Callback<>() {
@Override
- public void onResponse(Call> call, Response> response) {
+ public void onResponse(Call> call, Response> response) {
analyzeAnswer(response, "login", onComplete, onFailed);
}
@Override
- public void onFailure(Call> call, final Throwable t) {
+ public void onFailure(Call> call, final Throwable t) {
Log.e("login", t.toString());
onFailed.run(new Exception(t));
}
@@ -98,28 +97,6 @@ public class AuthRESTConsumer extends _BaseRESTConsumer {
}
- public void refreshToken(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) {
- AuthenticationRESTConsumerService service = restBuilder.getService(AuthenticationRESTConsumerService.class);
-
- RefreshRequestDTO refreshRequest = new RefreshRequestDTO()
- .setRefreshToken(username);
-
- service
- .refresh(refreshRequest)
- .enqueue(new Callback<>() {
-
- @Override
- public void onResponse(Call> call, Response> response) {
- analyzeAnswer(response, "refresh", onComplete, onFailed);
- }
-
- @Override
- public void onFailure(Call> call, final Throwable t) {
- Log.e("refresh", t.toString());
- onFailed.run(new Exception(t));
- }
- });
- }
public void retrieveAvailableProfiles(String protocol, String host, int port, String username, RunnableArgs> onComplete, RunnableArgs onFailed) {
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java
index 2c7aed5f..af7b6827 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java
@@ -5,10 +5,9 @@ import java.util.List;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.gest.login.dto.LoginAziendaDTO;
-import it.integry.integrywmsnative.gest.login.dto.LoginJwtResponseDTO;
+import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO;
import it.integry.integrywmsnative.gest.login.dto.LoginRequestDTO;
import it.integry.integrywmsnative.gest.login.dto.LoginResponseDTO;
-import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
@@ -25,10 +24,7 @@ public interface AuthenticationRESTConsumerService {
Call> login(@Body LoginRequestDTO loginRequestDTO);
@POST("auth/login")
- Call> loginNew(@Body LoginRequestDTO loginRequestDTO);
-
- @POST("auth/refresh")
- Call> refresh(@Body RefreshRequestDTO refreshRequestDTO);
+ Call> loginNew(@Body LoginRequestDTO loginRequestDTO);
@GET("auth/me")
Call> me();
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java
new file mode 100644
index 00000000..56c1be3d
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java
@@ -0,0 +1,95 @@
+package it.integry.integrywmsnative.gest.login.rest;
+
+import com.google.gson.Gson;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Singleton;
+
+import it.integry.integrywmsnative.core.expansion.RunnableArgs;
+import it.integry.integrywmsnative.core.rest.HttpInterceptor;
+import it.integry.integrywmsnative.core.rest.RESTBuilder;
+import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
+import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
+import it.integry.integrywmsnative.core.settings.SettingsManager;
+import it.integry.integrywmsnative.core.utility.UtilityGson;
+import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO;
+import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO;
+import okhttp3.OkHttpClient;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+@Singleton
+public class RefreshRESTConsumer extends _BaseRESTConsumer {
+
+ private final ExecutorService executorService;
+
+ public RefreshRESTConsumer(ExecutorService executorService) {
+ this.executorService = executorService;
+ }
+
+ public AuthenticationJwtResponseDTO makeSynchronousRefreshTokenRequest() throws Exception {
+ RefreshRESTConsumerService service = getService(
+ RefreshRESTConsumerService.class,
+ SettingsManager.i().getServer().getProtocol(),
+ SettingsManager.i().getServer().getHost(),
+ SettingsManager.i().getServer().getPort(),
+ true,
+ true,
+ 30);
+
+ RefreshRequestDTO refreshRequest = new RefreshRequestDTO()
+ .setRefreshToken(SettingsManager.i().getUserSession().getRefreshToken());
+
+ Response> response = service
+ .refresh(refreshRequest)
+ .execute();
+
+ return analyzeAnswer(response, "refreshToken");
+ }
+
+ public void makeRefreshTokenRequest(final Runnable onComplete, final RunnableArgs onError) {
+ executorService.execute(() -> {
+ try {
+ makeSynchronousRefreshTokenRequest();
+
+ if (onComplete != null)
+ onComplete.run();
+
+ } catch (Exception ex) {
+ if (onError != null) onError.run(ex);
+ }
+ });
+ }
+
+
+ private T getService(final Class service, String protocol, String host, int port, boolean addInterceptors, boolean addEmsApi, int timeout) {
+ OkHttpClient.Builder clientBuilder = RESTBuilder.getDefaultHttpClient();
+
+ clientBuilder.connectTimeout(timeout, TimeUnit.SECONDS);
+ clientBuilder.readTimeout(timeout, TimeUnit.SECONDS);
+ clientBuilder.writeTimeout(timeout, TimeUnit.SECONDS);
+
+ clientBuilder.retryOnConnectionFailure(true);
+
+ if (addInterceptors) clientBuilder.addInterceptor(new HttpInterceptor());
+
+ OkHttpClient client = clientBuilder.build();
+
+ String endpoint = protocol + "://" + host + (port > 0 ? ":" + port : "") + "/" + (addEmsApi ? "ems-api/" : "");
+
+
+ Gson gson = UtilityGson.createObject();
+
+ Retrofit retrofit = new Retrofit.Builder()
+ .addConverterFactory(GsonConverterFactory.create(gson))
+ .baseUrl(endpoint)
+ .client(client)
+ .build();
+
+ return retrofit.create(service);
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java
new file mode 100644
index 00000000..257024a6
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java
@@ -0,0 +1,17 @@
+package it.integry.integrywmsnative.gest.login.rest;
+
+import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
+import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO;
+import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO;
+import retrofit2.Call;
+import retrofit2.http.Body;
+import retrofit2.http.POST;
+
+public interface RefreshRESTConsumerService {
+
+
+
+ @POST("auth/refresh")
+ Call> refresh(@Body RefreshRequestDTO refreshRequestDTO);
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java
index 7f0b2a80..5113e149 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java
@@ -15,25 +15,26 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgsss;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.settings.SettingsManager;
+import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityServer;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.login.dto.AuthTokenClaimsDTO;
import it.integry.integrywmsnative.gest.login.exception.InvalidServerCodAziendaException;
import it.integry.integrywmsnative.gest.login.exception.InvalidUserDepositException;
-import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer;
+import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
public class LoginViewModel {
private final SystemRESTConsumer mSystemRESTConsumer;
- private final AuthRESTConsumer mAuthRESTConsumer;
+ private final AuthenticationRESTConsumer mAuthenticationRESTConsumer;
private Listener mListener;
@Inject
- public LoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) {
+ public LoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
this.mSystemRESTConsumer = systemRESTConsumer;
- this.mAuthRESTConsumer = authRESTConsumer;
+ this.mAuthenticationRESTConsumer = authenticationRESTConsumer;
}
@@ -77,7 +78,7 @@ public class LoginViewModel {
private void retrieveServerData(String codAzienda, RunnableArgsss onComplete) {
- mAuthRESTConsumer.retrieveServerData(codAzienda, value -> {
+ mAuthenticationRESTConsumer.retrieveServerData(codAzienda, value -> {
final String serverEndpoint = value.getEndpointRestApi();
@@ -102,7 +103,7 @@ public class LoginViewModel {
}
private void retrieveAvailableProfiles(String protocol, String host, int port, String username, RunnableArgs onComplete) {
- mAuthRESTConsumer.retrieveAvailableProfiles(protocol, host, port, username, availableProfiles -> {
+ mAuthenticationRESTConsumer.retrieveAvailableProfiles(protocol, host, port, username, availableProfiles -> {
if (availableProfiles == null || availableProfiles.isEmpty()) {
this.sendError(new Exception("Non รจ stato trovato alcun profilo per l'utente: " + username));
@@ -123,7 +124,7 @@ public class LoginViewModel {
}
private void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete) {
- mAuthRESTConsumer.authenticate(protocol, host, port, username, password, profileDb, deviceSalt, sessionData -> {
+ mAuthenticationRESTConsumer.authenticate(protocol, host, port, username, password, profileDb, deviceSalt, sessionData -> {
JWT jwt = new JWT(sessionData.getAccessToken());
var claims = jwt.getClaims();
@@ -134,6 +135,7 @@ public class LoginViewModel {
.setProfileDB(profileDb)
.setDeviceId(deviceSalt)
.setAccessToken(sessionData.getAccessToken())
+ .setAccessTokenExpiryDate(UtilityDate.toLocalDateTime(jwt.getExpiresAt()))
.setRefreshToken(sessionData.getRefreshToken())
.setRefreshTokenExpiryDate(sessionData.getExpiryDate());