diff --git a/claimManagement/build.gradle b/claimManagement/build.gradle index c2149bc6..4a233821 100644 --- a/claimManagement/build.gradle +++ b/claimManagement/build.gradle @@ -61,6 +61,8 @@ android { buildConfigField "String", "REST_API_PREFIX", '"rest"' buildConfigField "String", "RAR_PASSWORD", '")(#$1HsD"' buildConfigField "String", "API_VERSION", '"3"' + buildConfigField "boolean", "DISABLE_PRICE_EDITION", 'false' + buildConfigField "boolean", "GENERATE_CLAIM_NUMBER", 'false' } productFlavors { @@ -107,7 +109,7 @@ android { niger { applicationIdSuffix ".niger" resValue "string", "app_name_claims", "Claims Niger" - buildConfigField "String", "API_BASE_URL", '"http://oiniger.bluesquare.org/"' + buildConfigField "String", "API_BASE_URL", '"https://niger23.bluesquare.org/"' } tchadDev { applicationIdSuffix ".tchadDev" @@ -133,7 +135,14 @@ android { resValue "string", "app_name_claims", "Claims CNASS TRAIN" dimension = 'std' } - + gambia { + applicationIdSuffix ".gambia" + buildConfigField "String", "API_BASE_URL", '"https://gambiatest.bluesquare.org/"' + resValue "string", "app_name_claims", "Claims Gambia" + dimension = 'std' + buildConfigField "boolean", "DISABLE_PRICE_EDITION", 'true' + buildConfigField "boolean", "GENERATE_CLAIM_NUMBER", 'true' + } } sourceSets { @@ -213,9 +222,6 @@ dependencies { implementation ('com.apollographql.apollo:apollo-android-support:2.5.14'){ because("Apollo 3+ only works with Kotlin coroutines") } - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' implementation group: 'com.squareup.picasso', name: 'picasso', version: '2.71828' implementation group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.7' diff --git a/claimManagement/src/gambia/java/org/openimis/imisclaims/Escape.java b/claimManagement/src/gambia/java/org/openimis/imisclaims/Escape.java new file mode 100644 index 00000000..2459d64b --- /dev/null +++ b/claimManagement/src/gambia/java/org/openimis/imisclaims/Escape.java @@ -0,0 +1,7 @@ +package org.openimis.imisclaims; + +public class Escape { + public boolean CheckCHFID(String InsureeNumber) { + return InsureeNumber != null && InsureeNumber.length() != 0; + } +} diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/AddItems.java b/claimManagement/src/main/java/org/openimis/imisclaims/AddItems.java index b1c2e641..22ccf89d 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/AddItems.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/AddItems.java @@ -39,6 +39,7 @@ public void onCreate(Bundle savedInstanceState) { lvItems = findViewById(R.id.lvItems); etQuantity = findViewById(R.id.etQuantity); etAmount = findViewById(R.id.etAmount); + disableView(etAmount); etItems = findViewById(R.id.etItems); btnAdd = findViewById(R.id.btnAdd); diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/AddServices.java b/claimManagement/src/main/java/org/openimis/imisclaims/AddServices.java index 42577282..b3b25692 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/AddServices.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/AddServices.java @@ -37,6 +37,7 @@ public void onCreate(Bundle savedInstanceState) { lvServices = findViewById(R.id.lvServices); etSQuantity = findViewById(R.id.etSQuantity); etSAmount = findViewById(R.id.etSAmount); + disableView(etSAmount); etServices = findViewById(R.id.etService); btnAdd = findViewById(R.id.btnAdd); diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/ClaimActivity.java b/claimManagement/src/main/java/org/openimis/imisclaims/ClaimActivity.java index ac3ffc32..91986fc1 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/ClaimActivity.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/ClaimActivity.java @@ -8,6 +8,9 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.TextWatcher; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -32,13 +35,20 @@ import org.openimis.imisclaims.util.DateUtils; import org.openimis.imisclaims.util.TextViewUtils; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; +import java.util.Locale; +import java.util.TimeZone; import java.util.UUID; public class ClaimActivity extends ImisActivity { + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH); + static { + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } private static final String LOG_TAG = "CLAIM"; private static final int REQUEST_SCAN_QR_CODE = 1; static final int StartDate_Dialog_ID = 0; @@ -184,6 +194,33 @@ protected void onCreate(Bundle savedInstanceState) { // hfCode and adminCode not editable disableView(etHealthFacility); disableView(etClaimAdmin); + if (BuildConfig.GENERATE_CLAIM_NUMBER) { + disableView(etClaimCode); + etClaimCode.setFilters(new InputFilter[0]); + TextWatcher watcher = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // + } + + @Override + public void afterTextChanged(Editable s) { + String hfCode = etHealthFacility.getText().toString(); + String insureeNumber = etInsureeNumber.getText().toString(); + if (hfCode.isEmpty() || insureeNumber.isEmpty()) { + return; + } + etClaimCode.setText(generateClaimNumber(hfCode, insureeNumber)); + } + }; + etHealthFacility.addTextChangedListener(watcher); + etInsureeNumber.addTextChangedListener(watcher); + } Intent intent = getIntent(); @@ -374,7 +411,11 @@ private void ClearForm() { etDiagnosis3.setText(""); etDiagnosis4.setText(""); rgVisitType.clearCheck(); - etClaimCode.requestFocus(); + if (!BuildConfig.GENERATE_CLAIM_NUMBER) { + etClaimCode.requestFocus(); + } else { + etGuaranteeNo.requestFocus(); + } } private void disableForm() { @@ -389,7 +430,6 @@ private void disableForm() { disableView(etDiagnosis3); disableView(etDiagnosis4); disableView(rgVisitType); - disableView(etClaimCode); disableView(btnPost); disableView(rbEmergency); disableView(rbReferral); @@ -589,7 +629,7 @@ private boolean isValidData() { return false; } - if (etClaimCode.getText().length() == 0) { + if (getClaimCode().isEmpty()) { showValidationDialog(etClaimCode, getResources().getString(R.string.MissingClaimCode)); return false; } @@ -694,7 +734,7 @@ private boolean saveClaim() { claimCV.put("ClaimDate", claimDate); claimCV.put("HFCode", etHealthFacility.getText().toString()); claimCV.put("ClaimAdmin", etClaimAdmin.getText().toString()); - claimCV.put("ClaimCode", etClaimCode.getText().toString()); + claimCV.put("ClaimCode", getClaimCode()); claimCV.put("GuaranteeNumber", etGuaranteeNo.getText().toString()); claimCV.put("InsureeNumber", etInsureeNumber.getText().toString()); claimCV.put("StartDate", etStartDate.getText().toString()); @@ -735,4 +775,26 @@ private boolean saveClaim() { sqlHandler.saveClaim(claimCV, claimItemCVs, claimServiceCVs); return true; } + + @NonNull + private String getClaimCode() { + String input = etClaimCode.getText().toString(); + if (!input.isEmpty()) { + return input; + } + if (BuildConfig.GENERATE_CLAIM_NUMBER) { + String hfCode = etHealthFacility.getText().toString() ; + String insureeNumber = etInsureeNumber.getText().toString(); + return generateClaimNumber(hfCode, insureeNumber); + } + return ""; + } + + private String generateClaimNumber(@NonNull String hfCode, @NonNull String insureeNumber) { + return String.format( + Locale.ENGLISH, + "%1$s-%2$s-%3$s", + hfCode, insureeNumber, dateFormat.format(new Date()) + ); + } } diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/Global.java b/claimManagement/src/main/java/org/openimis/imisclaims/Global.java index fac99c5d..71315c5e 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/Global.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/Global.java @@ -25,6 +25,8 @@ package org.openimis.imisclaims; +import static org.openimis.imisclaims.BuildConfig.RAR_PASSWORD; + import android.Manifest; import android.app.Application; import android.content.Context; @@ -40,6 +42,11 @@ import android.util.Base64; import android.util.DisplayMetrics; +import androidx.annotation.NonNull; + +import org.openimis.imisclaims.repository.LoginRepository; +import org.openimis.imisclaims.tools.Log; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -57,11 +64,20 @@ import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; -import static org.openimis.imisclaims.BuildConfig.RAR_PASSWORD; - -import org.openimis.imisclaims.tools.Log; - public class Global extends Application { + private static final String[] PERMISSIONS = new String[]{ + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.VIBRATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.INTERNET, + Manifest.permission.CAMERA, + Manifest.permission.ACCESS_NETWORK_STATE, + Manifest.permission.ACCESS_WIFI_STATE, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.CHANGE_WIFI_STATE + }; + private static final String SHPREF_NAME = "SHPref"; private static final String SHPREF_LANGUAGE = "language"; private static final String DEFAULT_LANGUAGE_CODE = "en"; @@ -73,14 +89,12 @@ public class Global extends Application { private String AppDirectory; private final Map SubDirectories = new HashMap<>(); private static final String _DefaultRarPassword = RAR_PASSWORD; - private Token JWTToken; - private String[] permissions; + private volatile LoginRepository loginRepository; @Override public void onCreate() { super.onCreate(); instance = this; - permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.VIBRATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE}; } public static Global getGlobal() { @@ -128,21 +142,22 @@ public String getOfficeName() { } public String[] getPermissions() { - return permissions; + return PERMISSIONS; } - public Token getJWTToken() { - if (JWTToken == null) - JWTToken = new Token(); - return JWTToken; + @NonNull + public LoginRepository getLoginRepository() { + if (loginRepository == null) + synchronized (this) { + if (loginRepository == null) { + loginRepository = new LoginRepository(this); + } + } + return loginRepository; } public boolean isLoggedIn() { - boolean isLoggedIn = getJWTToken().isTokenValidJWT(); - if (!isLoggedIn) { - getJWTToken().clearToken(); - } - return isLoggedIn; + return getLoginRepository().getToken() != null; } private String createOrCheckDirectory(String path) { diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/MainActivity.java b/claimManagement/src/main/java/org/openimis/imisclaims/MainActivity.java index 9a3dd341..d359e472 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/MainActivity.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/MainActivity.java @@ -325,7 +325,7 @@ public void changeLoginState() { if (global.isLoggedIn()) { progressDialog = ProgressDialog.show(this, getResources().getString(R.string.Logout), getResources().getString(R.string.InProgress)); loginText.setText(R.string.Login); - runOnNewThread(() -> global.getJWTToken().clearToken(), + runOnNewThread(() -> global.getLoginRepository().saveToken(null, null), () -> progressDialog.dismiss(), 500); } else { @@ -347,7 +347,6 @@ private void initializeDb3File(SQLHandler sql) { ClaimAdminDialogBox(); } } - } } @@ -514,7 +513,10 @@ public void getClaimAdmins() { }); } catch (Exception e) { e.printStackTrace(); - runOnUiThread(() -> progressDialog.dismiss()); + runOnUiThread(() -> { + ErrorDialogBox(e.getMessage()); + progressDialog.dismiss(); + }); } }); thread.start(); diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/MapItems.java b/claimManagement/src/main/java/org/openimis/imisclaims/MapItems.java index 4b0fff09..291f9c48 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/MapItems.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/MapItems.java @@ -7,7 +7,9 @@ import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; + import androidx.appcompat.view.menu.MenuBuilder; + import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; @@ -329,18 +331,16 @@ protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(); FilterResults results = new FilterResults(); ArrayList> FilteredItems = new ArrayList>(); - ; - - if (constraint != null && constraint.toString().length() > 0) { + if (!constraint.toString().isEmpty()) { for (int i = 0; i < OriginalList.size(); i++) { HashMap oItem = OriginalList.get(i); if (oItem.get("Code").toString().toLowerCase().contains(constraint) || oItem.get("Name").toString().toLowerCase().contains(constraint)) { FilteredItems.add(oItem); } - results.count = FilteredItems.size(); - results.values = FilteredItems; } + results.count = FilteredItems.size(); + results.values = FilteredItems; } else { synchronized (this) { results.values = OriginalList; diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/MapServices.java b/claimManagement/src/main/java/org/openimis/imisclaims/MapServices.java index 8527a8f2..8d556595 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/MapServices.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/MapServices.java @@ -36,7 +36,7 @@ public class MapServices extends ImisActivity { ListView lvMapServices; - CheckBox chkAll, chk; + CheckBox chkAll; EditText etSearchServices; ArrayList> ServiceList = new ArrayList<>(); @@ -53,7 +53,6 @@ protected void onCreate(Bundle savedInstanceState) { lvMapServices = (ListView) findViewById(R.id.lvMapServices); chkAll = (CheckBox) findViewById(R.id.chkAllServices); - chk = (CheckBox) findViewById(R.id.chkMap); etSearchServices = (EditText) findViewById(R.id.etSearchServices); etSearchServices.addTextChangedListener(new TextWatcher() { @@ -322,18 +321,16 @@ protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(); FilterResults results = new FilterResults(); ArrayList> FilteredItems = new ArrayList>(); - ; - - if (constraint != null && constraint.toString().length() > 0) { + if (!constraint.toString().isEmpty()) { for (int i = 0; i < OriginalList.size(); i++) { HashMap oItem = OriginalList.get(i); if (oItem.get("Code").toString().toLowerCase().contains(constraint) || oItem.get("Name").toString().toLowerCase().contains(constraint)) { FilteredItems.add(oItem); } - results.count = FilteredItems.size(); - results.values = FilteredItems; } + results.count = FilteredItems.size(); + results.values = FilteredItems; } else { synchronized (this) { results.values = OriginalList; diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/Token.java b/claimManagement/src/main/java/org/openimis/imisclaims/Token.java index f530ebe8..e88f36fb 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/Token.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/Token.java @@ -2,6 +2,8 @@ import android.util.Base64; +import androidx.annotation.Nullable; + import org.json.JSONException; import org.json.JSONObject; @@ -11,14 +13,9 @@ import java.util.Date; import java.util.Locale; +@Deprecated public class Token { - private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX", Locale.US); - - // It's inefficient but it's to stay backward compatible without some logic to migrate the old - // file to store the value in long. - public void saveTokenText(String token, long validTo) { - saveTokenText(token, format.format(new Date(validTo))); - } + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX", Locale.US); public void saveTokenText(String token, String validTo) { Global global = Global.getGlobal(); @@ -32,18 +29,35 @@ public void saveTokenText(String token, String validTo) { } public String getTokenText() { - String token = ""; Global global = Global.getGlobal(); String dir = global.getSubdirectory("Authentications"); - - if (isTokenValidJWT()) { - token = global.getFileText(dir, "token.txt"); + String token = global.getFileText(dir, "token.txt"); + if (isTokenValidJWT(token)) { + return token; } else { clearToken(); } - return token; + return null; + } + + @Nullable + public Date getValidity() { + Global global = Global.getGlobal(); + String dir = global.getSubdirectory("Authentications"); + + String validTo = global.getFileText(dir, "validTo.txt"); + if (validTo == null || "".equals(validTo)) { + return null; + } + + try { + return format.parse(validTo); + } catch (ParseException | NullPointerException e) { + e.printStackTrace(); + } + return null; } public void clearToken() { @@ -52,12 +66,14 @@ public void clearToken() { //How to validate JWT: //https://datatracker.ietf.org/doc/html/rfc7519#section-7.2 + public boolean isTokenValidJWT() { Global global = Global.getGlobal(); String dir = global.getSubdirectory("Authentications"); + return isTokenValidJWT(Global.getGlobal().getFileText(dir, "token.txt")); + } - String validTo = global.getFileText(dir, "validTo.txt"); - String token = global.getFileText(dir, "token.txt"); + private boolean isTokenValidJWT(@Nullable String token) { if (token == null || "".equals(token)) return false; @@ -75,23 +91,13 @@ public boolean isTokenValidJWT() { } catch (JSONException e) { return false; } - - if (validTo == null || "".equals(validTo)) { + Date expiryDate = getValidity(); + if (expiryDate == null) { return false; } - try { - Date expiryDate = format.parse(validTo); - Date now = new Date(); - - if (now.after(expiryDate)) { - return false; - } - } catch (ParseException | NullPointerException e) { - e.printStackTrace(); - } - - return true; + Date now = new Date(); + return !now.after(expiryDate); } } diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/network/dto/TokenDto.java b/claimManagement/src/main/java/org/openimis/imisclaims/network/dto/TokenDto.java index 95fae930..0ee207e3 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/network/dto/TokenDto.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/network/dto/TokenDto.java @@ -5,11 +5,13 @@ import org.json.JSONException; import org.json.JSONObject; +import java.util.concurrent.TimeUnit; + public class TokenDto { @NonNull public static TokenDto fromJson(@NonNull JSONObject object) throws JSONException { - return new TokenDto(object.getString("token"), object.getLong("exp")); + return new TokenDto(object.getString("token"), TimeUnit.SECONDS.toMillis(object.getLong("exp"))); } @NonNull diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/network/okhttp/AuthorizationInterceptor.java b/claimManagement/src/main/java/org/openimis/imisclaims/network/okhttp/AuthorizationInterceptor.java index f842285f..0ca70880 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/network/okhttp/AuthorizationInterceptor.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/network/okhttp/AuthorizationInterceptor.java @@ -1,11 +1,9 @@ package org.openimis.imisclaims.network.okhttp; -import android.view.textclassifier.TextLinks; - import androidx.annotation.NonNull; import org.openimis.imisclaims.Global; -import org.openimis.imisclaims.Token; +import org.openimis.imisclaims.repository.LoginRepository; import java.io.IOException; import java.net.HttpURLConnection; @@ -26,13 +24,14 @@ public AuthorizationInterceptor(@NonNull Global global) { @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { - Token token = global.getJWTToken(); - if (token != null && token.isTokenValidJWT()) { + LoginRepository loginRepository = global.getLoginRepository(); + String token = loginRepository.getToken(); + if (token != null) { Request.Builder builder = chain.request().newBuilder(); - builder.addHeader("Authorization", "bearer " + token.getTokenText().trim()); + builder.addHeader("Authorization", "bearer " + token.trim()); Response response = chain.proceed(builder.build()); if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) { - global.getJWTToken().clearToken(); + loginRepository.saveToken(null, null); } return response; } diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/repository/LoginRepository.java b/claimManagement/src/main/java/org/openimis/imisclaims/repository/LoginRepository.java new file mode 100644 index 00000000..0183005f --- /dev/null +++ b/claimManagement/src/main/java/org/openimis/imisclaims/repository/LoginRepository.java @@ -0,0 +1,108 @@ +package org.openimis.imisclaims.repository; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Base64; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.json.JSONException; +import org.json.JSONObject; +import org.openimis.imisclaims.Token; +import org.openimis.imisclaims.util.StringUtils; + +import java.util.Date; + +public class LoginRepository { + private static final String PREFS_NAME = "LoginRepository"; + private static final String HAS_MIGRATED = "has_migrated"; + private static final String FHIR_TOKEN = "fhir_token"; + private static final String FHIR_VALIDITY = "fhir_validity"; + + private final SharedPreferences prefs; + + public LoginRepository(@NonNull Context context) { + prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + if (!prefs.getBoolean(HAS_MIGRATED, false)) { + migrateOldTokens(); + } + } + + @SuppressWarnings("deprecation") + private void migrateOldTokens() { + SharedPreferences.Editor editor = prefs.edit(); + Token token = new Token(); + if (token.isTokenValidJWT()) { + editor.putString(FHIR_TOKEN, token.getTokenText()); + Date validity = token.getValidity(); + if (validity != null) { + editor.putLong(FHIR_VALIDITY, validity.getTime()); + } + } + editor.putBoolean(HAS_MIGRATED, true); + editor.apply(); + } + /** + * Logic taken from [Token.java] + */ + @Nullable + public String getToken() { + String token = prefs.getString(FHIR_TOKEN, null); + if (token == null) { + return null; + } + + int indexOfFirstDot = token.indexOf('.'); + if (indexOfFirstDot == -1) { + return null; + } + + String tokenHeader = token.substring(0, indexOfFirstDot); + try { + JSONObject headerObject = new JSONObject(new String(Base64.decode(tokenHeader, Base64.DEFAULT))); + if (!"JWT".equals(headerObject.getString("typ"))) { + return null; + } + } catch (JSONException e) { + return null; + } + + Date expiryDate = getValidity(); + if (expiryDate == null) { + return null; + } + + Date now = new Date(); + if (now.after(expiryDate)) { + return null; + } + return token; + } + + @Nullable + private Date getValidity() { + long validTo = prefs.getLong(FHIR_VALIDITY, -1); + if (validTo == -1) { + return null; + } + return new Date(validTo); + } + + public void saveToken( + @Nullable String token, @Nullable Date validity + ) { + SharedPreferences.Editor editor = prefs.edit(); + if (StringUtils.isEmpty(token)) { + editor.remove(FHIR_TOKEN); + } else { + editor.putString(FHIR_TOKEN, token); + } + if (validity == null) { + editor.remove(FHIR_VALIDITY); + } else { + editor.putLong(FHIR_VALIDITY, validity.getTime()); + } + editor.apply(); + } +} diff --git a/claimManagement/src/main/java/org/openimis/imisclaims/usecase/Login.java b/claimManagement/src/main/java/org/openimis/imisclaims/usecase/Login.java index 4c55395d..0695789a 100644 --- a/claimManagement/src/main/java/org/openimis/imisclaims/usecase/Login.java +++ b/claimManagement/src/main/java/org/openimis/imisclaims/usecase/Login.java @@ -7,36 +7,38 @@ import org.openimis.imisclaims.network.dto.LoginDto; import org.openimis.imisclaims.network.dto.TokenDto; import org.openimis.imisclaims.network.request.LoginRequest; +import org.openimis.imisclaims.repository.LoginRepository; -import java.util.concurrent.TimeUnit; +import java.util.Date; public class Login { @NonNull private final LoginRequest request; @NonNull - private final Global global; + private final LoginRepository repository; + + + public Login() { + this( + new LoginRequest(), + Global.getGlobal().getLoginRepository() + ); + } public Login( @NonNull LoginRequest request, - @NonNull Global global + @NonNull LoginRepository repository ) { this.request = request; - this.global = global; - } - - public Login() { - this(new LoginRequest(), Global.getGlobal()); + this.repository = repository; } @WorkerThread public void execute(@NonNull String username, String password) { try { TokenDto token = request.post(new LoginDto(username.trim(), password)); - global.getJWTToken().saveTokenText( - token.getToken(), - TimeUnit.SECONDS.toMillis(token.getExpiresOn()) - ); + repository.saveToken(token.getToken(), new Date(token.getExpiresOn())); } catch (Exception e) { e.printStackTrace(); } diff --git a/claimManagement/src/main/res/layout/activity_synchronize.xml b/claimManagement/src/main/res/layout/activity_synchronize.xml index e2c9bfdf..c61f7b6a 100644 --- a/claimManagement/src/main/res/layout/activity_synchronize.xml +++ b/claimManagement/src/main/res/layout/activity_synchronize.xml @@ -160,4 +160,4 @@ - \ No newline at end of file + diff --git a/claimManagement/src/main/res/values-fr/strings.xml b/claimManagement/src/main/res/values-fr/strings.xml index 55586d97..cbfd1c55 100644 --- a/claimManagement/src/main/res/values-fr/strings.xml +++ b/claimManagement/src/main/res/values-fr/strings.xml @@ -160,7 +160,7 @@ Rapports Lier des prod. méd. Lier des soins - Arrêter de fumer + Quitter À propos de Accueil Veuillez entrer votre nom d\'utilisateur et votre mot de passe