diff --git a/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireFragment.kt b/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireFragment.kt index 9e111cbd34..81c95552f9 100644 --- a/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireFragment.kt +++ b/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireFragment.kt @@ -19,17 +19,22 @@ package com.google.android.fhir.catalog import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import androidx.fragment.app.add import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import com.google.android.fhir.catalog.QuestionnaireContainerFragment.Companion.QUESTIONNAIRE_FRAGMENT_TAG import com.google.android.fhir.datacapture.QuestionnaireFragment import kotlinx.coroutines.launch @@ -66,10 +71,20 @@ class DemoQuestionnaireFragment : Fragment() { NavHostFragment.findNavController(this).navigateUp() true } + // TODO https://github.com/google/android-fhir/issues/1088 + R.id.submit_questionnaire -> { + onSubmitQuestionnaireClick() + true + } else -> super.onOptionsItemSelected(item) } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.menu, menu) + } + private fun setUpActionBar() { (requireActivity() as AppCompatActivity).supportActionBar?.apply { setDisplayHomeAsUpEnabled(true) @@ -87,13 +102,21 @@ class DemoQuestionnaireFragment : Fragment() { } private fun addQuestionnaireFragment() { - val fragment = QuestionnaireFragment() viewLifecycleOwner.lifecycleScope.launch { - fragment.arguments = - bundleOf( - QuestionnaireFragment.EXTRA_QUESTIONNAIRE_JSON_STRING to viewModel.getQuestionnaireJson() - ) - childFragmentManager.commit { add(R.id.container, fragment, QUESTIONNAIRE_FRAGMENT_TAG) } + if (childFragmentManager.findFragmentByTag(QUESTIONNAIRE_FRAGMENT_TAG) == null) { + childFragmentManager.commit { + setReorderingAllowed(true) + add( + R.id.container, + tag = QUESTIONNAIRE_FRAGMENT_TAG, + args = + bundleOf( + QuestionnaireFragment.EXTRA_QUESTIONNAIRE_JSON_STRING to + viewModel.getQuestionnaireJson() + ) + ) + } + } } } @@ -104,6 +127,26 @@ class DemoQuestionnaireFragment : Fragment() { } } + private fun onSubmitQuestionnaireClick() { + // TODO https://github.com/google/android-fhir/issues/1088 + val questionnaireFragment = + childFragmentManager.findFragmentByTag( + QuestionnaireContainerFragment.QUESTIONNAIRE_FRAGMENT_TAG + ) as + QuestionnaireFragment + launchQuestionnaireResponseFragment( + viewModel.getQuestionnaireResponseJson(questionnaireFragment.getQuestionnaireResponse()) + ) + } + + private fun launchQuestionnaireResponseFragment(response: String) { + findNavController() + .navigate( + DemoQuestionnaireFragmentDirections + .actionGalleryQuestionnaireFragmentToQuestionnaireResponseFragment(response) + ) + } + companion object { const val QUESTIONNAIRE_FRAGMENT_TAG = "questionnaire-fragment-tag" } diff --git a/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireViewModel.kt b/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireViewModel.kt index cf34b40759..9adbf15e26 100644 --- a/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireViewModel.kt +++ b/catalog/src/main/java/com/google/android/fhir/catalog/DemoQuestionnaireViewModel.kt @@ -20,13 +20,19 @@ import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.context.FhirVersionEnum import kotlinx.coroutines.withContext +import org.hl7.fhir.r4.model.QuestionnaireResponse class DemoQuestionnaireViewModel(application: Application, private val state: SavedStateHandle) : AndroidViewModel(application) { private val backgroundContext = viewModelScope.coroutineContext private var questionnaireJson: String? = null + fun getQuestionnaireResponseJson(response: QuestionnaireResponse) = + FhirContext.forCached(FhirVersionEnum.R4).newJsonParser().encodeResourceToString(response) + suspend fun getQuestionnaireJson(): String { return withContext(backgroundContext) { if (questionnaireJson == null) { diff --git a/catalog/src/main/java/com/google/android/fhir/catalog/QuestionnaireResponseFragment.kt b/catalog/src/main/java/com/google/android/fhir/catalog/QuestionnaireResponseFragment.kt new file mode 100644 index 0000000000..025c485824 --- /dev/null +++ b/catalog/src/main/java/com/google/android/fhir/catalog/QuestionnaireResponseFragment.kt @@ -0,0 +1,82 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.fhir.catalog + +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.navArgs +import org.json.JSONObject + +class QuestionnaireResponseFragment : Fragment() { + private val args: QuestionnaireResponseFragmentArgs by navArgs() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_questionnaire_response, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setCloseOnClickListener() + view.findViewById(R.id.questionnaire_response_tv).text = + JSONObject(args.questionnaireResponse).toString(2) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + android.R.id.home -> { + NavHostFragment.findNavController(this).navigateUp() + true + } + else -> super.onOptionsItemSelected(item) + } + } + + override fun onResume() { + super.onResume() + setUpActionBar() + } + + private fun setUpActionBar() { + (requireActivity() as AppCompatActivity).supportActionBar?.apply { + setDisplayHomeAsUpEnabled(true) + } + (requireActivity() as MainActivity).setActionBar( + getString(R.string.questionnaire_response_title), + Gravity.START + ) + setHasOptionsMenu(true) + } + + private fun setCloseOnClickListener() { + view?.findViewById