From a3bea5f5c9f1266432cc35cf4faeeacc3d31095b Mon Sep 17 00:00:00 2001 From: Elly Kitoto Date: Thu, 13 Jul 2023 11:55:55 +0300 Subject: [PATCH 01/27] Implement QuestionnaireFragment and ViewModel Signed-off-by: Elly Kitoto --- android/engine/build.gradle.kts | 1 + .../configuration/QuestionnaireConfig.kt | 10 +- .../fhircore/engine/ui/base/AlertDialogue.kt | 49 ++---- .../ui/base/BaseMultiLanguageActivity.kt | 7 - .../engine/util/SharedPreferenceKey.kt | 2 - .../res/layout/activity_questionnaire.xml | 20 +-- .../layout/questionnaire_fragment_layout.xml | 25 +++ android/engine/src/main/res/values/styles.xml | 9 +- .../engine/ui/base/AlertDialogueTest.kt | 4 +- android/geowidget/build.gradle.kts | 1 + .../FhirEngineCreateUpdateMethodCallRule.kt | 3 +- android/quest/build.gradle.kts | 1 + android/quest/src/main/AndroidManifest.xml | 1 + .../quest/navigation/MainNavigationScreen.kt | 2 + .../quest/navigation/NavigationArg.kt | 1 + .../ui/questionnaire/QuestionnaireFragment.kt | 155 ++++++++++++++++++ .../QuestionnaireFragmentViewModel.kt | 55 +++++++ .../questionnaire/QuestionnaireViewModel.kt | 12 +- .../quest/util/extensions/ConfigExtensions.kt | 9 +- .../src/main/res/drawable/ic_arrow_back.xml | 10 ++ .../res/navigation/application_nav_graph.xml | 9 + .../src/main/res/values-night/themes.xml | 18 +- android/quest/src/main/res/values/themes.xml | 17 +- 23 files changed, 320 insertions(+), 101 deletions(-) create mode 100644 android/engine/src/main/res/layout/questionnaire_fragment_layout.xml create mode 100644 android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireFragment.kt create mode 100644 android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireFragmentViewModel.kt create mode 100644 android/quest/src/main/res/drawable/ic_arrow_back.xml diff --git a/android/engine/build.gradle.kts b/android/engine/build.gradle.kts index bebc20a748..06cc907789 100644 --- a/android/engine/build.gradle.kts +++ b/android/engine/build.gradle.kts @@ -46,6 +46,7 @@ android { buildFeatures { compose = true viewBinding = true + dataBinding = true } composeOptions { kotlinCompilerExtensionVersion = "1.3.0" } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt index c85fa828e0..6db969572c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt @@ -35,9 +35,6 @@ data class QuestionnaireConfig( val id: String, val title: String? = null, val saveButtonText: String? = null, - val setPractitionerDetails: Boolean = true, - val setOrganizationDetails: Boolean = true, - val setAppVersion: Boolean = true, val planDefinitions: List? = null, var type: QuestionnaireType = QuestionnaireType.DEFAULT, val resourceIdentifier: String? = null, @@ -52,6 +49,13 @@ data class QuestionnaireConfig( val configRules: List? = null, val extraParams: List? = null, val onSubmitActions: List? = null, + val questionnaireSubjects: List = + listOf( + ResourceType.Patient, + ResourceType.Group, + ResourceType.Practitioner, + ResourceType.Location, + ), ) : java.io.Serializable, Parcelable { fun interpolate(computedValuesMap: Map) = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt index ba84f3c3a9..854a861a00 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt @@ -16,11 +16,12 @@ package org.smartregister.fhircore.engine.ui.base -import android.app.Activity import android.app.AlertDialog import android.app.DatePickerDialog +import android.content.Context import android.content.DialogInterface import android.content.res.Resources +import android.view.LayoutInflater import android.view.View import android.widget.TextView import androidx.annotation.StringRes @@ -29,6 +30,7 @@ import androidx.core.view.setPadding import java.util.Calendar import java.util.Date import org.smartregister.fhircore.engine.R +import org.smartregister.fhircore.engine.util.extension.getActivity import org.smartregister.fhircore.engine.util.extension.hide import org.smartregister.fhircore.engine.util.extension.show @@ -44,20 +46,8 @@ data class AlertDialogListItem(val key: String, val value: String) object AlertDialogue { private val ITEMS_LIST_KEY = "alert_dialog_items_list" - fun AlertDialog.getSingleChoiceSelectedKey() = getSingleChoiceSelectedItem()?.key - - private fun AlertDialog.getSingleChoiceSelectedItem() = - if (this.listView.checkedItemCount != 1) { - null - } else { - getListItems()!![this.listView.checkedItemPosition] - } - - private fun AlertDialog.getListItems() = - this.ownerActivity?.intent?.getSerializableExtra(ITEMS_LIST_KEY) as Array? - fun showAlert( - context: Activity, + context: Context, alertIntent: AlertIntent, message: CharSequence, title: String? = null, @@ -71,7 +61,7 @@ object AlertDialogue { val dialog = AlertDialog.Builder(context, R.style.AlertDialogTheme) .apply { - val view = context.layoutInflater.inflate(R.layout.alert_dialog, null) + val view = LayoutInflater.from(context).inflate(R.layout.alert_dialog, null) setView(view) title?.let { setTitle(it) } setCancelable(cancellable) @@ -97,15 +87,17 @@ object AlertDialogue { dialog.findViewById(R.id.tv_alert_message)?.apply { this.text = message } options?.let { - context.intent.putExtra(ITEMS_LIST_KEY, it) - dialog.setOwnerActivity(context) + context.getActivity()?.run { + intent?.putExtra(ITEMS_LIST_KEY, it) + dialog.setOwnerActivity(this) + } } return dialog } fun showInfoAlert( - context: Activity, + context: Context, message: String, title: String? = null, confirmButtonListener: ((d: DialogInterface) -> Unit) = { d -> d.dismiss() }, @@ -121,7 +113,7 @@ object AlertDialogue { ) } - fun showErrorAlert(context: Activity, message: String, title: String? = null): AlertDialog { + fun showErrorAlert(context: Context, message: String, title: String? = null): AlertDialog { return showAlert( context = context, alertIntent = AlertIntent.ERROR, @@ -133,7 +125,7 @@ object AlertDialogue { } fun showErrorAlert( - context: Activity, + context: Context, @StringRes message: Int, @StringRes title: Int? = null, ): AlertDialog { @@ -144,12 +136,12 @@ object AlertDialogue { ) } - fun showProgressAlert(context: Activity, @StringRes message: Int): AlertDialog { + fun showProgressAlert(context: Context, @StringRes message: Int): AlertDialog { return showAlert(context, AlertIntent.PROGRESS, context.getString(message)) } fun showConfirmAlert( - context: Activity, + context: Context, @StringRes message: Int, @StringRes title: Int? = null, confirmButtonListener: ((d: DialogInterface) -> Unit), @@ -171,7 +163,7 @@ object AlertDialogue { } fun showCancelAlert( - context: Activity, + context: Context, @StringRes message: Int, @StringRes title: Int? = null, confirmButtonListener: ((d: DialogInterface) -> Unit), @@ -196,11 +188,10 @@ object AlertDialogue { } fun showDatePickerAlert( - context: Activity, - confirmButtonListener: ((d: Date) -> Unit), + context: Context, + confirmButtonListener: (d: Date) -> Unit, confirmButtonText: String, max: Date?, - default: Date = Date(), title: String?, dangerActionColor: Boolean = true, ): DatePickerDialog { @@ -229,18 +220,14 @@ object AlertDialogue { } confirmButtonListener.invoke(date.time) } - } - - dateDialog.create() + }.create() if (dangerActionColor) { dateDialog .getButton(DialogInterface.BUTTON_POSITIVE) .setTextColor(context.resources.getColor(R.color.colorError)) } - dateDialog.show() - return dateDialog } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt index fd5a9d97be..f5b9f6a7d2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt @@ -33,13 +33,6 @@ abstract class BaseMultiLanguageActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { inject() super.onCreate(savedInstanceState) - val themePref = - sharedPreferencesHelper.read(key = SharedPreferenceKey.THEME.name, defaultValue = "")!! - - if (themePref.isNotEmpty()) { - val resourceId = this.resources.getIdentifier(themePref, "style", packageName) - if (resourceId != 0) theme.applyStyle(resourceId, true) - } } override fun attachBaseContext(baseContext: Context) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt index d58b335a0d..21e528f5f9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt @@ -23,9 +23,7 @@ enum class SharedPreferenceKey { PRACTITIONER_ID, PRACTITIONER_DETAILS, PRACTITIONER_LOCATION_HIERARCHIES, - THEME, REMOTE_SYNC_RESOURCES, - OVERDUE_TASK_LAST_AUTHORED_ON_DATE, LOGIN_CREDENTIAL_KEY, LOGIN_PIN_KEY, LOGIN_PIN_SALT, diff --git a/android/engine/src/main/res/layout/activity_questionnaire.xml b/android/engine/src/main/res/layout/activity_questionnaire.xml index fbc919c3b0..11a1252b45 100644 --- a/android/engine/src/main/res/layout/activity_questionnaire.xml +++ b/android/engine/src/main/res/layout/activity_questionnaire.xml @@ -17,25 +17,24 @@ + app:layout_constraintBottom_toTopOf="@id/btn_edit_qr" + app:layout_constraintTop_toTopOf="parent" />