diff --git a/build.gradle b/build.gradle index 621379c8a..24f24bb57 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' classpath 'com.palantir:jacoco-coverage:0.4.0' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.11.0" @@ -21,7 +21,6 @@ buildscript { } } -apply plugin: 'com.palantir.jacoco-full-report' apply plugin: 'com.github.kt3k.coveralls' configure(allprojects) { project -> @@ -85,9 +84,9 @@ task clean(type: Delete) { delete rootProject.buildDir } -jacocoFull { - excludeProject ":sample", ":opensrp-client-anc" -} +//jacocoFull { +// excludeProject ":sample", ":opensrp-client-anc" +//} coveralls { jacocoReportPath = "${buildDir}/reports/jacoco/jacocoFullReport/jacocoFullReport.xml" diff --git a/gradle.properties b/gradle.properties index ee579a6ad..774ecd45f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,10 +8,12 @@ # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +org.gradle.jvmargs=-Xmx1536m + android.debug.obsoleteApi=true ## PUBLISHING VARS -VERSION_NAME=2.0.1-SNAPSHOT +VERSION_NAME=2.0.3.40-LOCAL-SNAPSHOT VERSION_CODE=1 GROUP=org.smartregister POM_SETTING_DESCRIPTION=OpenSRP Client ANC Library @@ -24,6 +26,8 @@ POM_SETTING_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_SETTING_LICENCE_DIST=repo POM_SETTING_DEVELOPER_ID=opensrp POM_SETTING_DEVELOPER_NAME=OpenSRP Onadev -android.enableUnitTestBinaryResources=true -android.enableSeparateAnnotationProcessing=true -android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true \ No newline at end of file +#android.enableUnitTestBinaryResources=true +#android.enableSeparateAnnotationProcessing=true +android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 62a7cca6d..2f6d062aa 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Nov 21 15:37:28 EAT 2019 +#Tue Sep 08 12:33:01 EAT 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/opensrp-anc/build.gradle b/opensrp-anc/build.gradle index 221206fd6..db835d519 100644 --- a/opensrp-anc/build.gradle +++ b/opensrp-anc/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.3' classpath 'com.google.gms:google-services:4.3.3' } @@ -58,7 +58,7 @@ android { versionCode 1 versionName "1.2.11" multiDexEnabled true - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' if (properties != null && properties.containsKey("store.file") && properties.containsKey("store.password") && properties.containsKey("key.password")) { signingConfig signingConfigs.release @@ -66,6 +66,7 @@ android { javaCompileOptions { annotationProcessorOptions { + includeCompileClasspath = true arguments = [eventBusIndex: 'org.smartregister.anc.library.ANCEventBusIndex'] } } @@ -95,31 +96,8 @@ android { } packagingOptions { - exclude 'META-INF/DEPENDENCIES.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/notice.txt' - exclude 'META-INF/license.txt' - exclude 'META-INF/dependencies.txt' - exclude 'META-INF/LGPL2.1' - exclude 'LICENSE.txt' - - } - packagingOptions { - exclude 'META-INF/DEPENDENCIES.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/notice.txt' - exclude 'META-INF/license.txt' - exclude 'META-INF/dependencies.txt' - exclude 'META-INF/LGPL2.1' - exclude 'LICENSE.txt' + exclude 'META-INF/LICENSE.md' + exclude 'META-INF/NOTICE.md' } testOptions { @@ -142,8 +120,8 @@ dependencies { def powerMockVersion = '2.0.4' implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation('org.smartregister:opensrp-client-native-form:1.7.28-SNAPSHOT@aar') { + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation('org.smartregister:opensrp-client-native-form:2.0.0-PREVIEW-SNAPSHOT@aar') { transitive = true exclude group: 'com.android.support', module: 'recyclerview-v7' exclude group: 'com.android.support', module: 'appcompat-v7' @@ -154,7 +132,7 @@ dependencies { exclude group: 'org.yaml', module: 'snakeyaml' exclude group: 'io.ona.rdt-capture', module: 'lib' } - implementation('org.smartregister:opensrp-client-core:1.9.4-SNAPSHOT@aar') { + implementation('org.smartregister:opensrp-client-core:2.0.8-SNAPSHOT@aar') { transitive = true exclude group: 'com.github.bmelnychuk', module: 'atv' exclude group: 'com.google.guava', module: 'guava' @@ -192,17 +170,17 @@ dependencies { // explicitly depend on RxJava's latest version for bug fixes and new features. implementation 'io.reactivex.rxjava2:rxjava:2.2.15' implementation 'com.evernote:android-job:1.2.6' - implementation 'com.github.lecho:hellocharts-android:v1.5.8' - implementation 'id.zelory:compressor:2.1.0' - implementation('com.android.support:design:28.0.0') { + implementation 'com.github.lecho:hellocharts-android:1.5.8' + implementation 'id.zelory:compressor:2.1.1' + implementation('com.google.android.material:material:1.0.0') { exclude group: 'com.android.support', module: 'recyclerview-v7' exclude group: 'com.android.support', module: 'cardview-v7' } - implementation 'com.android.support:recyclerview-v7:28.0.0' - implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.cardview:cardview:1.0.0' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation group: 'org.yaml', name: 'snakeyaml', version: '1.25' implementation 'de.hdodenhof:circleimageview:3.0.1' implementation 'org.jeasy:easy-rules-core:3.3.0' @@ -215,7 +193,7 @@ dependencies { } testImplementation 'org.robolectric:robolectric:4.3.1' testImplementation 'org.robolectric:shadows-multidex:4.3.1' - testImplementation 'org.robolectric:shadows-support-v4:3.4-rc2' + // testImplementation 'org.robolectric:shadows-support-v4:3.4-rc2' testImplementation "org.powermock:powermock-module-junit4:$powerMockVersion" testImplementation "org.powermock:powermock-module-junit4-rule:$powerMockVersion" testImplementation "org.powermock:powermock-api-mockito2:$powerMockVersion" @@ -224,13 +202,14 @@ dependencies { testImplementation 'org.apache.maven:maven-ant-tasks:2.1.3' testImplementation 'org.skyscreamer:jsonassert:1.5.0' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2') { + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0') { exclude group: 'com.google.code.findbugs' } } task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) { + reports { xml.enabled = true html.enabled = true @@ -240,14 +219,23 @@ task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'crea getReports().getHtml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/html")) def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*', '**/*$ViewBinder*.*'] - def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes/", excludes: fileFilter) + def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes", excludes: fileFilter) def mainSrc = "$project.projectDir/src/main/java" - sourceDirectories = files([mainSrc]) - classDirectories = files([debugTree]) - executionData = fileTree(dir: project.buildDir, includes: [ + sourceDirectories.setFrom(files([mainSrc])) + classDirectories.setFrom(([debugTree])) + executionData.setFrom(fileTree(dir: project.buildDir, includes: [ 'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec' - ]) + ])) +} + +//coveralls { +// jacocoReportPath = "${buildDir}/reports/jacoco/jacocoRootReport/merged.xml" +// sourceDirs = ["$project.projectDir/src/main/java"] +//} + +coveralls { + jacocoReportPath = "${buildDir}/reports/jacoco/jacocoRootReport/merged.xml" } task printTasks { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/AncLibrary.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/AncLibrary.java index 54067cd85..d0bb723c1 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/AncLibrary.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/AncLibrary.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.gson.Gson; import com.vijay.jsonwizard.constants.JsonFormConstants; @@ -25,6 +25,7 @@ import org.smartregister.anc.library.repository.PreviousContactRepository; import org.smartregister.anc.library.repository.RegisterQueryProvider; import org.smartregister.anc.library.util.AncMetadata; +import org.smartregister.anc.library.util.AppExecutors; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.FilePathUtils; import org.smartregister.configurableviews.helper.JsonSpecHelper; @@ -70,6 +71,7 @@ public class AncLibrary { private int databaseVersion; private ActivityConfiguration activityConfiguration; private AncMetadata ancMetadata = new AncMetadata(); + private AppExecutors appExecutors; private AncLibrary(@NonNull Context context, int dbVersion, @NonNull ActivityConfiguration activityConfiguration, @Nullable SubscriberInfoIndex subscriberInfoIndex, @Nullable RegisterQueryProvider registerQueryProvider) { @@ -344,4 +346,11 @@ public void setRegisterQueryProvider(RegisterQueryProvider registerQueryProvider public AncMetadata getAncMetadata() { return ancMetadata; } + + public AppExecutors getAppExecutors() { + if (appExecutors == null) { + appExecutors = new AppExecutors(); + } + return appExecutors; + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ActivityConfiguration.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ActivityConfiguration.java index 553cff683..823464cdb 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ActivityConfiguration.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ActivityConfiguration.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.activity; import android.app.Activity; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; /** * Created by Ephraim Kigamba - ekigamba@ona.io on 2019-07-17 @@ -12,12 +12,14 @@ public class ActivityConfiguration { private Class homeRegisterActivityClass; private Class landingPageActivityClass; private Class mainContactActivityClass; + private Class profileActivityClass; public ActivityConfiguration() { setHomeRegisterActivityClass(BaseHomeRegisterActivity.class); setLandingPageActivityClass(getHomeRegisterActivityClass()); setMainContactActivityClass(MainContactActivity.class); + setProfileActivityClass(ProfileActivity.class); } public Class getHomeRegisterActivityClass() { @@ -43,4 +45,12 @@ public Class getMainContactActivityClass() { public void setMainContactActivityClass(Class mainContactActivityClass) { this.mainContactActivityClass = mainContactActivityClass; } + + public Class getProfileActivityClass() { + return profileActivityClass; + } + + public void setProfileActivityClass(Class profileActivityClass) { + this.profileActivityClass = profileActivityClass; + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseActivity.java index c45df3737..0290e9bbf 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseActivity.java @@ -3,13 +3,13 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.R; import org.smartregister.anc.library.contract.SiteCharacteristicsContract; -import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.ANCJsonFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; import java.util.Map; @@ -33,7 +33,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ANCJsonFormUtils.REQUEST_CODE_GET_JSON && resultCode == RESULT_OK) { try { String jsonString = data.getStringExtra("json"); - Timber.d("JSONResult %s", jsonString); presenter.saveSiteCharacteristics(jsonString); } catch (Exception e) { Timber.e(e); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseCharacteristicsActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseCharacteristicsActivity.java index 05119d58f..300cf4221 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseCharacteristicsActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseCharacteristicsActivity.java @@ -2,11 +2,11 @@ import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; import android.util.TypedValue; import android.view.View; import android.widget.TextView; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseContactActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseContactActivity.java index aa4ebb80e..e3a81544d 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseContactActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseContactActivity.java @@ -4,8 +4,8 @@ import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivity.java index 393fff3b2..50c0744ec 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivity.java @@ -3,10 +3,10 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.design.bottomnavigation.LabelVisibilityMode; -import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import com.google.android.material.bottomnavigation.LabelVisibilityMode; +import androidx.fragment.app.Fragment; +import androidx.appcompat.app.AlertDialog; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; @@ -38,9 +38,9 @@ import org.smartregister.anc.library.fragment.SortFilterFragment; import org.smartregister.anc.library.presenter.RegisterPresenter; import org.smartregister.anc.library.repository.PatientRepository; +import org.smartregister.anc.library.util.ANCFormUtils; import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.ConstantsUtils; -import org.smartregister.anc.library.util.ANCFormUtils; import org.smartregister.anc.library.util.DBConstantsUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.commonregistry.CommonPersonObjectClient; @@ -56,6 +56,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Map; import timber.log.Timber; @@ -177,6 +178,11 @@ protected Fragment[] getOtherFragments() { return fragments; } + @Override + public void startFormActivity(String s, String s1, Map map) { + //Do nothing + } + @Override public void startFormActivity(String formName, String entityId, String metaData) { try { @@ -227,7 +233,7 @@ protected void onActivityResultExtended(int requestCode, int resultCode, Intent if (requestCode == ANCJsonFormUtils.REQUEST_CODE_GET_JSON && resultCode == Activity.RESULT_OK) { try { String jsonString = data.getStringExtra(ConstantsUtils.JsonFormExtraUtils.JSON); - Timber.d(jsonString); + //Timber.d(jsonString); if (StringUtils.isNotBlank(jsonString)) { JSONObject form = new JSONObject(jsonString); switch (form.getString(ANCJsonFormUtils.ENCOUNTER_TYPE)) { @@ -469,7 +475,7 @@ public void removePatientHandler(PatientRemovedEvent event) { @Override public void startRegistration() { - startFormActivity(ConstantsUtils.JsonFormUtils.ANC_REGISTER, null, null); + startFormActivity(ConstantsUtils.JsonFormUtils.ANC_REGISTER, null, ""); } public void showRecordBirthPopUp(CommonPersonObjectClient client) { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseProfileActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseProfileActivity.java index 56194b95a..b4fa6de22 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseProfileActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/BaseProfileActivity.java @@ -4,10 +4,10 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.view.View; import org.greenrobot.eventbus.EventBus; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactJsonFormActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactJsonFormActivity.java index 0a779f74f..e3e06fa93 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactJsonFormActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactJsonFormActivity.java @@ -3,8 +3,8 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.content.LocalBroadcastManager; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; import android.text.TextUtils; import com.google.gson.Gson; @@ -23,8 +23,8 @@ import org.smartregister.anc.library.fragment.ContactWizardJsonFormFragment; import org.smartregister.anc.library.helper.AncRulesEngineFactory; import org.smartregister.anc.library.task.BackPressedPersistPartialTask; -import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.ANCFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; import java.util.HashMap; import java.util.List; @@ -88,8 +88,7 @@ protected void initializeFormFragmentCore() { JsonWizardFormFragment contactJsonFormFragment = ContactWizardJsonFormFragment.getFormFragment(JsonFormConstants.FIRST_STEP_NAME); - getSupportFragmentManager().beginTransaction().add(com.vijay.jsonwizard.R.id.container, contactJsonFormFragment) - .commit(); + getSupportFragmentManager().beginTransaction().add(com.vijay.jsonwizard.R.id.container, contactJsonFormFragment).commit(); } @Override @@ -130,7 +129,7 @@ protected void checkBoxWriteValue(String stepName, String parentKey, String chil quickCheckDangerSignsSelectionHandler(fields); } - invokeRefreshLogic(value, popup, parentKey, childKey); + invokeRefreshLogic(value, popup, parentKey, childKey, stepName, false); return; } } @@ -142,6 +141,14 @@ protected void checkBoxWriteValue(String stepName, String parentKey, String chil @Override public void onBackPressed() { + if (getmJSONObject().optString(JsonFormConstants.ENCOUNTER_TYPE).equals(ConstantsUtils.JsonFormUtils.ANC_PROFILE_ENCOUNTER_TYPE)) { + ContactWizardJsonFormFragment contactWizardJsonFormFragment = (ContactWizardJsonFormFragment) getVisibleFragment(); + contactWizardJsonFormFragment.getPresenter().validateAndWriteValues(); + Intent intent = new Intent(); + intent.putExtra("formInvalidFields", + getmJSONObject().optString(JsonFormConstants.ENCOUNTER_TYPE) + ":" + contactWizardJsonFormFragment.getPresenter().getInvalidFields().size()); + setResult(RESULT_OK, intent); + } new BackPressedPersistPartialTask(getContact(), this, getIntent(), currentJsonState()).execute(); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactSummarySendActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactSummarySendActivity.java index b61a22685..9d3c276b2 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactSummarySendActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ContactSummarySendActivity.java @@ -1,16 +1,17 @@ package org.smartregister.anc.library.activity; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import org.apache.commons.lang3.StringUtils; import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.R; import org.smartregister.anc.library.adapter.ContactSummaryAdapter; @@ -106,11 +107,24 @@ public void displayPatientName(String fullName) { @Override public void displayUpcomingContactDates(List models) { - if (models.size() <= 0) { + if (models == null || models.isEmpty()) { contactDatesRecyclerView.setVisibility(View.GONE); contactScheduleHeadingTextView.setVisibility(View.GONE); + return; } - contactSummaryAdapter.setContactDates(models.size() > 5 ? models.subList(0, 4) : models); + String maxContactToDisplay = Utils.getProperties(getApplicationContext()).getProperty(ConstantsUtils.Properties.MAX_CONTACT_SCHEDULE_DISPLAYED, ""); + if (StringUtils.isNotBlank(maxContactToDisplay)) { + try { + int count = Integer.parseInt(maxContactToDisplay); + contactSummaryAdapter.setContactDates(models.size() > count ? models.subList(0, (count - 1)) : models); + } catch (NumberFormatException e) { + contactSummaryAdapter.setContactDates(models); + Timber.e(e); + } + } else { + contactSummaryAdapter.setContactDates(models); + } + } @Override diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/LibraryContentActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/LibraryContentActivity.java index 2e7eba2f2..53810b812 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/LibraryContentActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/LibraryContentActivity.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.activity; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.view.View; import android.widget.TextView; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/MainContactActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/MainContactActivity.java index 8ee32872e..695d6f372 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/MainContactActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/MainContactActivity.java @@ -1,6 +1,7 @@ package org.smartregister.anc.library.activity; import android.annotation.SuppressLint; +import android.content.Intent; import android.text.TextUtils; import android.view.View; import android.widget.TextView; @@ -20,9 +21,10 @@ import org.smartregister.anc.library.model.PartialContact; import org.smartregister.anc.library.model.PreviousContact; import org.smartregister.anc.library.presenter.ContactPresenter; +import org.smartregister.anc.library.repository.PatientRepository; +import org.smartregister.anc.library.util.ANCFormUtils; import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.ConstantsUtils; -import org.smartregister.anc.library.util.ANCFormUtils; import org.smartregister.anc.library.util.DBConstantsUtils; import org.smartregister.anc.library.util.FilePathUtils; import org.smartregister.anc.library.util.Utils; @@ -58,6 +60,7 @@ public class MainContactActivity extends BaseContactActivity implements ContactC private String[] contactForms = new String[]{ConstantsUtils.JsonFormUtils.ANC_QUICK_CHECK, ConstantsUtils.JsonFormUtils.ANC_PROFILE, ConstantsUtils.JsonFormUtils.ANC_SYMPTOMS_FOLLOW_UP, ConstantsUtils.JsonFormUtils.ANC_PHYSICAL_EXAM, ConstantsUtils.JsonFormUtils.ANC_TEST, ConstantsUtils.JsonFormUtils.ANC_COUNSELLING_TREATMENT, ConstantsUtils.JsonFormUtils.ANC_TEST_TASKS}; + private String formInvalidFields = null; @Override protected void onResume() { @@ -90,6 +93,12 @@ private void initializeMainContactContainers() { process(contactForms); requiredFieldsMap.put(ConstantsUtils.JsonFormUtils.ANC_TEST_TASKS_ENCOUNTER_TYPE, 0); + if (StringUtils.isNotBlank(formInvalidFields) && contactNo > 1 && !PatientRepository.isFirstVisit(baseEntityId)) { + String[] pair = formInvalidFields.split(":"); + if (ConstantsUtils.JsonFormUtils.ANC_PROFILE_ENCOUNTER_TYPE.equals(pair[0])) + requiredFieldsMap.put(pair[0], Integer.parseInt(pair[1])); + } + List contacts = new ArrayList<>(); Contact quickCheck = new Contact(); @@ -215,7 +224,7 @@ private void loadContactGlobalsConfig() throws IOException { private void process(String[] mainContactForms) { //Fetch and load previously saved values try { - if (contactNo > 1) { + if (contactNo > 1 && !PatientRepository.isFirstVisit(baseEntityId)) { for (String formEventType : new ArrayList<>(Arrays.asList(mainContactForms))) { if (eventToFileMap.containsValue(formEventType)) { updateGlobalValuesWithDefaults(formEventType); @@ -307,7 +316,8 @@ private void processRequiredStepsField(JSONObject object) throws Exception { if (!ConstantsUtils.JsonFormUtils.ANC_TEST_ENCOUNTER_TYPE.equals(encounterType) && (requiredFieldsMap.size() == 0 || !requiredFieldsMap.containsKey(encounterType))) { requiredFieldsMap.put(object.getString(ConstantsUtils.JsonFormKeyUtils.ENCOUNTER_TYPE), 0); } - if (contactNo > 1 && ConstantsUtils.JsonFormUtils.ANC_PROFILE_ENCOUNTER_TYPE.equals(encounterType)) { + if (contactNo > 1 && ConstantsUtils.JsonFormUtils.ANC_PROFILE_ENCOUNTER_TYPE.equals(encounterType) + && !PatientRepository.isFirstVisit(baseEntityId)) { requiredFieldsMap.put(ConstantsUtils.JsonFormUtils.ANC_PROFILE_ENCOUNTER_TYPE, 0); } @@ -318,7 +328,7 @@ private void processRequiredStepsField(JSONObject object) throws Exception { Iterator keys = object.keys(); while (keys.hasNext()) { String key = keys.next(); - if (key.startsWith(RuleConstant.STEP)) { + if (key.startsWith(RuleConstant.STEP) && !object.getJSONObject(key).has("skipped")) { JSONArray stepArray = object.getJSONObject(key).getJSONArray(JsonFormConstants.FIELDS); for (int i = 0; i < stepArray.length(); i++) { JSONObject fieldObject = stepArray.getJSONObject(i); @@ -730,6 +740,10 @@ public void loadGlobals(Contact contact) { map.put(ConstantsUtils.PREVIOUS_CONTACT_NO, contactNo > 1 ? String.valueOf(contactNo - 1) : "0"); map.put(ConstantsUtils.AGE, womanAge); + if (ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT.equals(Utils.getDueCheckStrategy())) { + map.put(ConstantsUtils.IS_FIRST_CONTACT, String.valueOf(PatientRepository.isFirstVisit(baseEntityId))); + } + //Inject gestational age when it has not been calculated from profile form if (TextUtils.isEmpty(formGlobalValues.get(ConstantsUtils.GEST_AGE_OPENMRS))) { map.put(ConstantsUtils.GEST_AGE_OPENMRS, String.valueOf(presenter.getGestationAge())); @@ -761,4 +775,11 @@ protected void onPause() { formGlobalValues.clear(); invisibleRequiredFields.clear(); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK && data != null) { + formInvalidFields = data.getStringExtra("formInvalidFields"); + } + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsDetailsActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsDetailsActivity.java index 65f9d42c8..ff9c4fa31 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsDetailsActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsDetailsActivity.java @@ -1,11 +1,11 @@ package org.smartregister.anc.library.activity; import android.os.Bundle; -import android.support.constraint.ConstraintLayout; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.MenuItem; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsTestsActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsTestsActivity.java index 58b62fb18..7047d8a5d 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsTestsActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/PreviousContactsTestsActivity.java @@ -1,10 +1,10 @@ package org.smartregister.anc.library.activity; import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ProfileActivity.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ProfileActivity.java index c148f5d02..d9f0f47ed 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ProfileActivity.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/activity/ProfileActivity.java @@ -8,10 +8,10 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.constraint.ConstraintLayout; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -36,9 +36,9 @@ import org.smartregister.anc.library.fragment.ProfileOverviewFragment; import org.smartregister.anc.library.fragment.ProfileTasksFragment; import org.smartregister.anc.library.presenter.ProfilePresenter; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.anc.library.view.CopyToClipboardDialog; import org.smartregister.repository.AllSharedPreferences; @@ -148,6 +148,7 @@ public void onClick(View view) { if (StringUtils.isNotBlank(baseEntityId)) { Utils.proceedToContact(baseEntityId, detailMap, getActivity()); + finish(); } } else { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/CharacteristicsAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/CharacteristicsAdapter.java index 7a71ee7f9..d686e78cf 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/CharacteristicsAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/CharacteristicsAdapter.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactAdapter.java index 2878a46c4..c3202b9d7 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactAdapter.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactScheduleAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactScheduleAdapter.java index ea26fc760..deb19dd73 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactScheduleAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactScheduleAdapter.java @@ -1,9 +1,9 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.constraint.ConstraintLayout; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryAdapter.java index 6db3c0395..d35298b78 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryAdapter.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.adapter; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryFinishAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryFinishAdapter.java index 1c63371d2..ffc1505a9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryFinishAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactSummaryFinishAdapter.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactTasksDisplayAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactTasksDisplayAdapter.java index b8189bea2..447a8f87f 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactTasksDisplayAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ContactTasksDisplayAdapter.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAdapter.java index 4dc45d19b..c41ce1c5d 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAdapter.java @@ -1,9 +1,10 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.constraint.ConstraintLayout; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -13,14 +14,19 @@ import org.apache.commons.lang3.StringUtils; import org.jeasy.rules.api.Facts; +import org.joda.time.LocalDate; +import org.joda.time.Weeks; import org.smartregister.anc.library.R; import org.smartregister.anc.library.domain.LastContactDetailsWrapper; import org.smartregister.anc.library.domain.YamlConfigWrapper; -import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.ANCJsonFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; +import org.smartregister.anc.library.util.Utils; import java.util.List; +import timber.log.Timber; + public class LastContactAdapter extends RecyclerView.Adapter { private List lastContactDetailsList; private LayoutInflater inflater; @@ -56,6 +62,8 @@ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) { contactNo = lastContactDetails.getContactNo(); } + gestAge = updateGABasedOnDueStrategy(gestAge, contactNo, lastContactDetails); + if (!StringUtils.isEmpty(gestAge)) { viewHolder.contactTextView.setText( !StringUtils.isEmpty(contactNo) ? String @@ -78,6 +86,36 @@ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) { } } + private String updateGABasedOnDueStrategy(@Nullable String gestAge, @NonNull String contactNo, @NonNull LastContactDetailsWrapper lastContactDetails) { + String tempGestAge = gestAge; + if (ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT.equals(Utils.getDueCheckStrategy())) { + Facts facts = lastContactDetails.getFacts(); + + if (StringUtils.isBlank(tempGestAge)) { + if ("1".equals(contactNo.trim())) + tempGestAge = "-"; + else if (lastContactDetailsList.size() > 1) { + try { + LastContactDetailsWrapper firstLastContactDetailsWrapper = lastContactDetailsList.get(0); + Facts firstFacts = firstLastContactDetailsWrapper.getFacts(); + String edd = Utils.reverseHyphenSeperatedValues(firstFacts.get(ConstantsUtils.EDD), "-"); + if (firstFacts.get(ConstantsUtils.GEST_AGE_OPENMRS) == null) { + String contactDate = facts.get(ConstantsUtils.CONTACT_DATE); + int diffWeeks = ConstantsUtils.DELIVERY_DATE_WEEKS - Math.abs(Weeks.weeksBetween(LocalDate.parse(edd), LocalDate.parse(contactDate)).getWeeks()); + tempGestAge = String.valueOf(diffWeeks); + } else { + tempGestAge = firstFacts.get(ConstantsUtils.GEST_AGE_OPENMRS); + } + } catch (IllegalArgumentException e) { + tempGestAge = "-"; + Timber.e(e); + } + } + } + } + return tempGestAge; + } + private void createContactDetailsView(List data, Facts facts, ViewHolder viewHolder) { if (data != null && data.size() > 0) { for (int position = 0; position < data.size(); position++) { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsDialogAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsDialogAdapter.java index a02f464cb..a28dd7ddd 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsDialogAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsDialogAdapter.java @@ -1,9 +1,9 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsResultsDialogAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsResultsDialogAdapter.java index ff84d11a3..1a6e0ffa2 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsResultsDialogAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LastContactAllTestsResultsDialogAdapter.java @@ -2,8 +2,8 @@ import android.content.Context; import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LibraryContentAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LibraryContentAdapter.java index 4228a2309..7fc5cd132 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LibraryContentAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/LibraryContentAdapter.java @@ -2,8 +2,8 @@ import android.app.Activity; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/PreviousContactsAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/PreviousContactsAdapter.java index 07682db11..69d6b3e67 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/PreviousContactsAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/PreviousContactsAdapter.java @@ -1,9 +1,9 @@ package org.smartregister.anc.library.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileOverviewAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileOverviewAdapter.java index b8d358a33..c27cb58b0 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileOverviewAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileOverviewAdapter.java @@ -2,10 +2,10 @@ import android.app.Activity; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapter.java index 468c74d7a..0f4b020df 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapter.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.adapter; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; import java.util.ArrayList; import java.util.List; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/configuration/AncMaternityTransferProcessor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/configuration/AncMaternityTransferProcessor.java new file mode 100644 index 000000000..03776573e --- /dev/null +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/configuration/AncMaternityTransferProcessor.java @@ -0,0 +1,187 @@ +package org.smartregister.anc.library.configuration; + + +import androidx.annotation.NonNull; + +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.utils.FormUtils; + +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.smartregister.anc.library.AncLibrary; +import org.smartregister.anc.library.interactor.ClientTransferProcessor; +import org.smartregister.anc.library.model.PreviousContact; +import org.smartregister.anc.library.util.ANCJsonFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; +import org.smartregister.anc.library.util.Utils; +import org.smartregister.clientandeventmodel.Event; +import org.smartregister.domain.tag.FormTag; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import timber.log.Timber; + +import static org.smartregister.anc.library.util.ANCJsonFormUtils.METADATA; +import static org.smartregister.util.JsonFormUtils.ENTITY_ID; + +public class AncMaternityTransferProcessor implements ClientTransferProcessor { + + private String baseEntityId = null; + + @Override + public void startTransferProcessing(@NonNull JSONObject closeForm) throws Exception { + setBaseEntityId(closeForm.optString(ENTITY_ID)); + String closeReason = FormUtils.getFieldFromForm(closeForm, ConstantsUtils.JsonFormKeyUtils.ANC_CLOSE_REASON).optString(JsonFormConstants.VALUE); + + List formSubmissionIds = new ArrayList<>(); + //create transfer event + if (closeReason.equalsIgnoreCase("in_labour")) { + Event transferEvent = createAncMaternityTransferEvent(closeForm); + saveEvent(transferEvent, transferEvent.getBaseEntityId()); + formSubmissionIds.add(transferEvent.getFormSubmissionId()); + } + + //create anc close event + Event closeEvent = createAncCloseEvent(closeForm); + if (closeReason.equalsIgnoreCase("woman_died")) { + closeEvent.setEventType("Death"); + } + saveEvent(closeEvent, getBaseEntityId()); + formSubmissionIds.add(closeEvent.getFormSubmissionId()); + + long lastSyncTimeStamp = Utils.getAllSharedPreferences().fetchLastUpdatedAtDate(0); + Date lastSyncDate = new Date(lastSyncTimeStamp); + AncLibrary.getInstance().getClientProcessorForJava() + .processClient( + AncLibrary.getInstance() + .getEcSyncHelper() + .getEvents(formSubmissionIds)); + + Utils.getAllSharedPreferences().saveLastUpdatedAtDate(lastSyncDate.getTime()); + } + + private void saveEvent(@NonNull Event event, @NonNull String baseEntityId) throws JSONException { + JSONObject eventJson = new JSONObject(ANCJsonFormUtils.gson.toJson(event)); + AncLibrary.getInstance().getEcSyncHelper().addEvent(baseEntityId, eventJson); + } + + protected Event createAncMaternityTransferEvent(@NonNull JSONObject closeForm) { + JSONObject jsonFormObject = populateTransferForm(closeForm); + FormTag formTag = ANCJsonFormUtils.getFormTag(Utils.getAllSharedPreferences()); + Event event = ANCJsonFormUtils.createEvent(FormUtils.getMultiStepFormFields(jsonFormObject), + jsonFormObject.optJSONObject(METADATA), formTag, getBaseEntityId(), jsonFormObject.optString(JsonFormConstants.ENCOUNTER_TYPE), ""); + ANCJsonFormUtils.tagSyncMetadata(Utils.getAllSharedPreferences(), event); + return event; + } + + protected Event createAncCloseEvent(@NonNull JSONObject closeFormObject) { + FormTag formTag = ANCJsonFormUtils.getFormTag(Utils.getAllSharedPreferences()); + Event event = ANCJsonFormUtils.createEvent(FormUtils.getMultiStepFormFields(closeFormObject), + closeFormObject.optJSONObject(METADATA), formTag, closeFormObject.optString(ENTITY_ID), closeFormObject.optString(JsonFormConstants.ENCOUNTER_TYPE), ""); + ANCJsonFormUtils.tagSyncMetadata(Utils.getAllSharedPreferences(), event); + return event; + } + + + @Override + public String transferForm() { + return ""; + } + + @Override + public Map columnMap() { + return new HashMap<>(); + } + + @Override + public Map details() { + String[] keyStrings = previousContactKeys(); + HashMap transferDetails = new HashMap<>(); + List previousContacts = AncLibrary.getInstance() + .getPreviousContactRepository() + .getPreviousContacts(getBaseEntityId(), keyStrings); + for (PreviousContact previousContact : previousContacts) { + transferDetails.put(previousContact.getKey(), previousContact.getValue()); + } + return transferDetails; + } + + @NotNull + protected String[] previousContactKeys() { + return new String[]{"gravida", "prev_preg_comps", + "prev_preg_comps_other", "miscarriages_abortions", "occupation", "occupation_other", + "religion_other", "religion", "marital_status", "educ_level"}; + } + + @Override + public JSONObject populateTransferForm(@NonNull JSONObject closeForm) { + JSONObject jsonForm = null; + try { + if (StringUtils.isNotBlank(transferForm())) { + jsonForm = Utils.getFormUtils().getFormJson(transferForm()); + if (jsonForm != null) { + Map clientDetails = details(); + Map columnMap = columnMap(); + JSONArray fields = jsonForm.optJSONObject(JsonFormConstants.STEP1) + .optJSONArray(JsonFormConstants.FIELDS); + + for (int i = 0; i < fields.length(); i++) { + JSONObject object = fields.optJSONObject(i); + String key = object.optString(JsonFormConstants.KEY); + + if (clientDetails.get(key) != null) { + updateValue(object, clientDetails.get(key)); + } + + if (columnMap.get(key) != null) { + object.put(JsonFormConstants.KEY, columnMap.get(key)); + } + } + + JSONArray closeFormFields = FormUtils.getMultiStepFormFields(closeForm); + List closeFormFieldsList = getCloseFormFieldsList(); + for (int i = 0; i < closeFormFields.length() && !closeFormFieldsList.isEmpty(); i++) { + JSONObject object = closeFormFields.optJSONObject(i); + String key = object.optString(JsonFormConstants.KEY); + if (closeFormFieldsList.contains(key)) { + fields.put(object); + closeFormFieldsList.remove(key); + } + } + } + } + } catch (JSONException e) { + Timber.e(e); + } + return jsonForm; + } + + protected void updateValue(@NonNull JSONObject object, @NonNull String value) { + Timber.i("key %s", object.optString(JsonFormConstants.KEY)); + try { + object.put(JsonFormConstants.VALUE, value); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + protected List getCloseFormFieldsList() { + return new ArrayList<>(Arrays.asList("onset_labour_date", "onset_labour_time")); + } + + public String getBaseEntityId() { + return baseEntityId; + } + + public void setBaseEntityId(String baseEntityId) { + this.baseEntityId = baseEntityId; + } +} diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/contract/RegisterContract.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/contract/RegisterContract.java index 6f534d460..8ee26b415 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/contract/RegisterContract.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/contract/RegisterContract.java @@ -1,6 +1,6 @@ package org.smartregister.anc.library.contract; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.tuple.Triple; import org.json.JSONObject; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/event/PatientRemovedEvent.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/event/PatientRemovedEvent.java index b6dc727b6..5cce2d4a9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/event/PatientRemovedEvent.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/event/PatientRemovedEvent.java @@ -5,4 +5,13 @@ */ public class PatientRemovedEvent extends BaseEvent { + private String closedNature; + + public String getClosedNature() { + return closedNature; + } + + public void setClosedNature(String closedNature) { + this.closedNature = closedNature; + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/AdvancedSearchFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/AdvancedSearchFragment.java index 6812f10f4..8e4ee844b 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/AdvancedSearchFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/AdvancedSearchFragment.java @@ -7,8 +7,8 @@ import android.database.Cursor; import android.net.ConnectivityManager; import android.os.Bundle; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; +import androidx.loader.content.CursorLoader; +import androidx.loader.content.Loader; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragment.java index a09aa48f3..144181952 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragment.java @@ -3,8 +3,8 @@ import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; @@ -29,9 +29,8 @@ import org.smartregister.anc.library.activity.ContactJsonFormActivity; import org.smartregister.anc.library.domain.Contact; import org.smartregister.anc.library.presenter.ContactWizardJsonFormFragmentPresenter; -import org.smartregister.anc.library.task.ANCNextProgressDialogTask; -import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.ANCFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.anc.library.viewstate.ContactJsonFormFragmentViewState; @@ -144,11 +143,6 @@ protected void setupCustomUI() { @Override public void onResume() { super.onResume(); - if (!getJsonApi().isPreviousPressed()) { - skipStepsOnNextPressed(); - } else { - skipStepOnPreviousPressed(); - } setJsonFormFragment(this); } @@ -290,15 +284,25 @@ public void displayQuickCheckBottomReferralButtons(boolean none, boolean other) proceedButton = buttonLayout.findViewById(R.id.proceed); } - setQuickCheckButtonsVisible(none, other, buttonLayout, referButton, proceedButton); - setQuickCheckButtonsInvisible(none, other, buttonLayout, referButton, proceedButton); - if ((none && !other) && buttonLayout != null) { - referButton.setVisibility(View.GONE); - } + Button finalReferButton = referButton; + Button finalProceedButton = proceedButton; + getJsonApi().getAppExecutors().mainThread().execute(new Runnable() { + @Override + public void run() { + setQuickCheckButtonsVisible(none, other, buttonLayout, finalReferButton, finalProceedButton); + setQuickCheckButtonsInvisible(none, other, buttonLayout, finalReferButton, finalProceedButton); + + if ((none && !other) && buttonLayout != null) { + finalReferButton.setVisibility(View.GONE); + } + } + }); + } + @Nullable private LinearLayout getQuickCheckButtonsLayout() { LinearLayout linearLayout = (LinearLayout) this.getView(); @@ -343,11 +347,22 @@ public void onClick(View view) { if (view.getId() == com.vijay.jsonwizard.R.id.next || view.getId() == com.vijay.jsonwizard.R.id.next_icon) { Object tag = view.getTag(com.vijay.jsonwizard.R.id.NEXT_STATE); if (tag == null) { - new ANCNextProgressDialogTask(getJsonFormFragment()).execute(); + getJsonApi().getAppExecutors().diskIO().execute(new Runnable() { + @Override + public void run() { + next(); + } + }); +// new ANCNextProgressDialogTask(getJsonFormFragment()).execute(); } else { boolean next = (boolean) tag; if (next) { - new ANCNextProgressDialogTask(getJsonFormFragment()).execute(); + getJsonApi().getAppExecutors().diskIO().execute(new Runnable() { + @Override + public void run() { + next(); + } + }); } else { savePartial = true; save(); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/HomeRegisterFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/HomeRegisterFragment.java index fe8182ac9..a4d604311 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/HomeRegisterFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/HomeRegisterFragment.java @@ -3,8 +3,10 @@ import android.annotation.SuppressLint; import android.database.Cursor; import android.os.Bundle; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; + +import androidx.fragment.app.Fragment; +import androidx.loader.content.CursorLoader; +import androidx.loader.content.Loader; import android.text.TextUtils; import android.view.View; import android.widget.RelativeLayout; @@ -65,7 +67,7 @@ protected void initializePresenter() { public void setUniqueID(String qrCode) { BaseRegisterActivity baseRegisterActivity = (BaseRegisterActivity) getActivity(); if (baseRegisterActivity != null) { - android.support.v4.app.Fragment currentFragment = + Fragment currentFragment = baseRegisterActivity.findFragmentByPosition(BaseRegisterActivity.ADVANCED_SEARCH_POSITION); if (currentFragment instanceof AdvancedSearchFragment) { ((AdvancedSearchFragment) currentFragment).getAncId().setText(qrCode); @@ -78,7 +80,7 @@ public void setUniqueID(String qrCode) { public void setAdvancedSearchFormData(HashMap formData) { BaseRegisterActivity baseRegisterActivity = (BaseRegisterActivity) getActivity(); if (baseRegisterActivity != null) { - android.support.v4.app.Fragment currentFragment = + Fragment currentFragment = baseRegisterActivity.findFragmentByPosition(BaseRegisterActivity.ADVANCED_SEARCH_POSITION); ((AdvancedSearchFragment) currentFragment).setSearchFormData(formData); } @@ -123,7 +125,7 @@ protected String getDefaultSortQuery() { @Override protected void startRegistration() { - ((BaseHomeRegisterActivity) getActivity()).startFormActivity(ConstantsUtils.JsonFormUtils.ANC_REGISTER, null, null); + ((BaseHomeRegisterActivity) getActivity()).startFormActivity(ConstantsUtils.JsonFormUtils.ANC_REGISTER, null, ""); } @Override diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/LibraryFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/LibraryFragment.java index fee74c143..f71ab08b2 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/LibraryFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/LibraryFragment.java @@ -1,11 +1,11 @@ package org.smartregister.anc.library.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/MeFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/MeFragment.java index 7343aa30d..18ec8e150 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/MeFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/MeFragment.java @@ -2,8 +2,8 @@ import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/NoMatchDialogFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/NoMatchDialogFragment.java index 50ac67120..e88eb8ed7 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/NoMatchDialogFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/NoMatchDialogFragment.java @@ -6,7 +6,7 @@ import android.app.FragmentTransaction; import android.content.DialogInterface; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -92,7 +92,7 @@ public void onClick(View view) { private void goToAdvancedSearch(String whoAncId) { ((BaseHomeRegisterActivity) baseRegisterActivity).startAdvancedSearch(); - android.support.v4.app.Fragment currentFragment = + androidx.fragment.app.Fragment currentFragment = baseRegisterActivity.findFragmentByPosition(BaseRegisterActivity.ADVANCED_SEARCH_POSITION); ((AdvancedSearchFragment) currentFragment).getAncId().setText(whoAncId); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileContactsFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileContactsFragment.java index 17c4308d3..b83723451 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileContactsFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileContactsFragment.java @@ -2,9 +2,9 @@ import android.content.Intent; import android.os.Bundle; -import android.support.constraint.ConstraintLayout; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -14,6 +14,7 @@ import android.widget.ScrollView; import android.widget.TextView; +import org.apache.commons.lang3.StringUtils; import org.jeasy.rules.api.Facts; import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.R; @@ -27,12 +28,13 @@ import org.smartregister.anc.library.domain.YamlConfig; import org.smartregister.anc.library.domain.YamlConfigItem; import org.smartregister.anc.library.domain.YamlConfigWrapper; +import org.smartregister.anc.library.model.PreviousContact; import org.smartregister.anc.library.model.Task; import org.smartregister.anc.library.presenter.ProfileFragmentPresenter; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; import org.smartregister.anc.library.util.FilePathUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.view.fragment.BaseProfileFragment; @@ -119,6 +121,7 @@ protected void onResumption() { } setUpAlertStatusButton(); contactNo = String.valueOf(Utils.getTodayContact(clientDetails.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT))); + populatePreviousContactMissingEssentials(clientDetails); initializeLastContactDetails(clientDetails); if (lastContactDetails.isEmpty() && lastContactTests.isEmpty()) { @@ -130,6 +133,25 @@ protected void onResumption() { } } + private void populatePreviousContactMissingEssentials(HashMap clientDetails) { + try { + if (clientDetails != null && clientDetails.containsKey("edd") && StringUtils.isNotBlank(clientDetails.get("edd"))) { + Facts entries = AncLibrary.getInstance().getPreviousContactRepository().getPreviousContactFacts(baseEntityId, contactNo, false); + if (entries != null && entries.get(ConstantsUtils.GEST_AGE_OPENMRS) != null) + return; + int gestAgeOpenmrs = Utils.getGestationAgeFromEDDate(clientDetails.get("edd")); + PreviousContact previousContact = new PreviousContact(); + previousContact.setBaseEntityId(baseEntityId); + previousContact.setContactNo(contactNo); + previousContact.setKey(ConstantsUtils.GEST_AGE_OPENMRS); + previousContact.setValue(String.valueOf(gestAgeOpenmrs)); + AncLibrary.getInstance().getPreviousContactRepository().savePreviousContact(previousContact); + } + } catch (Exception e) { + Timber.e(e); + } + } + private void setUpAlertStatusButton() { Utils.processButtonAlertStatus(getActivity(), dueButton, buttonAlertStatus); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileOverviewFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileOverviewFragment.java index 42d4951e4..0b784e9dd 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileOverviewFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileOverviewFragment.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.fragment; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileTasksFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileTasksFragment.java index 9dcb17e6d..fc8a7a5eb 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileTasksFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/ProfileTasksFragment.java @@ -2,8 +2,8 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/SortFilterFragment.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/SortFilterFragment.java index 5c33c0a11..330fcf6b9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/SortFilterFragment.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/fragment/SortFilterFragment.java @@ -4,12 +4,12 @@ import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.Html; import android.view.LayoutInflater; import android.view.View; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/helper/AncRulesEngineFactory.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/helper/AncRulesEngineFactory.java index 704c55a5f..bd79b8e70 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/helper/AncRulesEngineFactory.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/helper/AncRulesEngineFactory.java @@ -12,31 +12,30 @@ import java.util.Map; public class AncRulesEngineFactory extends RulesEngineFactory { - private Map globalValues; private AncRulesEngineHelper ancRulesEngineHelper; private String selectedRuleName; + private Facts globalFacts; public AncRulesEngineFactory(Context context, Map globalValues, JSONObject mJSONObject) { super(context, globalValues); this.ancRulesEngineHelper = new AncRulesEngineHelper(context); this.ancRulesEngineHelper.setJsonObject(mJSONObject); - this.globalValues = globalValues; - } - - @Override - protected Facts initializeFacts(Facts facts) { if (globalValues != null) { + globalFacts = new Facts(); for (Map.Entry entry : globalValues.entrySet()) { - facts.put(RuleConstant.PREFIX.GLOBAL + entry.getKey(), getValue(entry.getValue())); + globalFacts.put(RuleConstant.PREFIX.GLOBAL + entry.getKey(), getValue(entry.getValue())); } - - facts.asMap().putAll(globalValues); } + } + @Override + protected Facts initializeFacts(Facts facts) { + if (globalFacts != null) { + facts.asMap().putAll(globalFacts.asMap()); + } selectedRuleName = facts.get(RuleConstant.SELECTED_RULE); - facts.put("helper", ancRulesEngineHelper); return facts; } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/AdvancedSearchInteractor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/AdvancedSearchInteractor.java index 43b3dffc5..b5d71c6d9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/AdvancedSearchInteractor.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/AdvancedSearchInteractor.java @@ -1,6 +1,6 @@ package org.smartregister.anc.library.interactor; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.VisibleForTesting; import org.apache.commons.lang3.StringUtils; import org.smartregister.DristhiConfiguration; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ClientTransferProcessor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ClientTransferProcessor.java new file mode 100644 index 000000000..d680d057e --- /dev/null +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ClientTransferProcessor.java @@ -0,0 +1,19 @@ +package org.smartregister.anc.library.interactor; + +import androidx.annotation.NonNull; + +import org.json.JSONObject; + +import java.util.Map; + +public interface ClientTransferProcessor { + void startTransferProcessing(@NonNull JSONObject closeForm) throws Exception; + + String transferForm(); + + Map columnMap(); + + Map details(); + + JSONObject populateTransferForm(JSONObject closeForm); +} diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactInteractor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactInteractor.java index 7e26aca81..00c45ae5b 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactInteractor.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactInteractor.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.interactor; import android.content.Context; -import android.support.annotation.VisibleForTesting; -import android.support.v4.util.Pair; +import androidx.annotation.VisibleForTesting; +import androidx.core.util.Pair; import android.text.TextUtils; import org.jeasy.rules.api.Facts; @@ -21,10 +21,10 @@ import org.smartregister.anc.library.repository.PartialContactRepository; import org.smartregister.anc.library.repository.PreviousContactRepository; import org.smartregister.anc.library.rule.ContactRule; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.AppExecutors; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.clientandeventmodel.Event; import org.smartregister.repository.DetailsRepository; @@ -129,9 +129,9 @@ public HashMap finalizeContactForm(final Map det addReferralGa(baseEntityId, details); } - Pair eventPair = ANCJsonFormUtils.createContactVisitEvent(formSubmissionIDs, details); + Pair eventPair = ANCJsonFormUtils.createVisitAndUpdateEvent(formSubmissionIDs, details); if (eventPair != null) { - createEvent(baseEntityId, new JSONObject(facts.asMap()).toString(), eventPair, referral); + createEvent(baseEntityId, new JSONObject(facts.asMap()).toString(), eventPair, referral, getCurrentContactState(baseEntityId)); JSONObject updateClientEventJson = new JSONObject(ANCJsonFormUtils.gson.toJson(eventPair.second)); AncLibrary.getInstance().getEcSyncHelper().addEvent(baseEntityId, updateClientEventJson); } @@ -211,14 +211,9 @@ private void addReferralGa(String baseEntityId, Map details) { } private void createEvent(String baseEntityId, String attentionFlagsString, Pair eventPair, - String referral) + String referral, String currentContactState) throws JSONException { - Event event = eventPair.first; - event.addDetails(ConstantsUtils.DetailsKeyUtils.ATTENTION_FLAG_FACTS, attentionFlagsString); - String currentContactState = getCurrentContactState(baseEntityId); - if (currentContactState != null && referral == null) { - event.addDetails(ConstantsUtils.DetailsKeyUtils.PREVIOUS_CONTACTS, currentContactState); - } + Event event = Utils.addContactVisitDetails(attentionFlagsString, eventPair.first, referral, currentContactState); JSONObject eventJson = new JSONObject(ANCJsonFormUtils.gson.toJson(event)); AncLibrary.getInstance().getEcSyncHelper().addEvent(baseEntityId, eventJson); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactSummaryInteractor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactSummaryInteractor.java index 4c8853cab..a321a1a69 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactSummaryInteractor.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/ContactSummaryInteractor.java @@ -1,6 +1,6 @@ package org.smartregister.anc.library.interactor; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.VisibleForTesting; import org.apache.commons.lang3.StringUtils; import org.jeasy.rules.api.Facts; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/RegisterInteractor.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/RegisterInteractor.java index ef85b82c0..ccdf365b8 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/RegisterInteractor.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/interactor/RegisterInteractor.java @@ -1,21 +1,25 @@ package org.smartregister.anc.library.interactor; -import android.content.ContentValues; -import android.support.annotation.VisibleForTesting; -import android.support.v4.util.Pair; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; +import androidx.core.util.Pair; + +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.utils.FormUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Triple; +import org.json.JSONException; import org.json.JSONObject; import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.contract.RegisterContract; import org.smartregister.anc.library.event.PatientRemovedEvent; import org.smartregister.anc.library.helper.ECSyncHelper; import org.smartregister.anc.library.sync.BaseAncClientProcessorForJava; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.AppExecutors; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.clientandeventmodel.Client; import org.smartregister.clientandeventmodel.Event; @@ -23,10 +27,10 @@ import org.smartregister.domain.UniqueId; import org.smartregister.job.PullUniqueIdsServiceJob; import org.smartregister.repository.AllSharedPreferences; -import org.smartregister.repository.BaseRepository; import org.smartregister.repository.UniqueIdRepository; import org.smartregister.sync.ClientProcessorForJava; +import java.util.Collections; import java.util.Date; import timber.log.Timber; @@ -79,8 +83,15 @@ public void getNextUniqueId(final Triple triple, public void saveRegistration(final Pair pair, final String jsonString, final boolean isEditMode, final RegisterContract.InteractorCallBack callBack) { Runnable runnable = () -> { + saveRegistration(pair, jsonString, isEditMode); + String baseEntityId = getBaseEntityId(pair); + + if (!isEditMode && ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT.equals(Utils.getDueCheckStrategy())) { + createPartialPreviousEvent(pair, baseEntityId); + } + appExecutors.mainThread().execute(() -> { callBack.setBaseEntityRegister(baseEntityId); callBack.onRegistrationSaved(isEditMode); @@ -90,61 +101,90 @@ public void saveRegistration(final Pair pair, final String jsonSt appExecutors.diskIO().execute(runnable); } + /*** + * creates partial previous visit events after creation of client + * @param pair {@link Pair} + * @param baseEntityId {@link String} + */ + private void createPartialPreviousEvent(Pair pair, String baseEntityId) { + appExecutors.diskIO().execute(() -> { + try { + if (pair.second != null && pair.second.getDetails() != null) { + String strPreviousVisitsMap = pair.second.getDetails().get(ConstantsUtils.JsonFormKeyUtils.PREVIOUS_VISITS_MAP); + if (StringUtils.isNotBlank(strPreviousVisitsMap)) { + Utils.createPreviousVisitFromGroup(strPreviousVisitsMap, baseEntityId); + } + } + } catch (JSONException e) { + Timber.e(e); + } + }); + } + @Override public void removeWomanFromANCRegister(final String closeFormJsonString, final String providerId) { Runnable runnable = () -> { + PatientRemovedEvent patientRemovedEvent = new PatientRemovedEvent(); try { - Triple triple = ANCJsonFormUtils - .saveRemovedFromANCRegister(getAllSharedPreferences(), closeFormJsonString, providerId); + JSONObject jsonCloseForm = new JSONObject(closeFormJsonString); + String closeReason = FormUtils.getFieldFromForm(jsonCloseForm, ConstantsUtils.JsonFormKeyUtils.ANC_CLOSE_REASON).optString(JsonFormConstants.VALUE); + boolean isDeath = "woman_died".equalsIgnoreCase(closeReason); - if (triple == null) { - return; - } + if (isDeath) { + Pair triple = ANCJsonFormUtils + .saveRemovedFromANCRegister(getAllSharedPreferences(), closeFormJsonString, providerId); + + if (triple == null) { + return; + } - boolean isDeath = triple.getLeft(); - Event event = triple.getMiddle(); - Event updateChildDetailsEvent = triple.getRight(); + Event updateChildDetailsEvent = triple.second; - String baseEntityId = event.getBaseEntityId(); + String baseEntityId = updateChildDetailsEvent.getBaseEntityId(); - //Update client to deceased - JSONObject client = getSyncHelper().getClient(baseEntityId); - if (isDeath) { - client.put(ConstantsUtils.JsonFormKeyUtils.DEATH_DATE, Utils.getTodaysDate()); + //Update client to deceased + String dateOfDeath = FormUtils.getFieldFromForm(jsonCloseForm, "date_of_death").optString(JsonFormConstants.VALUE); + JSONObject client = getSyncHelper().getClient(baseEntityId); + client.put(ConstantsUtils.JsonFormKeyUtils.DEATH_DATE, StringUtils.isNotBlank(dateOfDeath) ? Utils.reverseHyphenSeperatedValues(dateOfDeath, "-") : Utils.getTodaysDate()); client.put(ConstantsUtils.JsonFormKeyUtils.DEATH_DATE_APPROX, false); + + JSONObject attributes = client.getJSONObject(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES); + attributes.put(DBConstantsUtils.KeyUtils.DATE_REMOVED, Utils.getTodaysDate()); + client.put(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES, attributes); + getSyncHelper().addClient(baseEntityId, client); + + //Update Child Entity to include death date + JSONObject eventJsonUpdateChildEvent = + new JSONObject(ANCJsonFormUtils.gson.toJson(updateChildDetailsEvent)); + getSyncHelper().addEvent(baseEntityId, eventJsonUpdateChildEvent); //Add event to flag server update } - JSONObject attributes = client.getJSONObject(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES); - attributes.put(DBConstantsUtils.KeyUtils.DATE_REMOVED, Utils.getTodaysDate()); - client.put(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES, attributes); - getSyncHelper().addClient(baseEntityId, client); - - //Add Remove Event for child to flag for Server delete - JSONObject eventJson = new JSONObject(ANCJsonFormUtils.gson.toJson(event)); - getSyncHelper().addEvent(event.getBaseEntityId(), eventJson); - - //Update Child Entity to include death date - JSONObject eventJsonUpdateChildEvent = - new JSONObject(ANCJsonFormUtils.gson.toJson(updateChildDetailsEvent)); - getSyncHelper().addEvent(baseEntityId, eventJsonUpdateChildEvent); //Add event to flag server update - - //Update REGISTER and FTS Tables - if (getAllCommonsRepository() != null) { - ContentValues values = new ContentValues(); - values.put(DBConstantsUtils.KeyUtils.DATE_REMOVED, Utils.getTodaysDate()); - getAllCommonsRepository().update(DBConstantsUtils.DEMOGRAPHIC_TABLE_NAME, values, baseEntityId); - getAllCommonsRepository().updateSearch(baseEntityId); + + if (closeReason.equalsIgnoreCase("in_labour")) { + patientRemovedEvent.setClosedNature(ConstantsUtils.ClosedNature.TRANSFERRED); } + + + processTransfer(jsonCloseForm); + } catch (Exception e) { Timber.e(e, " --> removeWomanFromANCRegister"); } finally { - Utils.postStickyEvent(new PatientRemovedEvent()); + Utils.postStickyEvent(patientRemovedEvent); } }; appExecutors.diskIO().execute(runnable); } + protected void processTransfer(@NonNull JSONObject closeForm) throws Exception { + AncLibrary.getInstance() + .getAncMetadata() + .getTransferProcessorByEventType(ConstantsUtils.EventTypeUtils.ANC_MATERNITY_TRANSFER) + .startTransferProcessing(closeForm); + } + + public AllCommonsRepository getAllCommonsRepository() { if (allCommonsRepository == null) { allCommonsRepository = @@ -205,10 +245,7 @@ private void saveRegistration(Pair pair, String jsonString, boole long lastSyncTimeStamp = getAllSharedPreferences().fetchLastUpdatedAtDate(0); Date lastSyncDate = new Date(lastSyncTimeStamp); - - - // Todo: Use the event clients from above here - getClientProcessorForJava().processClient(getSyncHelper().getEvents(lastSyncDate, BaseRepository.TYPE_Unprocessed)); + getClientProcessorForJava().processClient(getSyncHelper().getEvents(Collections.singletonList(baseEvent.getFormSubmissionId()))); getAllSharedPreferences().saveLastUpdatedAtDate(lastSyncDate.getTime()); } catch (Exception e) { Timber.e(e, " --> saveRegistration"); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/ContactSummaryModel.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/ContactSummaryModel.java index de5561635..9088378ab 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/ContactSummaryModel.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/ContactSummaryModel.java @@ -1,5 +1,7 @@ package org.smartregister.anc.library.model; +import androidx.annotation.Nullable; + import org.json.JSONObject; import java.util.Date; @@ -68,4 +70,13 @@ public Date getLocalDate() { public void setLocalDate(Date localDate) { this.localDate = localDate; } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == null) { + return false; + } + String key = ((ContactSummaryModel) obj).getContactName(); + return this.getContactName().equals(key); + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterFragmentModel.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterFragmentModel.java index 9aa594217..8b131bba5 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterFragmentModel.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterFragmentModel.java @@ -57,7 +57,7 @@ public Set getRegisterActiveColumns(String viewConfigurationIdentifier) { @Override public String countSelect(String tableName, String mainCondition) { SmartRegisterQueryBuilder countQueryBuilder = new SmartRegisterQueryBuilder(); - countQueryBuilder.SelectInitiateMainTableCounts(tableName); + countQueryBuilder.selectInitiateMainTableCounts(tableName); return countQueryBuilder.mainCondition(mainCondition); } @@ -73,7 +73,7 @@ public String mainSelect(String tableName, String mainCondition) { getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.YELLOW_FLAG_COUNT, getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.CONTACT_STATUS, getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.NEXT_CONTACT, getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE, getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE}; - queryBuilder.SelectInitiateMainTable(tableName, columns); + queryBuilder.selectInitiateMainTable(tableName, columns); queryBuilder.customJoin(" join " + getRegisterQueryProvider().getDetailsTable() + " on " + getRegisterQueryProvider().getDemographicTable() + "." + DBConstantsUtils.KeyUtils.BASE_ENTITY_ID + "= " + getRegisterQueryProvider().getDetailsTable() + "." + DBConstantsUtils.KeyUtils.BASE_ENTITY_ID); return queryBuilder.mainCondition(mainCondition); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterModel.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterModel.java index 2d3b2d4fb..40b990293 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterModel.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/model/RegisterModel.java @@ -1,6 +1,6 @@ package org.smartregister.anc.library.model; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import android.util.Log; import org.json.JSONObject; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactPresenter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactPresenter.java index d127c48cb..b0e8478ea 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactPresenter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactPresenter.java @@ -1,7 +1,6 @@ package org.smartregister.anc.library.presenter; import android.content.Context; -import android.util.Log; import com.vijay.jsonwizard.constants.JsonFormConstants; @@ -19,6 +18,8 @@ import java.lang.ref.WeakReference; import java.util.Map; +import timber.log.Timber; + public class ContactPresenter implements ContactContract.Presenter, ContactContract.InteractorCallback { public static final String TAG = ContactPresenter.class.getName(); @@ -136,10 +137,10 @@ public void startForm(Object tag) { getView().startFormActivity(form, contact); } } catch (JSONException e) { - Log.e(TAG, Log.getStackTraceString(e)); + Timber.e(e); } } catch (Exception e) { - Log.e(TAG, Log.getStackTraceString(e)); + Timber.e(e); getView().displayToast(R.string.error_unable_to_start_form); } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactSummaryPresenter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactSummaryPresenter.java index b45c7512c..38b981f48 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactSummaryPresenter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactSummaryPresenter.java @@ -78,7 +78,12 @@ public void onUpcomingContactsFetched(List upcomingContacts if ((upcomingContacts == null || upcomingContacts.isEmpty()) && lastContact >= 0) { return; } - this.upcomingContacts.addAll(upcomingContacts); + this.upcomingContacts.clear(); + for (ContactSummaryModel contactSummaryModel : upcomingContacts) { + if (!this.upcomingContacts.contains(contactSummaryModel)) { + this.upcomingContacts.add(contactSummaryModel); + } + } addUpcomingContactsToView(); getView().updateRecordedContact(lastContact); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactWizardJsonFormFragmentPresenter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactWizardJsonFormFragmentPresenter.java index c52e68066..9946f15c9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactWizardJsonFormFragmentPresenter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ContactWizardJsonFormFragmentPresenter.java @@ -8,11 +8,13 @@ import com.vijay.jsonwizard.fragments.JsonFormFragment; import com.vijay.jsonwizard.interactors.JsonFormInteractor; import com.vijay.jsonwizard.presenters.JsonWizardFormFragmentPresenter; +import com.vijay.jsonwizard.views.JsonFormFragmentView; import com.vijay.jsonwizard.widgets.NativeRadioButtonFactory; +import org.apache.commons.lang3.StringUtils; import org.smartregister.anc.library.fragment.ContactWizardJsonFormFragment; -import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.ANCFormUtils; +import org.smartregister.anc.library.util.ConstantsUtils; /** * Created by keyman on 04/08/18. @@ -33,10 +35,22 @@ public void setUpToolBar() { @Override protected boolean moveToNextWizardStep() { - if (!"".equals(mStepDetails.optString(JsonFormConstants.NEXT))) { - JsonFormFragment next = ContactWizardJsonFormFragment.getFormFragment(mStepDetails.optString(ConstantsUtils.NEXT)); - getView().hideKeyBoard(); - getView().transactThis(next); + String nextStep = getFormFragment().getJsonApi().nextStep(); + if (StringUtils.isNotBlank(nextStep)) { + + getFormFragment().getJsonApi().getAppExecutors().mainThread().execute(new Runnable() { + @Override + public void run() { + + JsonFormFragment next = ContactWizardJsonFormFragment.getFormFragment(nextStep); + JsonFormFragmentView jsonFormFragmentView = getView(); + if (jsonFormFragmentView != null) { + jsonFormFragmentView.hideKeyBoard(); + jsonFormFragmentView.transactThis(next); + } + } + }); + return true; } return false; @@ -62,7 +76,6 @@ public void onClick(View view) { } } - @Override protected void nativeRadioButtonClickActions(View view) { String type = (String) view.getTag(com.vijay.jsonwizard.R.id.specify_type); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ProfilePresenter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ProfilePresenter.java index 1588dbfcf..a024837ca 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ProfilePresenter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/ProfilePresenter.java @@ -2,7 +2,7 @@ import android.content.Context; import android.content.Intent; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.tuple.Triple; import org.json.JSONObject; @@ -12,9 +12,9 @@ import org.smartregister.anc.library.interactor.ContactInteractor; import org.smartregister.anc.library.interactor.ProfileInteractor; import org.smartregister.anc.library.interactor.RegisterInteractor; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.clientandeventmodel.Client; import org.smartregister.clientandeventmodel.Event; @@ -112,7 +112,6 @@ public void refreshProfileView(String baseEntityId) { public void processFormDetailsSave(Intent data, AllSharedPreferences allSharedPreferences) { try { String jsonString = data.getStringExtra(ConstantsUtils.IntentKeyUtils.JSON); - Timber.d(jsonString); if (jsonString != null) { JSONObject form = new JSONObject(jsonString); getProfileView().showProgressDialog( diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/RegisterPresenter.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/RegisterPresenter.java index e9507dc5e..afc77b06b 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/RegisterPresenter.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/RegisterPresenter.java @@ -2,7 +2,7 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Triple; @@ -136,7 +136,6 @@ public void closeAncRecord(String jsonString) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getView().getContext()); AllSharedPreferences allSharedPreferences = new AllSharedPreferences(preferences); - Timber.d(jsonString); getView().showProgressDialog(jsonString.contains(ConstantsUtils.EventTypeUtils.CLOSE) ? R.string.removing_dialog_title : R.string.saving_dialog_title); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/AdvancedSearchProvider.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/AdvancedSearchProvider.java index 2d788b291..59382ad17 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/AdvancedSearchProvider.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/AdvancedSearchProvider.java @@ -2,7 +2,7 @@ import android.content.Context; import android.database.Cursor; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/RegisterProvider.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/RegisterProvider.java index 532384df6..d706c365e 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/RegisterProvider.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/provider/RegisterProvider.java @@ -2,7 +2,7 @@ import android.content.Context; import android.database.Cursor; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PatientRepository.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PatientRepository.java index aee80d8bc..f5c7d3fda 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PatientRepository.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PatientRepository.java @@ -1,6 +1,7 @@ package org.smartregister.anc.library.repository; import android.content.ContentValues; +import androidx.annotation.NonNull; import net.sqlcipher.Cursor; import net.sqlcipher.database.SQLiteDatabase; @@ -63,6 +64,21 @@ public static Map getWomanProfileDetails(String baseEntityId) { return null; } + public static boolean isFirstVisit(@NonNull String baseEntityId) { + SQLiteDatabase sqLiteDatabase = getMasterRepository().getReadableDatabase(); + Cursor cursor = sqLiteDatabase.query(getRegisterQueryProvider().getDetailsTable(), + new String[]{DBConstantsUtils.KeyUtils.EDD}, + DBConstantsUtils.KeyUtils.BASE_ENTITY_ID + " = ? ", + new String[]{baseEntityId}, null, null, null, "1"); + String isFirstVisit = null; + if (cursor != null && cursor.moveToFirst()) { + isFirstVisit = cursor.getString(cursor.getColumnIndex(DBConstantsUtils.KeyUtils.EDD)); + cursor.close(); + } + + return StringUtils.isBlank(isFirstVisit); + } + protected static Repository getMasterRepository() { return DrishtiApplication.getInstance().getRepository(); } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PreviousContactRepository.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PreviousContactRepository.java index eb6f4f9bd..61c3cb299 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PreviousContactRepository.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/repository/PreviousContactRepository.java @@ -1,6 +1,8 @@ package org.smartregister.anc.library.repository; import android.content.ContentValues; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.text.TextUtils; import android.util.Log; @@ -12,7 +14,6 @@ import org.smartregister.anc.library.model.PreviousContact; import org.smartregister.anc.library.model.PreviousContactsSummaryModel; import org.smartregister.anc.library.util.ConstantsUtils; -import org.smartregister.anc.library.util.ANCFormUtils; import org.smartregister.anc.library.util.Utils; import org.smartregister.repository.BaseRepository; @@ -126,25 +127,24 @@ private PreviousContact getContactResult(Cursor cursor) { /** * @param baseEntityId is the Base entity Id No to filter by - * @param keysList an optional list of keys to query null otherwise to get all keys for that base entity id + * @param keysArr an optional list of keys to query null otherwise to get all keys for that base entity id */ - public List getPreviousContacts(String baseEntityId, List keysList) { + public List getPreviousContacts(@NonNull String baseEntityId, @Nullable String[] keysArr) { String orderBy = ID + " DESC "; Cursor mCursor = null; String selection = ""; String[] selectionArgs = null; List previousContacts = new ArrayList<>(); try { - SQLiteDatabase db = getWritableDatabase(); + SQLiteDatabase db = getReadableDatabase(); if (StringUtils.isNotBlank(baseEntityId)) { - if (keysList != null) { - selection = BASE_ENTITY_ID + " = ? " + BaseRepository.COLLATE_NOCASE + " AND " + KEY + " IN (?) " + BaseRepository.COLLATE_NOCASE; - selectionArgs = new String[]{baseEntityId, ANCFormUtils.getListValuesAsString(keysList)}; + if (keysArr != null) { + selection = BASE_ENTITY_ID + " = ? " + BaseRepository.COLLATE_NOCASE + " AND " + KEY + " IN ( '" + StringUtils.join(keysArr, "','") + "') "; } else { selection = BASE_ENTITY_ID + " = ? " + BaseRepository.COLLATE_NOCASE; - selectionArgs = new String[]{baseEntityId}; } + selectionArgs = new String[]{baseEntityId}; } mCursor = db.query(TABLE_NAME, projectionArgs, selection, selectionArgs, null, null, orderBy, null); @@ -155,7 +155,7 @@ public List getPreviousContacts(String baseEntityId, List { private HashMap newWomanProfileDetails; - private Context context; + private WeakReference contextWeakReference; private ProfileContract.Presenter mProfilePresenter; private Intent intent; public FinalizeContactTask(Context context, ProfileContract.Presenter mProfilePresenter, Intent intent) { - this.context = context; + this.contextWeakReference = new WeakReference<>(context); this.mProfilePresenter = mProfilePresenter; this.intent = intent; } @@ -36,7 +37,7 @@ protected Void doInBackground(Void... nada) { if (contactNo < 0) { womanProfileDetails.put(ConstantsUtils.REFERRAL, String.valueOf(contactNo)); } - newWomanProfileDetails = mProfilePresenter.saveFinishForm(womanProfileDetails, context); + newWomanProfileDetails = mProfilePresenter.saveFinishForm(womanProfileDetails, contextWeakReference.get()); } catch (Exception e) { Timber.e(e); } @@ -47,22 +48,23 @@ protected Void doInBackground(Void... nada) { @Override protected void onPreExecute() { - ((ContactSummaryFinishActivity) context).showProgressDialog(R.string.please_wait_message); - ((ContactSummaryFinishActivity) context).getProgressDialog().setMessage( - String.format(context.getString(R.string.finalizing_contact), + ((ContactSummaryFinishActivity) contextWeakReference.get()).showProgressDialog(R.string.please_wait_message); + ((ContactSummaryFinishActivity) contextWeakReference.get()).getProgressDialog().setMessage( + String.format(contextWeakReference.get().getString(R.string.finalizing_contact), intent.getExtras().getInt(ConstantsUtils.IntentKeyUtils.CONTACT_NO)) + " data"); - ((ContactSummaryFinishActivity) context).getProgressDialog().show(); + ((ContactSummaryFinishActivity) contextWeakReference.get()).getProgressDialog().show(); } @Override protected void onPostExecute(Void result) { - ((ContactSummaryFinishActivity) context).hideProgressDialog(); + ((ContactSummaryFinishActivity) contextWeakReference.get()).hideProgressDialog(); Intent contactSummaryIntent = - new Intent(context, ContactSummarySendActivity.class); + new Intent(contextWeakReference.get(), ContactSummarySendActivity.class); contactSummaryIntent.putExtra(ConstantsUtils.IntentKeyUtils.BASE_ENTITY_ID, intent.getExtras().getString(ConstantsUtils.IntentKeyUtils.BASE_ENTITY_ID)); contactSummaryIntent.putExtra(ConstantsUtils.IntentKeyUtils.CLIENT_MAP, newWomanProfileDetails); + contextWeakReference.get().startActivity(contactSummaryIntent); - context.startActivity(contactSummaryIntent); + ((ContactSummaryFinishActivity) contextWeakReference.get()).finish(); } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/task/LoadContactSummaryDataTask.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/task/LoadContactSummaryDataTask.java index 11c6e5ac1..0b98b9770 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/task/LoadContactSummaryDataTask.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/task/LoadContactSummaryDataTask.java @@ -3,9 +3,10 @@ import android.content.Context; import android.content.Intent; import android.os.AsyncTask; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import org.apache.commons.lang3.StringUtils; import org.jeasy.rules.api.Facts; import org.smartregister.anc.library.R; import org.smartregister.anc.library.activity.ContactSummaryFinishActivity; @@ -16,6 +17,8 @@ import org.smartregister.anc.library.util.DBConstantsUtils; import org.smartregister.anc.library.util.Utils; +import java.util.HashMap; + import timber.log.Timber; public class LoadContactSummaryDataTask extends AsyncTask { @@ -55,7 +58,13 @@ protected void onPreExecute() { @Override protected void onPostExecute(Void result) { - String edd = facts.get(DBConstantsUtils.KeyUtils.EDD); + HashMap clientDetails; + try { + clientDetails = (HashMap) intent.getSerializableExtra(ConstantsUtils.IntentKeyUtils.CLIENT_MAP); + } catch (NullPointerException e) { + clientDetails = new HashMap<>(); + } + String edd = StringUtils.isNotBlank(facts.get(DBConstantsUtils.KeyUtils.EDD)) ? facts.get(DBConstantsUtils.KeyUtils.EDD) : clientDetails != null ? Utils.reverseHyphenSeperatedValues(clientDetails.get(ConstantsUtils.EDD), "-") : ""; String contactNo = String.valueOf(intent.getExtras().getInt(ConstantsUtils.IntentKeyUtils.CONTACT_NO)); if (edd != null && ((ContactSummaryFinishActivity) context).saveFinishMenuItem != null) { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ANCJsonFormUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ANCJsonFormUtils.java index 7b156c9d4..0a8967ecf 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ANCJsonFormUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ANCJsonFormUtils.java @@ -4,14 +4,15 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; -import android.support.annotation.NonNull; -import android.support.constraint.ConstraintLayout; -import android.support.v4.util.Pair; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.util.Pair; + import com.google.common.reflect.TypeToken; import com.vijay.jsonwizard.activities.JsonFormActivity; import com.vijay.jsonwizard.constants.JsonFormConstants; @@ -33,7 +34,6 @@ import org.smartregister.anc.library.domain.YamlConfigWrapper; import org.smartregister.anc.library.model.ContactSummaryModel; import org.smartregister.anc.library.model.Task; -import org.smartregister.anc.library.repository.PatientRepository; import org.smartregister.clientandeventmodel.Client; import org.smartregister.clientandeventmodel.Event; import org.smartregister.clientandeventmodel.FormEntityConstants; @@ -65,8 +65,10 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import timber.log.Timber; @@ -130,7 +132,7 @@ public static JSONObject getFormAsJson(JSONObject form, String formName, String } else { Timber.tag(TAG).w("Unsupported form requested for launch %s", formName); } - Timber.d("form is %s", form.toString()); + //Timber.d("form is %s", form.toString()); return form; } @@ -223,15 +225,18 @@ public static Pair processRegistrationForm(AllSharedPreferences a JSONObject metadata = ANCJsonFormUtils.getJSONObject(jsonForm, METADATA); addLastInteractedWith(fields); getDobStrings(fields); - initializeFirstContactValues(fields); + String previousVisitsMap = initializeFirstContactValues(fields); processLocationFields(fields); - FormTag formTag = getFormTag(allSharedPreferences); + FormTag formTag = getFormTag(allSharedPreferences); Client baseClient = org.smartregister.util.JsonFormUtils.createBaseClient(fields, formTag, entityId); Event baseEvent = org.smartregister.util.JsonFormUtils .createEvent(fields, metadata, formTag, entityId, encounterType, DBConstantsUtils.DEMOGRAPHIC_TABLE_NAME); + if (previousVisitsMap != null) { + baseEvent.addDetails(ConstantsUtils.JsonFormKeyUtils.PREVIOUS_VISITS_MAP, previousVisitsMap); + } tagSyncMetadata(allSharedPreferences, baseEvent);// tag docs return Pair.create(baseClient, baseEvent); @@ -298,23 +303,60 @@ private static void getDobStrings(JSONArray fields) throws JSONException { } } - private static void initializeFirstContactValues(JSONArray fields) throws JSONException { - //initialize first contact values + /*** + * Initializes the values in the mother details table used by contact containers + * @param fields {@link JSONArray} + * @return + * @throws JSONException + */ + private static String initializeFirstContactValues(@NonNull JSONArray fields) throws JSONException { + String strGroup = null; + + int nextContact = 1; + + String nextContactDate = Utils.convertDateFormat(Calendar.getInstance().getTime(), Utils.DB_DF); + + if (ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT.equals(Utils.getDueCheckStrategy())) { + HashMap> previousVisitsMap = Utils.buildRepeatingGroupValues(fields, ConstantsUtils.JsonFormKeyUtils.PREVIOUS_VISITS); + if (!previousVisitsMap.isEmpty()) { + + nextContact = previousVisitsMap.size() + 1; + + strGroup = ANCJsonFormUtils.gson.toJson(previousVisitsMap); + + Set>> previousVisitsMapSet = previousVisitsMap.entrySet(); + + HashMap previousVisitsMapItem = new LinkedHashMap<>(); + + for (Map.Entry> entry : previousVisitsMapSet) { + previousVisitsMapItem = entry.getValue(); + } + + JSONObject lastContactDateJSONObject = getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE); + + String visitDate = previousVisitsMapItem.get(ConstantsUtils.JsonFormKeyUtils.VISIT_DATE); + String reverseVisitDate = Utils.reverseHyphenSeperatedValues(visitDate, "-"); + lastContactDateJSONObject.put(ANCJsonFormUtils.VALUE, reverseVisitDate); + } + } JSONObject nextContactJSONObject = getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT); if (nextContactJSONObject.has(JsonFormConstants.VALUE) && "".equals(nextContactJSONObject.getString(JsonFormConstants.VALUE))) { - nextContactJSONObject.put(ANCJsonFormUtils.VALUE, 1); + nextContactJSONObject.put(ANCJsonFormUtils.VALUE, nextContact); } JSONObject nextContactDateJSONObject = getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE); if (nextContactDateJSONObject.has(JsonFormConstants.VALUE) && "".equals(nextContactDateJSONObject.getString(JsonFormConstants.VALUE))) { - nextContactDateJSONObject.put(ANCJsonFormUtils.VALUE, Utils.convertDateFormat(Calendar.getInstance().getTime(), Utils.DB_DF)); + nextContactDateJSONObject.put(ANCJsonFormUtils.VALUE, nextContactDate); } + + return strGroup; } + @NotNull - private static FormTag getFormTag(AllSharedPreferences allSharedPreferences) { + public static FormTag getFormTag(AllSharedPreferences allSharedPreferences) { FormTag formTag = new FormTag(); formTag.providerId = allSharedPreferences.fetchRegisteredANM(); formTag.appVersion = BuildConfig.VERSION_CODE; @@ -322,7 +364,7 @@ private static FormTag getFormTag(AllSharedPreferences allSharedPreferences) { return formTag; } - private static void tagSyncMetadata(AllSharedPreferences allSharedPreferences, Event event) { + public static void tagSyncMetadata(AllSharedPreferences allSharedPreferences, Event event) { String providerId = allSharedPreferences.fetchRegisteredANM(); event.setProviderId(providerId); event.setLocationId(allSharedPreferences.fetchDefaultLocalityId(providerId)); @@ -445,7 +487,7 @@ public static String getAutoPopulatedJsonEditRegisterFormString(Context context, lpv.init(); } - Timber.d("Form is %s", form.toString()); + //Timber.d("Form is %s", form.toString()); if (form != null) { form.put(ANCJsonFormUtils.ENTITY_ID, womanClient.get(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID)); @@ -490,6 +532,8 @@ private static LocationPickerView createLocationPickerView(Context context) { protected static void processPopulatableFields(Map womanClient, JSONObject jsonObject) throws JSONException { + AncMetadata ancMetadata = AncLibrary.getInstance().getAncMetadata(); + if (jsonObject.getString(ANCJsonFormUtils.KEY).equalsIgnoreCase(ConstantsUtils.JsonFormKeyUtils.DOB_ENTERED)) { getDobUsingEdd(womanClient, jsonObject, DBConstantsUtils.KeyUtils.DOB); @@ -509,8 +553,9 @@ protected static void processPopulatableFields(Map womanClient, if (StringUtils.isNotBlank(womanClient.get(DBConstantsUtils.KeyUtils.DOB))) { jsonObject.put(ANCJsonFormUtils.VALUE, Utils.getAgeFromDate(womanClient.get(DBConstantsUtils.KeyUtils.DOB))); } - } else if (jsonObject.getString(ANCJsonFormUtils.KEY).equalsIgnoreCase(ConstantsUtils.JsonFormKeyUtils.VILLAGE)) { - reverseLocationTree(jsonObject, womanClient.get(ConstantsUtils.JsonFormKeyUtils.VILLAGE)); + } else if (ancMetadata != null && ancMetadata.getFieldsWithLocationHierarchy() != null && + ancMetadata.getFieldsWithLocationHierarchy().contains(jsonObject.optString(ANCJsonFormUtils.KEY))) { + reverseLocationTree(jsonObject, womanClient.get(jsonObject.optString(ANCJsonFormUtils.KEY))); } else if (jsonObject.getString(ANCJsonFormUtils.KEY).equalsIgnoreCase(DBConstantsUtils.KeyUtils.EDD)) { formatEdd(womanClient, jsonObject, DBConstantsUtils.KeyUtils.EDD); @@ -583,14 +628,13 @@ private static void formatEdd(Map womanClient, JSONObject jsonOb public static void startFormForEdit(Activity context, int jsonFormActivityRequestCode, String metaData) { Intent intent = new Intent(context, EditJsonFormActivity.class); intent.putExtra(ConstantsUtils.IntentKeyUtils.JSON, metaData); - Timber.d("form is %s", metaData); + //Timber.d("form is %s", metaData); context.startActivityForResult(intent, jsonFormActivityRequestCode); } - public static Triple saveRemovedFromANCRegister(AllSharedPreferences allSharedPreferences, String jsonString, String providerId) { + public static Pair saveRemovedFromANCRegister(AllSharedPreferences allSharedPreferences, String jsonString, String providerId) { try { - boolean isDeath = false; Triple registrationFormParams = validateParameters(jsonString); if (!registrationFormParams.getLeft()) { @@ -598,7 +642,6 @@ public static Triple saveRemovedFromANCRegister(AllShared } JSONObject jsonForm = registrationFormParams.getMiddle(); - JSONArray fields = registrationFormParams.getRight(); String encounterType = ANCJsonFormUtils.getString(jsonForm, ENCOUNTER_TYPE); JSONObject metadata = ANCJsonFormUtils.getJSONObject(jsonForm, METADATA); @@ -620,18 +663,6 @@ public static Triple saveRemovedFromANCRegister(AllShared .withFormSubmissionId(ANCJsonFormUtils.generateRandomUUIDString()).withDateCreated(new Date()); tagSyncMetadata(allSharedPreferences, event); - for (int i = 0; i < fields.length(); i++) { - JSONObject jsonObject = ANCJsonFormUtils.getJSONObject(fields, i); - - String value = ANCJsonFormUtils.getString(jsonObject, ANCJsonFormUtils.VALUE); - if (StringUtils.isNotBlank(value)) { - ANCJsonFormUtils.addObservation(event, jsonObject); - if (jsonObject.get(ANCJsonFormUtils.KEY).equals(ConstantsUtils.JsonFormKeyUtils.ANC_CLOSE_REASON)) { - isDeath = "Woman Died".equalsIgnoreCase(value); - } - } - } - Iterator keys = metadata.keys(); while (keys.hasNext()) { @@ -667,7 +698,7 @@ public static Triple saveRemovedFromANCRegister(AllShared .withDateCreated(new Date()); tagSyncMetadata(allSharedPreferences, updateChildDetailsEvent); - return Triple.of(isDeath, event, updateChildDetailsEvent); + return Pair.create(event, updateChildDetailsEvent); } catch (Exception e) { Timber.e(e, "JsonFormUtils --> saveRemovedFromANCRegister"); } @@ -735,7 +766,7 @@ public static String getAutoPopulatedSiteCharacteristicsEditFormString(Context c Map characteristics) { try { JSONObject form = FormUtils.getInstance(context).getFormJson(ConstantsUtils.JsonFormUtils.ANC_SITE_CHARACTERISTICS); - Timber.d("Form is " + form.toString()); + //Timber.d("Form is " + form.toString()); if (form != null) { form.put(ANCJsonFormUtils.ENCOUNTER_TYPE, ConstantsUtils.EventTypeUtils.SITE_CHARACTERISTICS); @@ -760,45 +791,24 @@ public static String getAutoPopulatedSiteCharacteristicsEditFormString(Context c return ""; } - public static Pair createContactVisitEvent(List formSubmissionIDs, - Map womanDetails) { + public static Pair createVisitAndUpdateEvent(List formSubmissionIDs, + Map womanDetails) { if (formSubmissionIDs.size() < 1 && womanDetails.get(ConstantsUtils.REFERRAL) == null) { return null; } try { - - String contactNo = womanDetails.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT); - String contactStartDate = womanDetails.get(DBConstantsUtils.KeyUtils.VISIT_START_DATE); String baseEntityId = womanDetails.get(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID); - Event contactVisitEvent = (Event) new Event().withBaseEntityId(baseEntityId).withEventDate(new Date()) - .withEventType(ConstantsUtils.EventTypeUtils.CONTACT_VISIT).withEntityType(DBConstantsUtils.CONTACT_ENTITY_TYPE) - .withFormSubmissionId(ANCJsonFormUtils.generateRandomUUIDString()) - .withDateCreated(getContactStartDate(contactStartDate)); - - String currentContactNo; - if (womanDetails.get(ConstantsUtils.REFERRAL) == null) { - currentContactNo = ConstantsUtils.CONTACT + " " + contactNo; - } else { - currentContactNo = ConstantsUtils.CONTACT + " " + womanDetails.get(ConstantsUtils.REFERRAL); - } - contactVisitEvent.addDetails(ConstantsUtils.CONTACT, currentContactNo); - contactVisitEvent.addDetails(ConstantsUtils.FORM_SUBMISSION_IDS, formSubmissionIDs.toString()); - contactVisitEvent.addDetails(ConstantsUtils.OPEN_TEST_TASKS, String.valueOf(getOpenTasks(baseEntityId))); - - tagSyncMetadata(AncLibrary.getInstance().getContext().userService().getAllSharedPreferences(), - contactVisitEvent); - - PatientRepository.updateContactVisitStartDate(baseEntityId, null);//reset contact visit date - + Event contactVisitEvent = Utils.createContactVisitEvent(formSubmissionIDs, womanDetails, String.valueOf(getOpenTasks(baseEntityId))); //Update client EventClientRepository db = AncLibrary.getInstance().getEventClientRepository(); + JSONObject clientForm = db.getClientByBaseEntityId(baseEntityId); JSONObject attributes = clientForm.getJSONObject(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES); - attributes.put(DBConstantsUtils.KeyUtils.NEXT_CONTACT, contactNo); + attributes.put(DBConstantsUtils.KeyUtils.NEXT_CONTACT, womanDetails.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT)); attributes.put(DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE, womanDetails.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE)); attributes.put(DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE, womanDetails.get(DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE)); @@ -808,13 +818,10 @@ public static Pair createContactVisitEvent(List formSubmis attributes.put(DBConstantsUtils.KeyUtils.EDD, womanDetails.get(DBConstantsUtils.KeyUtils.EDD)); clientForm.put(ConstantsUtils.JsonFormKeyUtils.ATTRIBUTES, attributes); - FormTag formTag = getFormTag(AncLibrary.getInstance().getContext().allSharedPreferences()); - formTag.childLocationId = LocationHelper.getInstance().getChildLocationId(); - formTag.locationId = LocationHelper.getInstance().getParentLocationId(); - db.addorUpdateClient(baseEntityId, clientForm); Event updateClientEvent = createUpdateClientDetailsEvent(baseEntityId); + return Pair.create(contactVisitEvent, updateClientEvent); } catch (Exception e) { @@ -824,7 +831,7 @@ public static Pair createContactVisitEvent(List formSubmis } - private static Date getContactStartDate(String contactStartDate) { + public static Date getContactStartDate(String contactStartDate) { try { return new LocalDate(contactStartDate).toDate(); } catch (Exception e) { @@ -928,12 +935,27 @@ public List generateNextContactSchedule(String edd, List generateNextContactSchedule(String edd, List data, Facts facts, int position, Context context) { + public ConstraintLayout createListViewItems(List data, Facts facts, + int position, Context context) { YamlConfigItem yamlConfigItem = data.get(position).getYamlConfigItem(); ANCJsonFormUtils.Template template = getTemplate(yamlConfigItem.getTemplate()); diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AncMetadata.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AncMetadata.java index 96f18c309..3de33a089 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AncMetadata.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AncMetadata.java @@ -1,9 +1,11 @@ package org.smartregister.anc.library.util; import org.smartregister.anc.library.BuildConfig; +import org.smartregister.anc.library.interactor.ClientTransferProcessor; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Set; @@ -14,6 +16,7 @@ public class AncMetadata { private ArrayList locationLevels; private ArrayList healthFacilityLevels; private Set fieldsWithLocationHierarchy; + private HashMap transferProcessorHashMap = new HashMap<>(); public AncMetadata() { locationLevels = new ArrayList<>(Arrays.asList(BuildConfig.LOCATION_LEVELS)); @@ -58,4 +61,16 @@ public Set getFieldsWithLocationHierarchy() { public void setFieldsWithLocationHierarchy(Set fieldsWithLocationHierarchy) { this.fieldsWithLocationHierarchy = fieldsWithLocationHierarchy; } + + public ClientTransferProcessor getTransferProcessorByEventType(String eventType) { + return transferProcessorHashMap.get(eventType); + } + + public void addTransferProcessorToHashMap(String evenType, ClientTransferProcessor clientTransferProcessor) { + this.transferProcessorHashMap.put(evenType, clientTransferProcessor); + } + + public HashMap getTransferProcessorHashMap() { + return transferProcessorHashMap; + } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AppExecutors.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AppExecutors.java index 1ea275070..73c3eee95 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AppExecutors.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/AppExecutors.java @@ -6,7 +6,7 @@ import android.os.Handler; import android.os.Looper; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.concurrent.Executor; import java.util.concurrent.Executors; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ConstantsUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ConstantsUtils.java index c7b00b4c7..737cf82a9 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ConstantsUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ConstantsUtils.java @@ -67,9 +67,16 @@ public abstract class ConstantsUtils { public static final String DUE = "Due"; public static final String OPEN_TEST_TASKS = "open_test_tasks"; public static final String ANDROID_SWITCHER = "android:switcher:"; + public static final String IS_FIRST_CONTACT = "is_first_contact"; public interface Properties { String CAN_SAVE_SITE_INITIAL_SETTING = "CAN_SAVE_INITIAL_SITE_SETTING"; + String MAX_CONTACT_SCHEDULE_DISPLAYED = "MAX_CONTACT_SCHEDULE_DISPLAYED"; + String DUE_CHECK_STRATEGY = "DUE_CHECK_STRATEGY"; + } + + public interface DueCheckStrategy { + String CHECK_FOR_FIRST_CONTACT = "check_for_first_contact"; } public interface TemplateUtils { @@ -81,6 +88,10 @@ interface SiteCharacteristics { } } + public interface ClosedNature { + String TRANSFERRED = "transferred"; + } + public static class AncRadioButtonOptionTypesUtils { public static final String DONE_TODAY = "done_today"; public static final String DONE_EARLIER = "done_earlier"; @@ -105,6 +116,7 @@ public static final class EventTypeUtils { public static final String CLOSE = "ANC Close"; public static final String SITE_CHARACTERISTICS = "Site Characteristics"; public static final String CONTACT_VISIT = "Contact Visit"; + public static final String ANC_MATERNITY_TRANSFER = "anc_maternity_transfer"; } public static class JsonFormUtils { @@ -141,6 +153,9 @@ public static class JsonFormKeyUtils { public static final String STEP1 = "step1"; public static final String FIELDS = "fields"; public static final String VILLAGE = "village"; + public static final String PREVIOUS_VISITS = "previous_visits"; + public static final String VISIT_DATE = "visit_date"; + public static final String PREVIOUS_VISITS_MAP = "previous_visits_map"; } public static class JsonFormExtraUtils { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/DBConstantsUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/DBConstantsUtils.java index cac4d827f..f4807e0d3 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/DBConstantsUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/DBConstantsUtils.java @@ -43,5 +43,6 @@ public static final class KeyUtils { public static final String LAST_CONTACT_RECORD_DATE = "last_contact_record_date"; public static final String RELATIONAL_ID = "relationalid"; public static final String VISIT_START_DATE = "visit_start_date"; + public static final String IS_FIRST_VISIT = "is_first_visit"; } } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ImageLoaderRequestUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ImageLoaderRequestUtils.java index e2ad14189..f28ab4a31 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ImageLoaderRequestUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/ImageLoaderRequestUtils.java @@ -2,7 +2,7 @@ import android.content.Context; import android.graphics.Bitmap; -import android.support.v4.util.LruCache; +import androidx.collection.LruCache; import com.android.volley.Cache; import com.android.volley.Network; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/SiteCharacteristicsFormUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/SiteCharacteristicsFormUtils.java index 452b6de74..31236f759 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/SiteCharacteristicsFormUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/SiteCharacteristicsFormUtils.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.util; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.json.JSONObject; import org.smartregister.anc.library.AncLibrary; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/TemplateUtils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/TemplateUtils.java index 805ac47ae..c17965a13 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/TemplateUtils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/TemplateUtils.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.util; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.json.JSONException; import org.json.JSONObject; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/Utils.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/Utils.java index 7e98bf8d5..95cdd3403 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/util/Utils.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/util/Utils.java @@ -9,8 +9,8 @@ import android.database.Cursor; import android.os.Build; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.DisplayMetrics; @@ -42,7 +42,6 @@ import org.smartregister.anc.library.activity.BaseHomeRegisterActivity; import org.smartregister.anc.library.activity.ContactJsonFormActivity; import org.smartregister.anc.library.activity.ContactSummaryFinishActivity; -import org.smartregister.anc.library.activity.ProfileActivity; import org.smartregister.anc.library.domain.ButtonAlertStatus; import org.smartregister.anc.library.domain.Contact; import org.smartregister.anc.library.event.BaseEvent; @@ -50,8 +49,12 @@ import org.smartregister.anc.library.model.PartialContact; import org.smartregister.anc.library.model.Task; import org.smartregister.anc.library.repository.ContactTasksRepository; +import org.smartregister.anc.library.repository.PatientRepository; import org.smartregister.anc.library.rule.AlertRule; +import org.smartregister.clientandeventmodel.Event; import org.smartregister.commonregistry.CommonPersonObjectClient; +import org.smartregister.util.FormUtils; +import org.smartregister.util.JsonFormUtils; import org.smartregister.view.activity.DrishtiApplication; import java.io.IOException; @@ -64,6 +67,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -201,7 +205,6 @@ public static void proceedToContact(String baseEntityId, HashMap try { Intent intent = new Intent(context.getApplicationContext(), ContactJsonFormActivity.class); - Contact quickCheck = new Contact(); quickCheck.setName(context.getResources().getString(R.string.quick_check)); quickCheck.setFormName(ConstantsUtils.JsonFormUtils.ANC_QUICK_CHECK); @@ -212,6 +215,7 @@ public static void proceedToContact(String baseEntityId, HashMap quickCheck.setWizard(false); quickCheck.setHideSaveLabel(true); + //partial contact exists? PartialContact partialContactRequest = new PartialContact(); partialContactRequest.setBaseEntityId(baseEntityId); @@ -224,6 +228,13 @@ public static void proceedToContact(String baseEntityId, HashMap ContactModel baseContactModel = new ContactModel(); JSONObject form = baseContactModel.getFormAsJson(quickCheck.getFormName(), baseEntityId, locationId); + JSONObject globals = new JSONObject(); + globals.put(ConstantsUtils.CONTACT_NO, personObjectClient.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT)); + if (ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT.equals(Utils.getDueCheckStrategy())) { + globals.put(ConstantsUtils.IS_FIRST_CONTACT, PatientRepository.isFirstVisit(personObjectClient.get(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID))); + } + form.put(ConstantsUtils.GLOBAL, globals); + String processedForm = ANCFormUtils.getFormJsonCore(partialContactRequest, form).toString(); if (hasPendingRequiredFields(new JSONObject(processedForm))) { @@ -379,7 +390,7 @@ public static void navigateToHomeRegister(Context context, boolean isRemote, Cla } public static void navigateToProfile(Context context, HashMap patient) { - Intent intent = new Intent(context, ProfileActivity.class); + Intent intent = new Intent(context, AncLibrary.getInstance().getActivityConfiguration().getProfileActivityClass()); intent.putExtra(ConstantsUtils.IntentKeyUtils.BASE_ENTITY_ID, patient.get(DBConstantsUtils.KeyUtils.ID_LOWER_CASE)); intent.putExtra(ConstantsUtils.IntentKeyUtils.CLIENT_MAP, patient); context.startActivity(intent); @@ -646,6 +657,167 @@ public static boolean isTableExists(@NonNull SQLiteDatabase sqliteDatabase, @Non return false; } + public static String getDueCheckStrategy() { + return getProperties(AncLibrary.getInstance().getApplicationContext()).getProperty(ConstantsUtils.Properties.DUE_CHECK_STRATEGY, ""); + } + + /*** + * Creates a map for repeating group fields and values + * @param fields {@link JSONArray} + * @param fieldName {@link String} + * @return {@link HashMap} + * @throws JSONException + */ + public static HashMap> buildRepeatingGroupValues(@NonNull JSONArray fields, @NonNull String fieldName) throws JSONException { + ArrayList keysArrayList = new ArrayList<>(); + JSONObject jsonObject = JsonFormUtils.getFieldJSONObject(fields, fieldName); + HashMap> repeatingGroupMap = new LinkedHashMap<>(); + if (jsonObject != null) { + JSONArray jsonArray = jsonObject.optJSONArray(JsonFormConstants.VALUE); + if (jsonArray != null) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject valueField = jsonArray.optJSONObject(i); + String fieldKey = valueField.optString(JsonFormConstants.KEY); + keysArrayList.add(fieldKey); + } + + for (int k = 0; k < fields.length(); k++) { + JSONObject valueField = fields.optJSONObject(k); + String fieldKey = valueField.optString(JsonFormConstants.KEY); + String fieldValue = valueField.optString(JsonFormConstants.VALUE); + + if (fieldKey.contains("_")) { + fieldKey = fieldKey.substring(0, fieldKey.lastIndexOf("_")); + if (keysArrayList.contains(fieldKey) && StringUtils.isNotBlank(fieldValue)) { + String fieldKeyId = valueField.optString(JsonFormConstants.KEY).substring(fieldKey.length() + 1); + HashMap hashMap = repeatingGroupMap.get(fieldKeyId) == null ? new HashMap<>() : repeatingGroupMap.get(fieldKeyId); + hashMap.put(fieldKey, fieldValue); + repeatingGroupMap.put(fieldKeyId, hashMap); + } + } + } + } + } + return repeatingGroupMap; + } + + /*** + * Creates contact visit event after each visit + * @param formSubmissionIDs {@link List} + * @param womanDetails {@link Map} + * @param openTasks {@link String} + * @return {@link Event} + */ + public static Event createContactVisitEvent(@NonNull List formSubmissionIDs, + @NonNull Map womanDetails, + @Nullable String openTasks) { + + try { + String contactNo = womanDetails.get(DBConstantsUtils.KeyUtils.NEXT_CONTACT); + String contactStartDate = womanDetails.get(DBConstantsUtils.KeyUtils.VISIT_START_DATE); + String baseEntityId = womanDetails.get(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID); + + Event contactVisitEvent = (Event) new Event().withBaseEntityId(baseEntityId).withEventDate(new Date()) + .withEventType(ConstantsUtils.EventTypeUtils.CONTACT_VISIT).withEntityType(DBConstantsUtils.CONTACT_ENTITY_TYPE) + .withFormSubmissionId(ANCJsonFormUtils.generateRandomUUIDString()) + .withDateCreated(ANCJsonFormUtils.getContactStartDate(contactStartDate)); + + String currentContactNo; + + if (womanDetails.get(ConstantsUtils.REFERRAL) == null) { + currentContactNo = ConstantsUtils.CONTACT + " " + contactNo; + } else { + currentContactNo = ConstantsUtils.CONTACT + " " + womanDetails.get(ConstantsUtils.REFERRAL); + } + + contactVisitEvent.addDetails(ConstantsUtils.CONTACT, currentContactNo); + contactVisitEvent.addDetails(ConstantsUtils.FORM_SUBMISSION_IDS, formSubmissionIDs.toString()); + contactVisitEvent.addDetails(ConstantsUtils.OPEN_TEST_TASKS, openTasks); + + ANCJsonFormUtils.tagSyncMetadata(getAllSharedPreferences(), contactVisitEvent); + + PatientRepository.updateContactVisitStartDate(baseEntityId, null);//reset contact visit date + + return contactVisitEvent; + + } catch (NullPointerException e) { + Timber.e(e, " --> createContactVisitEvent"); + return null; + } + + } + + /*** + * Creates partial previous visit events for clients from the registration form + * @param strGroup {@link String} + * @param baseEntityId {@link String} + * @throws JSONException + */ + public static void createPreviousVisitFromGroup(@NonNull String strGroup, @NonNull String baseEntityId) throws JSONException { + JSONObject jsonObject = new JSONObject(strGroup); + Iterator repeatingGroupKeys = jsonObject.keys(); + List currentFormSubmissionIds = new ArrayList<>(); + + int count = 0; + + while (repeatingGroupKeys.hasNext()) { + + ++count; + + JSONObject jsonSingleVisitObject = jsonObject.optJSONObject(repeatingGroupKeys.next()); + + String contactDate = Utils.reverseHyphenSeperatedValues(jsonSingleVisitObject.optString(ConstantsUtils.JsonFormKeyUtils.VISIT_DATE), "-"); + + Facts entries = new Facts(); + + entries.put(ConstantsUtils.CONTACT_DATE, contactDate); + + HashMap womanDetails = new HashMap<>(); + + womanDetails.put(DBConstantsUtils.KeyUtils.NEXT_CONTACT, String.valueOf(count + 1)); + + womanDetails.put(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID, baseEntityId); + + Event contactVisitEvent = Utils.createContactVisitEvent(new ArrayList<>(), womanDetails, null); + + if (contactVisitEvent != null) { + JSONObject factsJsonObject = new JSONObject(ANCJsonFormUtils.gson.toJson(entries.asMap())); + Event event = Utils.addContactVisitDetails("", contactVisitEvent, null, factsJsonObject.toString()); + JSONObject eventJson = new JSONObject(ANCJsonFormUtils.gson.toJson(event)); + AncLibrary.getInstance().getEcSyncHelper().addEvent(baseEntityId, eventJson); + currentFormSubmissionIds.add(event.getFormSubmissionId()); + } + } + + long lastSyncTimeStamp = getAllSharedPreferences().fetchLastUpdatedAtDate(0); + Date lastSyncDate = new Date(lastSyncTimeStamp); + try { + AncLibrary.getInstance().getClientProcessorForJava().processClient(AncLibrary.getInstance().getEcSyncHelper().getEvents(currentFormSubmissionIds)); + getAllSharedPreferences().saveLastUpdatedAtDate(lastSyncDate.getTime()); + } catch (Exception e) { + Timber.e(e); + } + } + + public static Event addContactVisitDetails(String attentionFlagsString, Event event, + String referral, String currentContactState) { + event.addDetails(ConstantsUtils.DetailsKeyUtils.ATTENTION_FLAG_FACTS, attentionFlagsString); + if (currentContactState != null && referral == null) { + event.addDetails(ConstantsUtils.DetailsKeyUtils.PREVIOUS_CONTACTS, currentContactState); + } + return event; + } + + public static FormUtils getFormUtils() { + FormUtils formUtils = null; + try { + formUtils = FormUtils.getInstance(AncLibrary.getInstance().getApplicationContext()); + } catch (Exception e) { + Timber.e(e); + } + return formUtils; + } + /** * Loads yaml files that contain rules for the profile displays * @@ -710,4 +882,5 @@ private void createAndPersistPartialContact(String baseEntityId, int contactNo, public ContactTasksRepository getContactTasksRepositoryHelper() { return AncLibrary.getInstance().getContactTasksRepository(); } + } diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/CopyToClipboardDialog.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/CopyToClipboardDialog.java index 531c99868..27b3aa653 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/CopyToClipboardDialog.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/CopyToClipboardDialog.java @@ -5,7 +5,7 @@ import android.content.ClipboardManager; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import android.view.View; import android.view.Window; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/RoundedImageView.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/RoundedImageView.java index 69443beab..edb25d49d 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/RoundedImageView.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/RoundedImageView.java @@ -10,7 +10,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.v7.widget.AppCompatImageView; +import androidx.appcompat.widget.AppCompatImageView; import android.util.AttributeSet; import android.view.ViewGroup; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/SquareCardView.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/SquareCardView.java index 8aa94121f..5eec56c88 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/view/SquareCardView.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/view/SquareCardView.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.view; import android.content.Context; -import android.support.v7.widget.CardView; +import androidx.cardview.widget.CardView; import android.util.AttributeSet; public class SquareCardView extends CardView { diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/ContactTasksViewHolder.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/ContactTasksViewHolder.java index 384927df2..dae420f5b 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/ContactTasksViewHolder.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/ContactTasksViewHolder.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.viewholder; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.ImageView; diff --git a/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/LibraryContentViewHolder.java b/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/LibraryContentViewHolder.java index 12578d0cd..0e9d41188 100644 --- a/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/LibraryContentViewHolder.java +++ b/opensrp-anc/src/main/java/org/smartregister/anc/library/viewholder/LibraryContentViewHolder.java @@ -1,8 +1,8 @@ package org.smartregister.anc.library.viewholder; import android.app.Activity; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; diff --git a/opensrp-anc/src/main/res/layout/activity_base_profile.xml b/opensrp-anc/src/main/res/layout/activity_base_profile.xml index 88df3ff80..26978b453 100644 --- a/opensrp-anc/src/main/res/layout/activity_base_profile.xml +++ b/opensrp-anc/src/main/res/layout/activity_base_profile.xml @@ -1,11 +1,12 @@ - - - - - - + - - + - - + - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/activity_characteristics.xml b/opensrp-anc/src/main/res/layout/activity_characteristics.xml index 3727a0b2d..c68d4ce05 100644 --- a/opensrp-anc/src/main/res/layout/activity_characteristics.xml +++ b/opensrp-anc/src/main/res/layout/activity_characteristics.xml @@ -6,7 +6,7 @@ - diff --git a/opensrp-anc/src/main/res/layout/activity_contact.xml b/opensrp-anc/src/main/res/layout/activity_contact.xml index 5ad18ba4b..aa9ebfde8 100644 --- a/opensrp-anc/src/main/res/layout/activity_contact.xml +++ b/opensrp-anc/src/main/res/layout/activity_contact.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/activity_contact_summary.xml b/opensrp-anc/src/main/res/layout/activity_contact_summary.xml index 890840891..7c6046b4b 100644 --- a/opensrp-anc/src/main/res/layout/activity_contact_summary.xml +++ b/opensrp-anc/src/main/res/layout/activity_contact_summary.xml @@ -62,7 +62,7 @@ android:textColor="@color/text_color" android:textSize="16sp" /> - - + diff --git a/opensrp-anc/src/main/res/layout/activity_contact_summary_finish.xml b/opensrp-anc/src/main/res/layout/activity_contact_summary_finish.xml index d85082d0d..52110e0cd 100644 --- a/opensrp-anc/src/main/res/layout/activity_contact_summary_finish.xml +++ b/opensrp-anc/src/main/res/layout/activity_contact_summary_finish.xml @@ -1,18 +1,18 @@ - - - - - + - - + - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/activity_library_content.xml b/opensrp-anc/src/main/res/layout/activity_library_content.xml index 82bf708f4..40a97efb7 100644 --- a/opensrp-anc/src/main/res/layout/activity_library_content.xml +++ b/opensrp-anc/src/main/res/layout/activity_library_content.xml @@ -1,5 +1,5 @@ - @@ -61,4 +61,4 @@ app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/activity_previous_contacts.xml b/opensrp-anc/src/main/res/layout/activity_previous_contacts.xml index 1c646d3a7..6b2911e4f 100644 --- a/opensrp-anc/src/main/res/layout/activity_previous_contacts.xml +++ b/opensrp-anc/src/main/res/layout/activity_previous_contacts.xml @@ -7,13 +7,13 @@ android:fillViewport="true" android:scrollbars="none"> - - - - + - - - + - - - + + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/activity_previous_contacts_tests.xml b/opensrp-anc/src/main/res/layout/activity_previous_contacts_tests.xml index 874500dc1..ef1a3b6a2 100644 --- a/opensrp-anc/src/main/res/layout/activity_previous_contacts_tests.xml +++ b/opensrp-anc/src/main/res/layout/activity_previous_contacts_tests.xml @@ -1,11 +1,11 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/advanced_search_form.xml b/opensrp-anc/src/main/res/layout/advanced_search_form.xml index bb57bc528..c53e4c5ff 100644 --- a/opensrp-anc/src/main/res/layout/advanced_search_form.xml +++ b/opensrp-anc/src/main/res/layout/advanced_search_form.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - + diff --git a/opensrp-anc/src/main/res/layout/advanced_search_list.xml b/opensrp-anc/src/main/res/layout/advanced_search_list.xml index 7d588f654..5f5f6dd85 100644 --- a/opensrp-anc/src/main/res/layout/advanced_search_list.xml +++ b/opensrp-anc/src/main/res/layout/advanced_search_list.xml @@ -52,7 +52,7 @@ android:layout_height="match_parent" android:background="@drawable/listview_background_rounded"> - - @@ -38,7 +38,7 @@ app:layout_constraintLeft_toRightOf="@+id/txt_title_label" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + - - + diff --git a/opensrp-anc/src/main/res/layout/all_tests_results_dialog_row.xml b/opensrp-anc/src/main/res/layout/all_tests_results_dialog_row.xml index a4bce91cc..55ac013a3 100644 --- a/opensrp-anc/src/main/res/layout/all_tests_results_dialog_row.xml +++ b/opensrp-anc/src/main/res/layout/all_tests_results_dialog_row.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/all_tests_results_dialog_title_row.xml b/opensrp-anc/src/main/res/layout/all_tests_results_dialog_title_row.xml index 9bd7821b9..5d06b2a2b 100644 --- a/opensrp-anc/src/main/res/layout/all_tests_results_dialog_title_row.xml +++ b/opensrp-anc/src/main/res/layout/all_tests_results_dialog_title_row.xml @@ -17,13 +17,13 @@ android:textSize="@dimen/referral_dialog_title_text_size" android:textStyle="bold" /> - - + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/balance_nutrition_content.xml b/opensrp-anc/src/main/res/layout/balance_nutrition_content.xml index 8a0723223..aeff2f0a6 100644 --- a/opensrp-anc/src/main/res/layout/balance_nutrition_content.xml +++ b/opensrp-anc/src/main/res/layout/balance_nutrition_content.xml @@ -1,5 +1,5 @@ - - + diff --git a/opensrp-anc/src/main/res/layout/contact_schedule_row.xml b/opensrp-anc/src/main/res/layout/contact_schedule_row.xml index c04cc5291..0c6eedb2a 100644 --- a/opensrp-anc/src/main/res/layout/contact_schedule_row.xml +++ b/opensrp-anc/src/main/res/layout/contact_schedule_row.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/content_contact.xml b/opensrp-anc/src/main/res/layout/content_contact.xml index c5c3f637d..e3e157e1a 100644 --- a/opensrp-anc/src/main/res/layout/content_contact.xml +++ b/opensrp-anc/src/main/res/layout/content_contact.xml @@ -1,5 +1,5 @@ - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/fragment_library.xml b/opensrp-anc/src/main/res/layout/fragment_library.xml index 266b92aa3..d0bb54bfb 100644 --- a/opensrp-anc/src/main/res/layout/fragment_library.xml +++ b/opensrp-anc/src/main/res/layout/fragment_library.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/fragment_profile_contacts.xml b/opensrp-anc/src/main/res/layout/fragment_profile_contacts.xml index c2f518852..bc5cc5053 100644 --- a/opensrp-anc/src/main/res/layout/fragment_profile_contacts.xml +++ b/opensrp-anc/src/main/res/layout/fragment_profile_contacts.xml @@ -1,5 +1,5 @@ - - @@ -49,7 +49,7 @@ android:textColor="@color/white" app:layout_constraintTop_toTopOf="parent" /> - - + - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/fragment_profile_overview.xml b/opensrp-anc/src/main/res/layout/fragment_profile_overview.xml index c82573ba4..8ce0d25df 100644 --- a/opensrp-anc/src/main/res/layout/fragment_profile_overview.xml +++ b/opensrp-anc/src/main/res/layout/fragment_profile_overview.xml @@ -1,5 +1,5 @@ - @@ -8,7 +8,7 @@ android:id="@+id/no_health_data_recorded_profile_overview_layout" layout="@layout/no_health_data_record" /> - - + diff --git a/opensrp-anc/src/main/res/layout/fragment_profile_tasks.xml b/opensrp-anc/src/main/res/layout/fragment_profile_tasks.xml index df2d88033..3e29f6c34 100644 --- a/opensrp-anc/src/main/res/layout/fragment_profile_tasks.xml +++ b/opensrp-anc/src/main/res/layout/fragment_profile_tasks.xml @@ -28,7 +28,7 @@ android:textColor="@color/dark_grey" android:visibility="visible" /> - - @@ -27,7 +27,7 @@ android:textSize="@dimen/quick_check_text_size" android:textStyle="bold" /> - - - - + - - + - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/nav_view_base.xml b/opensrp-anc/src/main/res/layout/nav_view_base.xml index 8e5b585d9..3396de7d2 100644 --- a/opensrp-anc/src/main/res/layout/nav_view_base.xml +++ b/opensrp-anc/src/main/res/layout/nav_view_base.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/physical_activity_content.xml b/opensrp-anc/src/main/res/layout/physical_activity_content.xml index c79347044..ca7a4a5a3 100644 --- a/opensrp-anc/src/main/res/layout/physical_activity_content.xml +++ b/opensrp-anc/src/main/res/layout/physical_activity_content.xml @@ -1,5 +1,5 @@ - - + diff --git a/opensrp-anc/src/main/res/layout/previous_contact_row.xml b/opensrp-anc/src/main/res/layout/previous_contact_row.xml index 90debe5f2..2ed82b001 100644 --- a/opensrp-anc/src/main/res/layout/previous_contact_row.xml +++ b/opensrp-anc/src/main/res/layout/previous_contact_row.xml @@ -1,10 +1,10 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/previous_contacts_preview_row.xml b/opensrp-anc/src/main/res/layout/previous_contacts_preview_row.xml index 7b0843061..fa5246e7d 100644 --- a/opensrp-anc/src/main/res/layout/previous_contacts_preview_row.xml +++ b/opensrp-anc/src/main/res/layout/previous_contacts_preview_row.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/profile_overview_row.xml b/opensrp-anc/src/main/res/layout/profile_overview_row.xml index 412e5d1b4..15fe1d6e4 100644 --- a/opensrp-anc/src/main/res/layout/profile_overview_row.xml +++ b/opensrp-anc/src/main/res/layout/profile_overview_row.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/register_home_list_row.xml b/opensrp-anc/src/main/res/layout/register_home_list_row.xml index 3a67470bd..094cc41f4 100644 --- a/opensrp-anc/src/main/res/layout/register_home_list_row.xml +++ b/opensrp-anc/src/main/res/layout/register_home_list_row.xml @@ -10,7 +10,7 @@ android:paddingStart="@dimen/main_register_padding_start" android:paddingEnd="@dimen/main_register_padding_end"> - - + - - \ No newline at end of file + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_advanced_search.xml b/opensrp-anc/src/main/res/layout/toolbar_advanced_search.xml index 063c001e3..637053cac 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_advanced_search.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_advanced_search.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - + - + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_characteristics.xml b/opensrp-anc/src/main/res/layout/toolbar_characteristics.xml index b7853f7f0..7fcb8d3be 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_characteristics.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_characteristics.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - + - + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_contact.xml b/opensrp-anc/src/main/res/layout/toolbar_contact.xml index 1458bacea..f51c89b69 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_contact.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_contact.xml @@ -1,11 +1,11 @@ - - - + - + diff --git a/opensrp-anc/src/main/res/layout/toolbar_container_form.xml b/opensrp-anc/src/main/res/layout/toolbar_container_form.xml index cc403a905..ce4719298 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_container_form.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_container_form.xml @@ -1,11 +1,11 @@ - - - + - + diff --git a/opensrp-anc/src/main/res/layout/toolbar_library.xml b/opensrp-anc/src/main/res/layout/toolbar_library.xml index 42987b148..f8a8c205b 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_library.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_library.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - - + + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_library_activity.xml b/opensrp-anc/src/main/res/layout/toolbar_library_activity.xml index a3231d796..43c8647f3 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_library_activity.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_library_activity.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - - + + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_previous_contacts.xml b/opensrp-anc/src/main/res/layout/toolbar_previous_contacts.xml index 40ba335d1..ce1ccf903 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_previous_contacts.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_previous_contacts.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - + - + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_quick_check.xml b/opensrp-anc/src/main/res/layout/toolbar_quick_check.xml index 0b8c08073..befbb8019 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_quick_check.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_quick_check.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - + - + \ No newline at end of file diff --git a/opensrp-anc/src/main/res/layout/toolbar_sort_filter.xml b/opensrp-anc/src/main/res/layout/toolbar_sort_filter.xml index 49f1e8a52..5764bafea 100644 --- a/opensrp-anc/src/main/res/layout/toolbar_sort_filter.xml +++ b/opensrp-anc/src/main/res/layout/toolbar_sort_filter.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - + - + \ No newline at end of file diff --git a/opensrp-anc/src/test/AndroidTestManifest.xml b/opensrp-anc/src/test/AndroidTestManifest.xml index 01b8e0cb7..11abbba81 100644 --- a/opensrp-anc/src/test/AndroidTestManifest.xml +++ b/opensrp-anc/src/test/AndroidTestManifest.xml @@ -102,7 +102,7 @@ android:screenOrientation="portrait" /> diff --git a/opensrp-anc/src/test/assets/app.properties b/opensrp-anc/src/test/assets/app.properties new file mode 100644 index 000000000..7c8570781 --- /dev/null +++ b/opensrp-anc/src/test/assets/app.properties @@ -0,0 +1,7 @@ +DRISHTI_BASE_URL= +PORT=-1 +SHOULD_VERIFY_CERTIFICATE=false +SYNC_DOWNLOAD_BATCH_SIZE=100 +CAN_SAVE_INITIAL_SITE_SETTING=false +MAX_CONTACT_SCHEDULE_DISPLAYED=5 +DUE_CHECK_STRATEGY=check_for_first_contact \ No newline at end of file diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseActivityUnitTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseActivityUnitTest.java index f6b35a210..4ef61d5d2 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseActivityUnitTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseActivityUnitTest.java @@ -12,6 +12,8 @@ import org.smartregister.CoreLibrary; import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.util.Utils; +import org.smartregister.configurableviews.ConfigurableViewsLibrary; +import org.smartregister.configurableviews.helper.ConfigurableViewsHelper; import org.smartregister.location.helper.LocationHelper; import org.smartregister.repository.AllSharedPreferences; import org.smartregister.repository.FormDataRepository; @@ -24,13 +26,19 @@ public abstract class BaseActivityUnitTest extends BaseUnitTest { public Context context; + @Mock private Repository repository; + @Mock private FormDataRepository formDataRepository; + @Mock private CoreLibrary coreLibrary; + @Mock + private ConfigurableViewsLibrary configurableViewsLibrary; + public void setUp() { MockitoAnnotations.initMocks(this); @@ -51,8 +59,12 @@ public void setUp() { //Auto login by default String password = "pwd"; context.session().start(context.session().lengthInMilliseconds()); - context.configuration().getDrishtiApplication().setPassword(password); - context.session().setPassword(password); + context.configuration().getDrishtiApplication().setPassword(password.getBytes()); + context.session().setPassword(password.getBytes()); + + ReflectionHelpers.setStaticField(ConfigurableViewsLibrary.class, "instance", configurableViewsLibrary); + ConfigurableViewsHelper configurableViewsHelper = Mockito.mock(ConfigurableViewsHelper.class); + Mockito.when(configurableViewsLibrary.getConfigurableViewsHelper()).thenReturn(configurableViewsHelper); DrishtiApplication drishtiApplication = Mockito.mock(DrishtiApplication.class); ReflectionHelpers.setStaticField(DrishtiApplication.class, "mInstance", drishtiApplication); @@ -63,13 +75,13 @@ public void setUp() { protected void destroyController() { try { - getActivity().finish(); - getActivityController().pause().stop().destroy(); //destroy controller if we can - + if (getActivity() != null) { + getActivity().finish(); + getActivityController().pause().stop().destroy(); //destroy controller if we can + } } catch (Exception e) { e.printStackTrace(); } - System.gc(); } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivityTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivityTest.java index 2e2992015..6db56492f 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivityTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/BaseHomeRegisterActivityTest.java @@ -2,8 +2,8 @@ import android.app.Activity; import android.content.Context; -import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.appcompat.app.AlertDialog; import com.google.common.collect.ImmutableMap; @@ -56,6 +56,7 @@ public class BaseHomeRegisterActivityTest extends BaseActivityUnitTest { @Mock private List filterList; + @Mock private Field sortField; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ContactSummaryFinishActivityTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ContactSummaryFinishActivityTest.java index 57ca928d8..f2a894033 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ContactSummaryFinishActivityTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ContactSummaryFinishActivityTest.java @@ -2,8 +2,8 @@ import android.app.Activity; import android.content.Intent; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; import android.view.MenuItem; import android.widget.ImageView; import android.widget.TextView; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ProfileActivityTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ProfileActivityTest.java index 520f7b5cc..8a946bbf5 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ProfileActivityTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/activity/ProfileActivityTest.java @@ -4,8 +4,8 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; import android.widget.ImageView; import android.widget.TextView; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/LastContactAdapterTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/LastContactAdapterTest.java index 4a1ed309a..9ae7ebac3 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/LastContactAdapterTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/LastContactAdapterTest.java @@ -3,10 +3,13 @@ import android.widget.LinearLayout; +import org.jeasy.rules.api.Facts; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.powermock.reflect.Whitebox; import org.robolectric.RuntimeEnvironment; @@ -14,14 +17,17 @@ import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.activity.BaseUnitTest; import org.smartregister.anc.library.domain.LastContactDetailsWrapper; +import org.smartregister.anc.library.util.ConstantsUtils; import java.util.ArrayList; import java.util.List; public class LastContactAdapterTest extends BaseUnitTest { private LastContactAdapter lastContactAdapter; + @Mock private List lastContactDetailsList; + @Mock private AncLibrary ancLibrary; @@ -50,4 +56,49 @@ public void testGetItemCountInvokesGetSizeMethodOfDataList() { Whitebox.setInternalState(lastContactAdapter, "lastContactDetailsList", new ArrayList<>()); Assert.assertEquals(0, lastContactAdapter.getItemCount()); } + + @Test + public void testIsFirstContactUpdateGABasedOnDueStrategyForContactOne() throws Exception { + Mockito.doReturn(RuntimeEnvironment.application).when(ancLibrary).getApplicationContext(); + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); + LastContactDetailsWrapper lastContactDetailsWrapper = Mockito.mock(LastContactDetailsWrapper.class); + + String result = Whitebox.invokeMethod(lastContactAdapter, "updateGABasedOnDueStrategy", + "", "1", lastContactDetailsWrapper); + Assert.assertEquals("-", result); + } + + @Test + public void testIsFirstContactUpdateGABasedOnDueStrategyForContactGreaterThanOne() throws Exception { + Mockito.doReturn(RuntimeEnvironment.application).when(ancLibrary).getApplicationContext(); + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); + Facts facts = new Facts(); + facts.put(ConstantsUtils.EDD, "06-06-2020"); + facts.put(ConstantsUtils.CONTACT_DATE, "2020-04-04"); + + LastContactDetailsWrapper lastContactDetailsWrapper = Mockito.mock(LastContactDetailsWrapper.class); + + Mockito.doReturn(facts).when(lastContactDetailsWrapper).getFacts(); + List lastContactDetailsList = new ArrayList<>(); + lastContactDetailsList.add(lastContactDetailsWrapper); + lastContactDetailsList.add(lastContactDetailsWrapper); + Whitebox.setInternalState(lastContactAdapter, "lastContactDetailsList", lastContactDetailsList); + + //when gest_age_openmrs is null + String resultOne = Whitebox.invokeMethod(lastContactAdapter, "updateGABasedOnDueStrategy", + "", "2", lastContactDetailsWrapper); + Assert.assertEquals("31", resultOne); + + facts.put(ConstantsUtils.GEST_AGE_OPENMRS, "32"); + + //when gest_age_openmrs is not null + String resultTwo = Whitebox.invokeMethod(lastContactAdapter, "updateGABasedOnDueStrategy", + "", "2", lastContactDetailsWrapper); + Assert.assertEquals("32", resultTwo); + } + + @After + public void teardown() { + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", null); + } } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapterTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapterTest.java index 221d374b3..857317891 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapterTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ProfileViewPagerAdapterTest.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.adapter; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import org.junit.Assert; import org.junit.Before; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ServiceLocationsAdapterTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ServiceLocationsAdapterTest.java index a9a0d97be..5755bd53d 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ServiceLocationsAdapterTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/adapter/ServiceLocationsAdapterTest.java @@ -12,6 +12,7 @@ import org.smartregister.anc.library.activity.BaseUnitTest; import java.util.ArrayList; +import java.util.List; public class ServiceLocationsAdapterTest extends BaseUnitTest { private ServiceLocationsAdapter serviceLocationsAdapter; @@ -39,7 +40,7 @@ public void testGetLocationNames() { locationNames.addAll(ArgumentMatchers.anyList()); Assert.assertNotNull(locationNames); - ArrayList arrayList = serviceLocationsAdapter.getLocationNames(); + List arrayList = serviceLocationsAdapter.getLocationNames(); Assert.assertNotNull(arrayList); } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragmentTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragmentTest.java index 6bbc8c157..6552cbbe9 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragmentTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ContactWizardJsonFormFragmentTest.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.fragment; import android.os.Bundle; -import android.support.v7.app.ActionBar; +import androidx.appcompat.app.ActionBar; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileContactsFragmentTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileContactsFragmentTest.java index d76d0d7f4..84f6ceb13 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileContactsFragmentTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileContactsFragmentTest.java @@ -2,9 +2,9 @@ import android.app.Activity; import android.content.Intent; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import org.junit.After; import org.junit.Assert; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileOverviewFragmentTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileOverviewFragmentTest.java index 734a77fe9..a082329ee 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileOverviewFragmentTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileOverviewFragmentTest.java @@ -2,9 +2,9 @@ import android.app.Activity; import android.content.Intent; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import org.junit.After; import org.junit.Assert; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileTasksFragmentTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileTasksFragmentTest.java index 69edda6d2..db98c0c2d 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileTasksFragmentTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/fragment/ProfileTasksFragmentTest.java @@ -3,9 +3,9 @@ import android.app.Activity; import android.content.Intent; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import com.vijay.jsonwizard.constants.JsonFormConstants; import com.vijay.jsonwizard.domain.Form; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/AncRulesEngineFactoryTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/AncRulesEngineFactoryTest.java index 15d2a38f2..0634bd52e 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/AncRulesEngineFactoryTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/AncRulesEngineFactoryTest.java @@ -52,13 +52,14 @@ public void testBeforeEvaluateWithEmptyRuleAndFacts() { } @Test - public void testInitializeFacts() { + public void testInitializeFacts() throws JSONException { globalValues.put("pallor", "yes"); globalValues.put("select-rule", "step2_accordion_hiv"); - Whitebox.setInternalState(ancRulesEngineFactory, "globalValues", globalValues); Whitebox.setInternalState(ancRulesEngineFactory, "selectedRuleName", "Test"); + + AncRulesEngineFactory ancRulesEngineFactory = new AncRulesEngineFactory(RuntimeEnvironment.application, globalValues, new JSONObject(DUMMY_JSON_OBJECT)); Facts facts = ancRulesEngineFactory.initializeFacts(new Facts()); - Assert.assertEquals(5, facts.asMap().size()); + Assert.assertEquals(3, facts.asMap().size()); Assert.assertTrue(facts.asMap().containsKey("global_pallor")); Assert.assertEquals("yes", facts.asMap().get("global_pallor")); } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/BottomNavigationHelperDisableShiftModeTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/BottomNavigationHelperDisableShiftModeTest.java index 26ea6e3f3..a7791ad00 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/BottomNavigationHelperDisableShiftModeTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/BottomNavigationHelperDisableShiftModeTest.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.helper; import android.app.Activity; -import android.support.design.widget.BottomNavigationView; +import com.google.android.material.bottomnavigation.BottomNavigationView; import org.junit.After; import org.junit.Assert; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/ImageRenderHelperTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/ImageRenderHelperTest.java index c2f68df88..4113569d4 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/ImageRenderHelperTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/helper/ImageRenderHelperTest.java @@ -4,7 +4,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; +import androidx.core.content.ContextCompat; import android.widget.ImageView; import org.junit.Assert; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/interactor/RegisterInteractorTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/interactor/RegisterInteractorTest.java index 802b660bc..9234457ad 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/interactor/RegisterInteractorTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/interactor/RegisterInteractorTest.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.interactor; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.tuple.Triple; import org.json.JSONObject; @@ -12,17 +12,21 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Captor; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import org.robolectric.util.ReflectionHelpers; +import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.activity.BaseUnitTest; import org.smartregister.anc.library.contract.RegisterContract; import org.smartregister.anc.library.helper.ECSyncHelper; import org.smartregister.anc.library.sync.BaseAncClientProcessorForJava; +import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.anc.library.util.AppExecutors; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.anc.library.util.DBConstantsUtils; -import org.smartregister.anc.library.util.ANCJsonFormUtils; import org.smartregister.clientandeventmodel.Client; import org.smartregister.clientandeventmodel.Event; import org.smartregister.domain.UniqueId; @@ -32,6 +36,7 @@ import org.smartregister.repository.UniqueIdRepository; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -62,8 +67,12 @@ public class RegisterInteractorTest extends BaseUnitTest { @Captor private ArgumentCaptor longArgumentCaptor; + @Mock + private AncLibrary ancLibrary; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); interactor = new RegisterInteractor(new AppExecutors(Executors.newSingleThreadExecutor(), Executors.newSingleThreadExecutor(), Executors.newSingleThreadExecutor())); } @@ -136,6 +145,7 @@ public void testSaveNewRegistration() throws Exception { String baseEntityId = "112123"; String ancId = "1324354"; + String formSubmissionId = "132vb-sdsd-we"; Client client = new Client(baseEntityId); Map identifiers = new HashMap<>(); @@ -144,6 +154,7 @@ public void testSaveNewRegistration() throws Exception { Event event = new Event(); event.setBaseEntityId(baseEntityId); + event.setFormSubmissionId(formSubmissionId); Pair pair = Pair.create(client, event); @@ -155,12 +166,14 @@ public void testSaveNewRegistration() throws Exception { long timestamp = new Date().getTime(); List eventClients = new ArrayList<>(); - EventClient eventClient = new EventClient(ANCJsonFormUtils.gson.fromJson(eventObject.toString(), org.smartregister.domain.db.Event.class), - ANCJsonFormUtils.gson.fromJson(clientObject.toString(), org.smartregister.domain.db.Client.class)); + EventClient eventClient = new EventClient(ANCJsonFormUtils.gson.fromJson(eventObject.toString(), org.smartregister.domain.Event.class), + ANCJsonFormUtils.gson.fromJson(clientObject.toString(), org.smartregister.domain.Client.class)); eventClients.add(eventClient); Mockito.doReturn(timestamp).when(allSharedPreferences).fetchLastUpdatedAtDate(0); - Mockito.doReturn(eventClients).when(syncHelper).getEvents(new Date(timestamp), BaseRepository.TYPE_Unprocessed); + Mockito.doReturn(eventClients).when(syncHelper).getEvents(Arrays.asList(formSubmissionId)); + + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); registerInteractor.saveRegistration(pair, jsonString, false, callBack); @@ -230,8 +243,8 @@ public void testSaveEditRegistration() throws Exception { long timestamp = new Date().getTime(); List eventClients = new ArrayList<>(); - EventClient eventClient = new EventClient(ANCJsonFormUtils.gson.fromJson(eventObject.toString(), org.smartregister.domain.db.Event.class), - ANCJsonFormUtils.gson.fromJson(clientObject.toString(), org.smartregister.domain.db.Client.class)); + EventClient eventClient = new EventClient(ANCJsonFormUtils.gson.fromJson(eventObject.toString(), org.smartregister.domain.Event.class), + ANCJsonFormUtils.gson.fromJson(clientObject.toString(), org.smartregister.domain.Client.class)); eventClients.add(eventClient); JSONObject orginalClientObject = clientObject; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/job/TestAncJobCreator.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/job/TestAncJobCreator.java index e08b65e28..4faca6fd3 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/job/TestAncJobCreator.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/job/TestAncJobCreator.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.job; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.Log; import com.evernote.android.job.Job; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/model/LoginModelTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/model/LoginModelTest.java index 8b4dcd029..9aa2394a3 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/model/LoginModelTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/model/LoginModelTest.java @@ -40,20 +40,6 @@ public void testGetOpenSRPContextShouldReturnValidValue() { Assert.assertNotNull(model.getOpenSRPContext()); } - @Test - public void testIsPasswordValidShouldTrueWhenPasswordValidatesCorrectly() { - boolean result = model.isPasswordValid(DUMMY_PASSWORD); - Assert.assertTrue(result); - } - - @Test - public void testIsPasswordValidShouldFalseWhenPasswordValidationFails() { - boolean result = model.isPasswordValid(""); - Assert.assertFalse(result); - result = model.isPasswordValid("A"); - Assert.assertFalse(result); - } - @Test public void testIsEmptyUsernameShouldTrueWhenIsEmpty() { boolean result = model.isEmptyUsername(""); diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/model/RegisterModelTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/model/RegisterModelTest.java index 97efc2aa6..039b5f2d1 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/model/RegisterModelTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/model/RegisterModelTest.java @@ -1,6 +1,6 @@ package org.smartregister.anc.library.model; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.time.DateUtils; import org.json.JSONArray; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterFragmentPresenterTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterFragmentPresenterTest.java index 57927aa43..b775b4bf2 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterFragmentPresenterTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterFragmentPresenterTest.java @@ -89,7 +89,7 @@ public void testInitializeQueries() { private String countSelect(String tableName, String mainCondition) { SmartRegisterQueryBuilder countQueryBuilder = new SmartRegisterQueryBuilder(); - countQueryBuilder.SelectInitiateMainTableCounts(tableName); + countQueryBuilder.selectInitiateMainTableCounts(tableName); return countQueryBuilder.mainCondition(mainCondition); } @@ -104,7 +104,7 @@ private String mainSelect(String tableName, String mainCondition) { tableName + "." + DBConstantsUtils.KeyUtils.ANC_ID, tableName + "." + DBConstantsUtils.KeyUtils.DOB, tableName + "." + DBConstantsUtils.KeyUtils.DATE_REMOVED}; - queryBUilder.SelectInitiateMainTable(tableName, columns); + queryBUilder.selectInitiateMainTable(tableName, columns); return queryBUilder.mainCondition(mainCondition); } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterPresenterTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterPresenterTest.java index 5c78bcfce..3ef47c508 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterPresenterTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/presenter/RegisterPresenterTest.java @@ -1,7 +1,7 @@ package org.smartregister.anc.library.presenter; -import android.support.v4.util.Pair; +import androidx.core.util.Pair; import org.apache.commons.lang3.tuple.Triple; import org.json.JSONObject; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/repository/PreviousContactRepositoryTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/repository/PreviousContactRepositoryTest.java new file mode 100644 index 000000000..5d432e9f3 --- /dev/null +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/repository/PreviousContactRepositoryTest.java @@ -0,0 +1,91 @@ +package org.smartregister.anc.library.repository; + + +import net.sqlcipher.Cursor; +import net.sqlcipher.database.SQLiteDatabase; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.smartregister.anc.library.activity.BaseUnitTest; +import org.smartregister.anc.library.model.PreviousContact; + +import java.util.List; + +public class PreviousContactRepositoryTest extends BaseUnitTest { + + @Mock + private SQLiteDatabase sqLiteDatabase; + + private PreviousContactRepository previousContactRepository; + + @Mock + private Cursor cursor; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + previousContactRepository = Mockito.spy(new PreviousContactRepository()); + } + + @Test + public void testGetPreviousContactsShouldReturnPreviousLists() { + String baseEntityId = "3243-4wew-323"; + String[] keysArr = new String[]{"contact_date"}; + + Mockito.doReturn(0).when(cursor) + .getColumnIndex(PreviousContactRepository.ID); + Mockito.doReturn(1).when(cursor) + .getColumnIndex(PreviousContactRepository.KEY); + Mockito.doReturn(2).when(cursor) + .getColumnIndex(PreviousContactRepository.VALUE); + Mockito.doReturn(3).when(cursor) + .getColumnIndex(PreviousContactRepository.BASE_ENTITY_ID); + + + Mockito.doReturn(1L).when(cursor) + .getLong(0); + Mockito.doReturn("contact_date").when(cursor) + .getString(1); + Mockito.doReturn("2020-08-08").when(cursor) + .getString(2); + Mockito.doReturn(baseEntityId).when(cursor) + .getString(3); + + Mockito.doAnswer(new Answer() { + int count = 0; + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + if (count > 0) { + return false; + } + count++; + return true; + } + }).when(cursor).moveToNext(); + + Mockito.doReturn(sqLiteDatabase) + .when(previousContactRepository).getReadableDatabase(); + + Mockito.doReturn(cursor).when(sqLiteDatabase) + .query(Mockito.eq(PreviousContactRepository.TABLE_NAME), + Mockito.any(String[].class), + Mockito.anyString(), + Mockito.any(String[].class), + Mockito.eq(null), + Mockito.eq(null), + Mockito.anyString(), + Mockito.eq(null)); + + + List previousContactList = previousContactRepository.getPreviousContacts(baseEntityId, keysArr); + Assert.assertEquals(1, previousContactList.size()); + } + +} \ No newline at end of file diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/sync/BaseAncClientProcessorForJavaTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/sync/BaseAncClientProcessorForJavaTest.java index 9124585af..acce66dc9 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/sync/BaseAncClientProcessorForJavaTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/sync/BaseAncClientProcessorForJavaTest.java @@ -17,8 +17,8 @@ import org.smartregister.anc.library.activity.BaseUnitTest; import org.smartregister.anc.library.repository.ContactTasksRepository; import org.smartregister.anc.library.util.ConstantsUtils; -import org.smartregister.domain.db.Client; -import org.smartregister.domain.db.Event; +import org.smartregister.domain.Client; +import org.smartregister.domain.Event; import org.smartregister.domain.db.EventClient; import org.smartregister.repository.DetailsRepository; diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/ANCJsonFormUtilsTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/ANCJsonFormUtilsTest.java index 9ca04a354..876e51bae 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/ANCJsonFormUtilsTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/ANCJsonFormUtilsTest.java @@ -1,6 +1,7 @@ package org.smartregister.anc.library.util; import android.graphics.Bitmap; +import androidx.core.util.Pair; import com.vijay.jsonwizard.constants.JsonFormConstants; @@ -8,6 +9,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -20,6 +22,7 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; import org.powermock.reflect.internal.WhiteboxImpl; import org.robolectric.util.ReflectionHelpers; import org.skyscreamer.jsonassert.Customization; @@ -51,6 +54,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -371,6 +375,11 @@ public void testGetAutoPopulatedJsonEditFormStringInjectsValuesCorrectlyInForm() PowerMockito.mockStatic(LocationHelper.class); PowerMockito.when(LocationHelper.getInstance()).thenReturn(locationHelper); + AncMetadata ancMetadata = new AncMetadata(); + ancMetadata.setFieldsWithLocationHierarchy(new HashSet<>(Arrays.asList("village"))); + Mockito.when(ancLibrary.getAncMetadata()).thenReturn(ancMetadata); + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); + ArrayList allLevels = new ArrayList<>(); allLevels.add("Country"); allLevels.add("Province"); @@ -388,7 +397,6 @@ public void testGetAutoPopulatedJsonEditFormStringInjectsValuesCorrectlyInForm() formLocation.name = details.get(DBConstantsUtils.KeyUtils.HOME_ADDRESS); formLocations.add(formLocation); - List locations = new ArrayList<>(); locations.add(details.get(Utils.HOME_ADDRESS)); PowerMockito.when(locationHelper.generateDefaultLocationHierarchy(ArgumentMatchers.eq(healthFacilities))).thenReturn(locations); @@ -539,14 +547,13 @@ public void testSaveRemovedFromANCRegister() { Mockito.when(allSharedPreferences.fetchDefaultTeam(providerId)).thenReturn("bukesa"); Mockito.when(allSharedPreferences.fetchDefaultTeamId(providerId)).thenReturn("39305854-5db8-4538-a367-8d4b7118f9af"); - Triple eventEventTriple = ANCJsonFormUtils.saveRemovedFromANCRegister(allSharedPreferences, closeAnc, providerId); - Assert.assertNotNull(eventEventTriple); - Assert.assertFalse(eventEventTriple.getLeft()); - Assert.assertNotNull(eventEventTriple.getMiddle()); - Assert.assertEquals("ANC Close", eventEventTriple.getMiddle().getEventType()); + Pair eventEventPair = ANCJsonFormUtils.saveRemovedFromANCRegister(allSharedPreferences, closeAnc, providerId); + Assert.assertNotNull(eventEventPair); + Assert.assertNotNull(eventEventPair.first); + Assert.assertEquals("ANC Close", eventEventPair.first.getEventType()); - Assert.assertNotNull(eventEventTriple.getRight()); - Assert.assertEquals("Update ANC Registration", eventEventTriple.getRight().getEventType()); + Assert.assertNotNull(eventEventPair.second); + Assert.assertEquals("Update ANC Registration", eventEventPair.second.getEventType()); } @Test @@ -649,4 +656,56 @@ public void testProcessContactFormEventShouldPopulateEventObjectAccordingly() th Assert.assertEquals(coJsonObject.optString(JsonFormConstants.ENCOUNTER_TYPE), resultEvent.getEventType()); Assert.assertEquals("demo", resultEvent.getProviderId()); } + + @Test + @PrepareForTest(Utils.class) + public void testInitializeFirstContactValuesForDefaultStrategy() throws Exception { + PowerMockito.mockStatic(Utils.class); + PowerMockito.when(Utils.class, "getDueCheckStrategy").thenReturn(""); + JSONArray fields = new JSONObject(registerFormJsonString).optJSONObject(JsonFormConstants.STEP1) + .optJSONArray(JsonFormConstants.FIELDS); + String result = Whitebox.invokeMethod(ANCJsonFormUtils.class, "initializeFirstContactValues", fields); + JSONObject nextContactJsonObject = ANCJsonFormUtils.getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT); + JSONObject nextContactDateJsonObject = ANCJsonFormUtils.getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE); + Assert.assertEquals(String.valueOf(1), nextContactJsonObject.optString(JsonFormConstants.VALUE)); + Assert.assertTrue(nextContactDateJsonObject.optString(JsonFormConstants.VALUE).isEmpty()); + Assert.assertNull(result); + } + + @Test + @PrepareForTest(Utils.class) + public void testInitializeFirstContactValuesForIsFirstContactStrategy() throws Exception { + PowerMockito.mockStatic(Utils.class); + PowerMockito.when(Utils.class, "getDueCheckStrategy").thenReturn(ConstantsUtils.DueCheckStrategy.CHECK_FOR_FIRST_CONTACT); + + JSONArray fields = new JSONObject(registerFormJsonString).optJSONObject(JsonFormConstants.STEP1) + .optJSONArray(JsonFormConstants.FIELDS); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put(JsonFormConstants.KEY, DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE); + fields.put(jsonObject); + + HashMap groupItem = new LinkedHashMap<>(); + groupItem.put("visit_date", "04-04-2020"); + HashMap> groupMap = new HashMap<>(); + groupMap.put("324-w3424", groupItem); + + PowerMockito.when(Utils.class, "buildRepeatingGroupValues", Mockito.any(JSONArray.class), Mockito.anyString()).thenReturn(groupMap); + + PowerMockito.when(Utils.class, "reverseHyphenSeperatedValues", Mockito.anyString(), Mockito.anyString()).thenCallRealMethod(); + String result = Whitebox.invokeMethod(ANCJsonFormUtils.class, "initializeFirstContactValues", fields); + JSONObject nextContactJsonObject = ANCJsonFormUtils.getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT); + JSONObject nextContactDateJsonObject = ANCJsonFormUtils.getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE); + JSONObject lastContactDateJsonObject = ANCJsonFormUtils.getFieldJSONObject(fields, DBConstantsUtils.KeyUtils.LAST_CONTACT_RECORD_DATE); + + Assert.assertEquals(String.valueOf(2), nextContactJsonObject.optString(JsonFormConstants.VALUE)); + Assert.assertTrue(nextContactDateJsonObject.optString(JsonFormConstants.VALUE).isEmpty()); + Assert.assertEquals("2020-04-04", lastContactDateJsonObject.optString(JsonFormConstants.VALUE)); + Assert.assertNotNull(result); + } + + @After + public void teardown() { + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", null); + } } diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/SiteCharacteristicsTemplateUtilsTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/SiteCharacteristicsTemplateUtilsTest.java index 02b81bc58..3429d0575 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/SiteCharacteristicsTemplateUtilsTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/SiteCharacteristicsTemplateUtilsTest.java @@ -3,6 +3,7 @@ import android.content.Context; import org.json.JSONObject; +import org.junit.After; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,8 +62,12 @@ public void testStructureFormForRequestWhenTemplateIsFound() throws Exception { PowerMockito.when(TemplateUtils.getTemplateAsJson(contextAndroid, ConstantsUtils.PrefKeyUtils.SITE_CHARACTERISTICS)).thenReturn(new JSONObject()); String expected = "{\"locationId\":\"locations\",\"providerId\":\"Some Provider\",\"teamId\":\"teamId\",\"team\":\"team\"}"; Assert.assertEquals(expected, SiteCharacteristicsFormUtils.structureFormForRequest(contextAndroid).toString()); - ReflectionHelpers.setStaticField(AncLibrary.class, "instance", null); + } + @After + public void teardown() { + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", null); } + } \ No newline at end of file diff --git a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/UtilsTest.java b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/UtilsTest.java index 8d8a56e8c..ae0166c1a 100644 --- a/opensrp-anc/src/test/java/org/smartregister/anc/library/util/UtilsTest.java +++ b/opensrp-anc/src/test/java/org/smartregister/anc/library/util/UtilsTest.java @@ -4,15 +4,21 @@ import android.widget.Button; import android.widget.TextView; +import com.vijay.jsonwizard.constants.JsonFormConstants; + import org.apache.commons.lang3.StringUtils; import org.hamcrest.Matchers; import org.joda.time.DateTime; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.powermock.api.mockito.PowerMockito; @@ -23,15 +29,23 @@ import org.powermock.reflect.Whitebox; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.util.ReflectionHelpers; import org.smartregister.Context; import org.smartregister.CoreLibrary; +import org.smartregister.anc.library.AncLibrary; import org.smartregister.anc.library.R; import org.smartregister.anc.library.activity.BaseUnitTest; import org.smartregister.anc.library.domain.ButtonAlertStatus; +import org.smartregister.anc.library.helper.ECSyncHelper; +import org.smartregister.anc.library.repository.PatientRepository; +import org.smartregister.anc.library.repository.RegisterQueryProvider; +import org.smartregister.clientandeventmodel.Event; import org.smartregister.repository.AllSharedPreferences; -import org.smartregister.util.Utils; +import org.smartregister.sync.ClientProcessorForJava; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -39,6 +53,9 @@ import edu.emory.mathcs.backport.java.util.Collections; import timber.log.Timber; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.smartregister.anc.library.util.Utils.getKeyByValue; import static org.smartregister.anc.library.util.Utils.getTodayContact; import static org.smartregister.anc.library.util.Utils.hasPendingRequiredFields; @@ -59,6 +76,18 @@ public class UtilsTest extends BaseUnitTest { @Rule public PowerMockRule rule = new PowerMockRule(); + @Mock + private CoreLibrary coreLibrary; + + @Mock + private Context opensrpContext; + + @Mock + private AllSharedPreferences allSharedPreferences; + + @Mock + private AncLibrary ancLibrary; + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -424,4 +453,81 @@ public void testGetDefaultDisplayTemplateOnProfile() { Timber.e(e, " --> testGetDisplayTemplate"); } } + + @Test + public void testBuildRepeatingGroupValuesShouldReturnCorrectGroupNo() throws JSONException { + String strStep1JsonObject = "{\"fields\":[{\"key\":\"previous_visits\",\"type\":\"repeating_group\",\"value\"" + + ":[{\"key\":\"visit_date\"}]}," + + "{\"key\":\"visit_date_128040f1b4034311b34b6ea65a81d3aa\",\"value\":\"2020-09-09\"}]}"; + JSONObject step1JsonObject = new JSONObject(strStep1JsonObject); + HashMap> repeatingGroupNum = Utils.buildRepeatingGroupValues(step1JsonObject.optJSONArray(JsonFormConstants.FIELDS), ConstantsUtils.JsonFormKeyUtils.PREVIOUS_VISITS); + assertEquals(1, repeatingGroupNum.size()); + } + + @Test + @PrepareForTest(PatientRepository.class) + public void testCreateContactVisitEventShouldCreateEvent() throws Exception { + Map womanDetails = new HashMap<>(); + womanDetails.put(DBConstantsUtils.KeyUtils.NEXT_CONTACT, "2"); + womanDetails.put(DBConstantsUtils.KeyUtils.VISIT_START_DATE, "2020-09-08"); + womanDetails.put(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID, "232-sds-34"); + ReflectionHelpers.setStaticField(CoreLibrary.class, "instance", coreLibrary); + Mockito.when(coreLibrary.context()).thenReturn(opensrpContext); + Mockito.when(opensrpContext.allSharedPreferences()).thenReturn(allSharedPreferences); + + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); + Mockito.doReturn(new RegisterQueryProvider()).when(ancLibrary).getRegisterQueryProvider(); + PowerMockito.mockStatic(PatientRepository.class); + PowerMockito.doNothing().when(PatientRepository.class, "updateContactVisitStartDate", + Mockito.anyString(), Mockito.anyString()); + Event contactVisitEvent = Utils.createContactVisitEvent(new ArrayList<>(), womanDetails, null); + assertNotNull(contactVisitEvent); + assertNotNull(contactVisitEvent.getFormSubmissionId()); + assertEquals(womanDetails.get(DBConstantsUtils.KeyUtils.BASE_ENTITY_ID), contactVisitEvent.getBaseEntityId()); + assertEquals(ConstantsUtils.EventTypeUtils.CONTACT_VISIT, contactVisitEvent.getEventType()); + assertFalse(contactVisitEvent.getDetails().isEmpty()); + assertEquals("Contact 2", contactVisitEvent.getDetails().get(ConstantsUtils.CONTACT)); + } + + @Test + @PrepareForTest(PatientRepository.class) + public void testCreatePreviousVisitFromGroupShouldPassCorrectArgs() throws Exception { + String baseEntityId = "089sd-342"; + String previous_visits_map = "{\"269b6b6d1ece4781b58bf91eb05a740e\":{\"visit_date\":\"26-10-2019\"},\"1cd33bfbf4594e619841472933e34c3f\":{\"visit_date\":\"26-02-2020\"}}"; + + ReflectionHelpers.setStaticField(CoreLibrary.class, "instance", coreLibrary); + Mockito.when(coreLibrary.context()).thenReturn(opensrpContext); + Mockito.when(opensrpContext.allSharedPreferences()).thenReturn(allSharedPreferences); + Date date = new Date(); + Mockito.when(allSharedPreferences.fetchLastUpdatedAtDate(0)).thenReturn(date.getTime()); + + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", ancLibrary); + Mockito.doReturn(new RegisterQueryProvider()).when(ancLibrary).getRegisterQueryProvider(); + + ECSyncHelper ecSyncHelper = Mockito.mock(ECSyncHelper.class); + Mockito.doNothing().when(ecSyncHelper).addEvent(Mockito.anyString(), Mockito.any(JSONObject.class)); + + ClientProcessorForJava clientProcessorForJava = Mockito.mock(ClientProcessorForJava.class); + Mockito.when(ancLibrary.getClientProcessorForJava()).thenReturn(clientProcessorForJava); + + Mockito.doReturn(ecSyncHelper).when(ancLibrary).getEcSyncHelper(); + PowerMockito.mockStatic(PatientRepository.class); + PowerMockito.doNothing().when(PatientRepository.class, "updateContactVisitStartDate", + Mockito.anyString(), Mockito.anyString()); + Utils.createPreviousVisitFromGroup(previous_visits_map, baseEntityId); + + ArgumentCaptor> listArgumentCaptor = ArgumentCaptor.forClass(List.class); + Mockito.verify(ecSyncHelper, Mockito.times(1)).getEvents(listArgumentCaptor.capture()); + assertNotNull(listArgumentCaptor.getValue()); + assertEquals(2, listArgumentCaptor.getValue().size()); + + Mockito.verify(clientProcessorForJava, Mockito.times(1)).processClient(Mockito.anyList()); + Mockito.verify(allSharedPreferences).saveLastUpdatedAtDate(Mockito.eq(date.getTime())); + + } + + @After + public void teardown() { + ReflectionHelpers.setStaticField(AncLibrary.class, "instance", null); + } } diff --git a/reference-app/build.gradle b/reference-app/build.gradle index cadd0a7aa..67744a854 100644 --- a/reference-app/build.gradle +++ b/reference-app/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.3' classpath 'com.google.gms:google-services:4.3.3' } @@ -73,7 +73,7 @@ android { buildConfigField "long", "BUILD_TIMESTAMP", System.currentTimeMillis() + "L" buildConfigField "boolean", "IS_SYNC_SETTINGS", "true" buildConfigField "long", "EVENT_VERSION", System.currentTimeMillis() + "L" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' multiDexEnabled true if (properties != null && properties.containsKey("store.file") && properties.containsKey("store.password") && properties.containsKey("key.password")) { @@ -82,6 +82,7 @@ android { javaCompileOptions { annotationProcessorOptions { + includeCompileClasspath = true arguments = [eventBusIndex: 'org.smartregister.anc.ANCEventBusIndex'] } } @@ -130,7 +131,7 @@ android { } debug { - resValue "string", 'opensrp_url', '"https://anc-stage.smartregister.org/opensrp/"' + resValue "string", 'opensrp_url', '"https://jembi-staging.smartregister.org/opensrp/"' buildConfigField "int", "OPENMRS_UNIQUE_ID_INITIAL_BATCH_SIZE", '250' buildConfigField "int", "OPENMRS_UNIQUE_ID_BATCH_SIZE", '100' buildConfigField "int", "OPENMRS_UNIQUE_ID_SOURCE", '2' @@ -148,31 +149,8 @@ android { } packagingOptions { - exclude 'META-INF/DEPENDENCIES.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/notice.txt' - exclude 'META-INF/license.txt' - exclude 'META-INF/dependencies.txt' - exclude 'META-INF/LGPL2.1' - exclude 'LICENSE.txt' - - } - packagingOptions { - exclude 'META-INF/DEPENDENCIES.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/notice.txt' - exclude 'META-INF/license.txt' - exclude 'META-INF/dependencies.txt' - exclude 'META-INF/LGPL2.1' - exclude 'LICENSE.txt' + exclude 'META-INF/LICENSE.md' + exclude 'META-INF/NOTICE.md' } testOptions { @@ -221,18 +199,8 @@ tasks.withType(Test) { dependencies { def powerMockVersion = '2.0.4' implementation project(":opensrp-anc") - implementation('org.smartregister:opensrp-client-native-form:1.7.28-SNAPSHOT@aar') { - transitive = true - exclude group: 'com.android.support', module: 'recyclerview-v7' - exclude group: 'com.android.support', module: 'appcompat-v7' - exclude group: 'com.android.support', module: 'cardview-v7' - exclude group: 'com.android.support', module: 'support-media-compat' - exclude group: 'com.android.support', module: 'support-v4' - exclude group: 'com.android.support', module: 'design' - exclude group: 'org.yaml', module: 'snakeyaml' - exclude group: 'io.ona.rdt-capture', module: 'lib' - } - implementation('org.smartregister:opensrp-client-core:1.9.4-SNAPSHOT@aar') { + + implementation('org.smartregister:opensrp-client-core:1.12.0-SNAPSHOT@aar') { transitive = true exclude group: 'com.github.bmelnychuk', module: 'atv' exclude group: 'com.google.guava', module: 'guava' @@ -267,14 +235,14 @@ dependencies { implementation 'com.evernote:android-job:1.2.6' implementation 'com.github.lecho:hellocharts-android:v1.5.8' implementation 'id.zelory:compressor:2.1.0' - implementation('com.android.support:design:28.0.0') { + implementation('com.google.android.material:material:1.0.0') { exclude group: 'com.android.support', module: 'recyclerview-v7' exclude group: 'com.android.support', module: 'cardview-v7' } - implementation 'com.android.support:recyclerview-v7:28.0.0' - implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.cardview:cardview:1.0.0' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation group: 'org.yaml', name: 'snakeyaml', version: '1.25' implementation 'de.hdodenhof:circleimageview:3.0.1' implementation 'org.jeasy:easy-rules-core:3.3.0' @@ -291,7 +259,7 @@ dependencies { transitive = true } implementation 'com.flurry.android:analytics:11.6.0@aar' - implementation 'com.android.support:multidex:1.0.3' + implementation 'androidx.multidex:multidex:2.0.0' testImplementation 'junit:junit:4.12' testImplementation 'org.apache.maven:maven-ant-tasks:2.1.3' @@ -311,6 +279,7 @@ dependencies { } task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) { + reports { xml.enabled = true html.enabled = true @@ -320,12 +289,12 @@ task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'crea getReports().getHtml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/html")) def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*', '**/*$ViewBinder*.*'] - def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes/", excludes: fileFilter) + def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes", excludes: fileFilter) def mainSrc = "$project.projectDir/src/main/java" - sourceDirectories = files([mainSrc]) - classDirectories = files([debugTree]) - executionData = fileTree(dir: project.buildDir, includes: [ + sourceDirectories.setFrom(files([mainSrc])) + classDirectories.setFrom(([debugTree])) + executionData.setFrom(fileTree(dir: project.buildDir, includes: [ 'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec' - ]) -} \ No newline at end of file + ])) +} diff --git a/reference-app/src/main/AndroidManifest.xml b/reference-app/src/main/AndroidManifest.xml index d49ab07b6..e5a15016e 100644 --- a/reference-app/src/main/AndroidManifest.xml +++ b/reference-app/src/main/AndroidManifest.xml @@ -124,7 +124,7 @@ android:screenOrientation="portrait" /> diff --git a/reference-app/src/main/assets/app.properties b/reference-app/src/main/assets/app.properties index 90b69b65a..906e7afbc 100644 --- a/reference-app/src/main/assets/app.properties +++ b/reference-app/src/main/assets/app.properties @@ -2,4 +2,5 @@ DRISHTI_BASE_URL= PORT=-1 SHOULD_VERIFY_CERTIFICATE=false SYNC_DOWNLOAD_BATCH_SIZE=100 -CAN_SAVE_INITIAL_SITE_SETTING=false \ No newline at end of file +CAN_SAVE_INITIAL_SITE_SETTING=false +MAX_CONTACT_SCHEDULE_DISPLAYED=5 \ No newline at end of file diff --git a/reference-app/src/main/java/org/smartregister/anc/application/AncApplication.java b/reference-app/src/main/java/org/smartregister/anc/application/AncApplication.java index b1115c993..074dc6857 100644 --- a/reference-app/src/main/java/org/smartregister/anc/application/AncApplication.java +++ b/reference-app/src/main/java/org/smartregister/anc/application/AncApplication.java @@ -1,7 +1,7 @@ package org.smartregister.anc.application; import android.content.Intent; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import com.crashlytics.android.Crashlytics; @@ -154,13 +154,13 @@ public Repository getRepository() { return repository; } - public String getPassword() { - if (password == null) { - String username = getContext().userService().getAllSharedPreferences().fetchRegisteredANM(); - password = getContext().userService().getGroupId(username); - } - return password; - } +// public String getPassword() { +// if (password == null) { +// String username = getContext().userService().getAllSharedPreferences().fetchRegisteredANM(); +// password = getContext().userService().getGroupId(username); +// } +// return password; +// } @NonNull @Override @@ -192,15 +192,16 @@ protected void cleanUpSyncState() { @Override public void onTimeChanged() { Utils.showToast(this, this.getString(org.smartregister.anc.library.R.string.device_time_changed)); - context.userService().forceRemoteLogin(); + String username = getContext().userService().getAllSharedPreferences().fetchRegisteredANM(); + context.userService().forceRemoteLogin(username); logoutCurrentUser(); } @Override public void onTimeZoneChanged() { Utils.showToast(this, this.getString(org.smartregister.anc.library.R.string.device_timezone_changed)); - context.userService().forceRemoteLogin(); - + String username = getContext().userService().getAllSharedPreferences().fetchRegisteredANM(); + context.userService().forceRemoteLogin(username); logoutCurrentUser(); } diff --git a/reference-app/src/main/java/org/smartregister/anc/application/AncSyncConfiguration.java b/reference-app/src/main/java/org/smartregister/anc/application/AncSyncConfiguration.java index d23dfc983..a95488cbf 100644 --- a/reference-app/src/main/java/org/smartregister/anc/application/AncSyncConfiguration.java +++ b/reference-app/src/main/java/org/smartregister/anc/application/AncSyncConfiguration.java @@ -3,8 +3,10 @@ import org.smartregister.SyncConfiguration; import org.smartregister.SyncFilter; import org.smartregister.anc.BuildConfig; +import org.smartregister.anc.activity.LoginActivity; import org.smartregister.anc.library.AncLibrary; import org.smartregister.repository.AllSharedPreferences; +import org.smartregister.view.activity.BaseLoginActivity; import java.util.List; @@ -68,4 +70,19 @@ public List getSynchronizedLocationTags() { public String getTopAllowedLocationLevel() { return null; } + + @Override + public String getOauthClientId() { + return "opensrp-trusted-client"; + } + + @Override + public String getOauthClientSecret() { + return "O@aTHS#cr3t"; + } + + @Override + public Class getAuthenticationActivity() { + return LoginActivity.class; + } } diff --git a/reference-app/src/main/java/org/smartregister/anc/job/AncJobCreator.java b/reference-app/src/main/java/org/smartregister/anc/job/AncJobCreator.java index 426413df3..a4c54ef54 100644 --- a/reference-app/src/main/java/org/smartregister/anc/job/AncJobCreator.java +++ b/reference-app/src/main/java/org/smartregister/anc/job/AncJobCreator.java @@ -1,7 +1,7 @@ package org.smartregister.anc.job; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.evernote.android.job.Job; import com.evernote.android.job.JobCreator; diff --git a/reference-app/src/main/java/org/smartregister/anc/job/ViewConfigurationsServiceJob.java b/reference-app/src/main/java/org/smartregister/anc/job/ViewConfigurationsServiceJob.java index 6d315442e..536c1c2f9 100644 --- a/reference-app/src/main/java/org/smartregister/anc/job/ViewConfigurationsServiceJob.java +++ b/reference-app/src/main/java/org/smartregister/anc/job/ViewConfigurationsServiceJob.java @@ -1,7 +1,7 @@ package org.smartregister.anc.job; import android.content.Intent; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.smartregister.anc.library.util.ConstantsUtils; import org.smartregister.configurableviews.service.PullConfigurableViewsIntentService; diff --git a/reference-app/src/main/res/xml/authenticator.xml b/reference-app/src/main/res/xml/authenticator.xml new file mode 100644 index 000000000..93cace321 --- /dev/null +++ b/reference-app/src/main/res/xml/authenticator.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/reference-app/src/test/java/org/smartregister/anc/presenter/LoginPresenterTest.java b/reference-app/src/test/java/org/smartregister/anc/presenter/LoginPresenterTest.java index c04cc57d8..91e59294f 100644 --- a/reference-app/src/test/java/org/smartregister/anc/presenter/LoginPresenterTest.java +++ b/reference-app/src/test/java/org/smartregister/anc/presenter/LoginPresenterTest.java @@ -19,11 +19,8 @@ import org.robolectric.RuntimeEnvironment; import org.smartregister.anc.BaseUnitTest; import org.smartregister.anc.library.R; -import org.smartregister.login.model.BaseLoginModel; import org.smartregister.view.contract.BaseLoginContract; -import java.lang.ref.WeakReference; - /** * Created by ndegwamartin on 27/06/2018. @@ -79,71 +76,6 @@ public void testOnDestroyShouldCallInteractorOnDestroyWithCorrectParameter() { Mockito.verify(interactor).onDestroy(false); } - @Test - public void testAttemptLoginShouldValidateCredentialsCorrectly() { - - LoginPresenter presenter = new LoginPresenter(view); - presenter.setLoginModel(model);//set mocked model - presenter.setLoginInteractor(interactor); //set mocked interactor - - Mockito.doReturn(false).when(model).isEmptyUsername(ArgumentMatchers.anyString()); - Mockito.doReturn(true).when(model).isPasswordValid(ArgumentMatchers.anyString()); - presenter.attemptLogin(DUMMY_USERNAME, DUMMY_PASSWORD); - Mockito.verify(view).resetPaswordError(); - Mockito.verify(view).resetUsernameError(); - Mockito.verify(model).isEmptyUsername(DUMMY_USERNAME); - Mockito.verify(model).isPasswordValid(DUMMY_PASSWORD); - Mockito.verify(interactor).login(ArgumentMatchers.any(WeakReference.class), ArgumentMatchers.eq(DUMMY_USERNAME), ArgumentMatchers.eq - (DUMMY_PASSWORD)); - - } - - @Test - public void testAttemptLoginShouldCallLoginMethodWithCorrectParametersWhenValidationPasses() { - - LoginPresenter presenter = new LoginPresenter(view); - presenter.setLoginModel(model);//set mocked model - presenter.setLoginInteractor(interactor); //set mocked interactor - - Mockito.doReturn(false).when(model).isEmptyUsername(ArgumentMatchers.anyString()); - Mockito.doReturn(true).when(model).isPasswordValid(ArgumentMatchers.anyString()); - presenter.attemptLogin(DUMMY_USERNAME, DUMMY_PASSWORD); - Mockito.verify(interactor).login(ArgumentMatchers.any(WeakReference.class), ArgumentMatchers.eq(DUMMY_USERNAME), ArgumentMatchers.eq - (DUMMY_PASSWORD)); - - } - - @Test - public void testAttemptLoginShouldNotCallLoginMethodWithCorrectParametersWhenValidationFails() { - LoginPresenter presenter = new LoginPresenter(view); - presenter.setLoginModel(new BaseLoginModel());//create real model - presenter.setLoginInteractor(interactor); //set mocked interactor - - presenter.attemptLogin(null, DUMMY_PASSWORD); - String NULL_USERNAME = null; - Mockito.verify(view).setUsernameError(R.string.error_field_required); - Mockito.verify(view).enableLoginButton(true); - Mockito.verify(interactor, Mockito.times(0)).login(ArgumentMatchers.any(WeakReference.class), ArgumentMatchers.eq(NULL_USERNAME), - ArgumentMatchers.eq(DUMMY_PASSWORD)); - - - } - - @Test - public void testAttemptLoginShouldNotCallLoginMethodWhenValidationFails() { - - LoginPresenter presenter = new LoginPresenter(view); - presenter.setLoginModel(model);//set mocked model - presenter.setLoginInteractor(interactor); //set mocked interactor - - Mockito.doReturn(false).when(model).isPasswordValid(ArgumentMatchers.anyString()); - - presenter.attemptLogin(DUMMY_USERNAME, DUMMY_PASSWORD); - - Mockito.verify(interactor, Mockito.times(0)).login(ArgumentMatchers.any(WeakReference.class), ArgumentMatchers.eq(DUMMY_USERNAME), - ArgumentMatchers.eq(DUMMY_PASSWORD)); - - } @Test public void testCanvasGlobalLayoutListenerShouldInvokeCorrectProcessLayoutOperations() { diff --git a/sample/build.gradle b/sample/build.gradle index ce84a2c97..03145647b 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -15,7 +15,7 @@ android { versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } @@ -31,9 +31,9 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' } diff --git a/sample/src/main/java/org/smartregister/sample/anc/MainActivity.java b/sample/src/main/java/org/smartregister/sample/anc/MainActivity.java index 2efb3f8fa..587accc92 100644 --- a/sample/src/main/java/org/smartregister/sample/anc/MainActivity.java +++ b/sample/src/main/java/org/smartregister/sample/anc/MainActivity.java @@ -1,7 +1,7 @@ package org.smartregister.sample.anc; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index 84f19512d..4fc244418 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file