Skip to main content
Version: Next

Android

Library that implements questionnaire flow

Getting Started

  1. Register activity result launcher:
 private val questionnaireLauncher = QuestionnaireActivity.registerForResult(this) { 
it.ifOk { questionnaireViewData -> }
it.ifError { errorCode -> }
}
  1. Start questionnaire activity:
questionnaireLauncher.launch(QuestionnaireActivity.getLauncherIntent(
context = this,
getQuestionnaireParams = GetQuestionnaireParams.QuestionnaireId("id"), // will use QuestionnaireSourceRepository
// or GetQuestionnaireParams.QuestionnaireForm(TestForm.get()),
title = "Title",
useBackButton = true,
welcomeBundle = WelcomeBundle(
R.drawable.ic_baseline_image_24,
R.string.welcome_to_huma,
R.string.common_action_next,
R.string.welcome_to_huma,
true,
WelcomeBundle.BackNavigation.DeviceBackButton
)
))

Customization

  • QuestionnaireSourceRepository - questionnaire source provider, returns proper ItemSource. To add:
HumaQuestionnaireManager.getInstance().addQuestionnaireSource(questionnaireId: String, source: ItemSource)
  • RegisterQuestionParams - used to extend questionnaires with custom questions
data class RegisterQuestionParams(
val questionType: QuestionType, // defines question type
val identifyViewDataDelegate: (QuestionnaireStepViewData) -> Boolean, // determines whether view data belongs is of this question type
val createViewHolderDelegate: CreateViewHolderDelegate, // used to create a view holder
val pageToViewDataConverter: (
FormPage, FormPageToQuestionnaireStepViewDataConverter.LoopFormData?
) -> QuestionnaireStepViewData // converts FormPage to QuestionnaireStepViewData
)

typealias CreateViewHolderDelegate = (
parent: ViewGroup,
editQuestionListener: (question: QuestionViewData<*>) -> Unit,
answerChangeListener: () -> Unit,
launchFlowListener: (LaunchFlowParams) -> Unit,
orientation: Int
) -> QuestionViewHolder
  • CommonValidator - defines default questions validation, which is used unless custom AnswerValidation is provided (such as validating lowerBound, upperBound in NumberQuestionViewData:

fun isValid(question: QuestionViewData<*>): Boolean

Preferred units

You can declare a question answer converter which will transform it into a proper QuestionAnswerViewData for a default measurement unit, see:

HumaQuestionnaireManager.getInstance().setQuestionAnswerConverter(/*..*/)`

Preferred unit page builder extension function sample:

fun Pages.height(
preferredUnitsContainer: PreferredUnitsContainer,
pageId: String,
titleStringResId: Int = R.string.onboarding_questionnaire_height,
minHeightInCm: Int = MIN_HEIGHT_CM,
maxHeightInCm: Int = MAX_HEIGHT_CM
) {
val manager = HumaQuestionnaireManager.getInstance()
val unitType = HeightMeasurementUnitType()
val defaultUnit = unitType.getDefaultUnit()
when (val unit = preferredUnitsContainer.getPreferredUnit(unitType)) {
HeightMeasurementUnit.Cm -> {
numeric { /*..*/ }
manager.setQuestionAnswerConverter(pageId) { answerViewData ->
answerViewData as NumberQuestionAnswerViewData
val convertedValue = unitType.convert(answerViewData.value, from = unit, to = defaultUnit)
NumberQuestionAnswerViewData(convertedValue)
}
}
HeightMeasurementUnit.FtIn -> {
twoPickerChoice { /*..*/ }
manager.setQuestionAnswerConverter(pageId) { answerViewData ->
answerViewData as TwoPickerSelectionQuestionAnswerViewData
val feet = FtAndInches.fromPair(answerViewData.value).toFeet()
val convertedValue = unitType.convert(feet, from = unit, to = defaultUnit)
NumberQuestionAnswerViewData(convertedValue)
}
}
}
}