Commit b087f1c8 authored by Harri Kirik's avatar Harri Kirik
Browse files

Merge branch 'feature/COVAPP-462-cross-country-strings' into 'develop'

Update cross-country strings

See merge request hoia/dp3t-app-android!135
parents a39d9b47 b7b235f6
......@@ -175,6 +175,7 @@ class DebugMenuFragment : MvvmFragment(), ViewBindingHolder<FragmentDebugBinding
buttonDebugStateContactNotification.setOnClickListener { notifier.createNewContactNotification(requireActivity(), -1) }
buttonDebugStatePreShareScreen.setOnClickListener { setupAndNavigateToPreShareScreen() }
buttonDebugStateShareScreenError.setOnClickListener { showShareDeniedErrorDialog() }
buttonDebugStateShareScreenSuccess.setOnClickListener { showShareSuccessScreen() }
buttonDebugStateOpenSettingsAndScrollToCrossCountry.setOnClickListener { openSettingsAndScrollToCrossCountry() }
buttonDebugStateCrossCountryPopUp.setOnClickListener { openCrossCountryPopUp() }
}
......@@ -282,6 +283,11 @@ class DebugMenuFragment : MvvmFragment(), ViewBindingHolder<FragmentDebugBinding
findNavController().navigate(DebugMenuFragmentDirections.crossCountryPopUp())
}
private fun showShareSuccessScreen() {
// Navigate
findNavController().navigate(DebugMenuFragmentDirections.confirmInfectionResult(PatientPortalResult.DebugJustDone))
}
companion object {
private const val TAG_DIALOG_ERROR = "DebugFragment.TAG_DIALOG_ERROR"
private const val TAG_DIALOG_SHARE_ERROR = "DebugFragment.TAG_DIALOG_SHARE_ERROR"
......
......@@ -30,14 +30,14 @@ object IcefireEnvironment : Environment {
ru = "https://www.hoia.me/ru?source=app"
)
override val contactInfoPageUrl: LocalizedUrl = LocalizedUrl(
et = "https://www.hoia.me/contact?source=app",
en = "https://www.hoia.me/en/contact?source=app",
ru = "https://www.hoia.me/ru/contact?source=app"
et = "https://www.hoia.me/close-contact?source=app",
en = "https://www.hoia.me/en/close-contact?source=app",
ru = "https://www.hoia.me/ru/close-contact?source=app"
)
override val privacyPolicyUrl: LocalizedUrl = LocalizedUrl(
et = "https://hoia.me/privacy?source=app",
en = "https://hoia.me/en/privacy?source=app",
ru = "https://hoia.me/ru/privacy?source=app"
et = "https://www.hoia.me/privacy?source=app",
en = "https://www.hoia.me/en/privacy?source=app",
ru = "https://www.hoia.me/ru/privacy?source=app"
)
override val covidInstructionsUrl: LocalizedUrl = LocalizedUrl(
et = "https://www.terviseamet.ee/et/patsiendi-koduse-ravi-juhend-covid-19-korral",
......@@ -45,9 +45,14 @@ object IcefireEnvironment : Environment {
ru = "https://www.terviseamet.ee/ru/instrukciya-po-lecheniyu-na-domu-pacienta-s-covid-19"
)
override val healthBoardRecommendationsUrl: LocalizedUrl = LocalizedUrl(
et = "https://www.terviseamet.ee/et/lahikontaktse-juhis",
en = "https://www.terviseamet.ee/et/lahikontaktse-juhis#ENG",
ru = "https://www.terviseamet.ee/et/lahikontaktse-juhis#RUS"
et = "https://www.terviseamet.ee/et/lahikontaktse-juhis#est",
en = "https://www.terviseamet.ee/et/lahikontaktse-juhis#eng",
ru = "https://www.terviseamet.ee/et/lahikontaktse-juhis#rus"
)
override val gotSickAbroadUrl: LocalizedUrl = LocalizedUrl(
et = "https://www.hoia.me/hoia-euroopas?source=app",
en = "https://www.hoia.me/en/hoia-in-europe?source=app",
ru = "https://hoia.me/ru/hoia-v-yevrope?source=app"
)
override val appLogEnabled: Boolean = BuildConfig.DEBUG
override val crashAppOnUndeliverableException: Boolean = BuildConfig.DEBUG
......@@ -55,9 +60,4 @@ object IcefireEnvironment : Environment {
override val allowInfectionConfirmationStartWithoutGAEN: Boolean = BuildConfig.DEBUG
override val federationGatewayUsageForDP3TBackend: FederationGatewayUsageForDP3TBackend = FederationGatewayUsageForDP3TBackend.Enabled
override val federationGatewayUsageForPatientPortal: FederationGatewayUsageForPatientPortal = FederationGatewayUsageForPatientPortal.Enabled
override val gotSickAbroadUrl: LocalizedUrl = LocalizedUrl(
et = "https://www.hoia.me/got-sick-abroad?source=app",
en = "https://www.hoia.me/got-sick-abroad/en?source=app",
ru = "https://www.hoia.me/got-sick-abroad/ru?source=app"
)
}
......@@ -27,6 +27,10 @@ interface Environment {
val covidInstructionsUrl: LocalizedUrl
val healthBoardRecommendationsUrl: LocalizedUrl
val privacyPolicyUrl: LocalizedUrl
/**
* URL to Hoia.me page's got sick abroad information.
*/
val gotSickAbroadUrl: LocalizedUrl
// Is app logging enabled?
val appLogEnabled: Boolean
// Should we display the long version string with backend and SDK info?
......@@ -45,8 +49,4 @@ interface Environment {
* Flag to use when doing PP side infection confirmation. See [FederationGatewayUsageForPatientPortal] for more.
*/
val federationGatewayUsageForPatientPortal: FederationGatewayUsageForPatientPortal
/**
* URL to Hoia.me page's got sick abroad information.
*/
val gotSickAbroadUrl: LocalizedUrl
}
......@@ -69,6 +69,16 @@ fun TextView.addUrlSpans() {
fun TextView.setTextWithClickableSpan(source: String, clickablePart: String, clickListener: () -> Unit) {
val spannable = SpannableString(source)
addClickableSpan(spannable, clickablePart, clickListener)
this.text = spannable
movementMethod = LinkMovementMethod.getInstance()
}
private fun TextView.addClickableSpan(
spannable: SpannableString,
clickablePart: String,
clickListener: () -> Unit
) {
spannable.addSpan(
clickablePart,
object : ClickableSpan() {
......@@ -82,8 +92,6 @@ fun TextView.setTextWithClickableSpan(source: String, clickablePart: String, cli
}
}
)
this.text = spannable
movementMethod = LinkMovementMethod.getInstance()
}
private fun updateDrawStateWithPaint(paint: TextPaint, context: Context) {
......
......@@ -17,6 +17,7 @@ import org.dpppt.android.app.common.util.ViewBindingHolder
import org.dpppt.android.app.common.util.ViewModelFactory
import org.dpppt.android.app.common.util.addUrlSpans
import org.dpppt.android.app.common.util.exhaustive
import org.dpppt.android.app.common.util.setTextWithBoldSpans
import org.dpppt.android.app.common.util.setTextWithClickableSpan
import org.dpppt.android.app.databinding.FragmentContactsBinding
import org.dpppt.android.app.di.Injector
......@@ -64,8 +65,8 @@ class ContactsFragment : MvvmFragment(R.layout.fragment_contacts), ViewBindingHo
private fun handleAction(action: ContactsViewModel.Action) {
when (action) {
is ContactsViewModel.Action.NavigateHome -> findNavController().navigate(ContactsFragmentDirections.home())
is ContactsViewModel.Action.OpenContactsInfoUrl -> startActivity(Intent(Intent.ACTION_VIEW).setData(Uri.parse(action.url)))
is ContactsViewModel.Action.NavigateHome -> returnHomeWithoutRestart()
is ContactsViewModel.Action.OpenContactsInfoUrl -> startActivitySafely(Intent(Intent.ACTION_VIEW).setData(Uri.parse(action.url)))
is ContactsViewModel.Action.OpenHealthBoardRecommendationsUrl -> startActivitySafely(
Intent(Intent.ACTION_VIEW).setData(
Uri.parse(action.url)
......@@ -74,26 +75,33 @@ class ContactsFragment : MvvmFragment(R.layout.fragment_contacts), ViewBindingHo
}.exhaustive
}
private fun returnHomeWithoutRestart() {
findNavController().popBackStack()
}
private fun showContacts(contacts: InfectedStatus) {
if (contacts !is InfectedStatus.HasContacts) {
return
}
requireBinding {
titleView.text = resources.getQuantityString(R.plurals.contacts_detected_title, contacts.num, contacts.num)
descriptionStayHomeView.text =
getString(R.string.contacts_detected_text_stay_home, DateUtils.getFormattedLocalDate(contacts.stayHomeUntilDate))
setupStayHomeText(contacts)
}
}
private fun FragmentContactsBinding.setupStayHomeText(contacts: InfectedStatus.HasContacts) {
val dateString = DateUtils.getFormattedLocalDate(contacts.stayHomeUntilDate)
val message = getString(R.string.contacts_detected_text_stay_home, dateString)
descriptionStayHomeView.setTextWithBoldSpans(message, dateString)
}
private fun initClickableText() {
requireBinding {
descriptionCallView.addUrlSpans()
healthBoardRecommendationsView.setTextWithClickableSpan(
getString(R.string.contacts_health_board_recommendations_link),
getString(R.string.contacts_health_board_recommendations_link_clickable_part)
) {
viewModel.healthBoardRecommendationsClicked()
}
getString(R.string.contacts_health_board_recommendations),
getString(R.string.contacts_health_board_recommendations_clickable_part),
) { viewModel.healthBoardRecommendationsClicked() }
}
}
}
......@@ -32,4 +32,14 @@ sealed class PatientPortalResult : Parcelable {
return "PatientPortalResult.Error(exception=$exception)"
}
}
/**
* A debug option that allows to navigate directly to specific steps in the infection confirmation process.
*/
@Parcelize
object DebugJustDone : PatientPortalResult() {
override fun toString(): String {
return "PatientPortalResult.DebugJustDone()"
}
}
}
......@@ -17,11 +17,11 @@ import androidx.navigation.fragment.findNavController
import mobi.lab.mvvm.MvvmFragment
import org.dpppt.android.app.BuildConfig
import org.dpppt.android.app.R
import org.dpppt.android.app.common.util.ViewBindingHolder
import org.dpppt.android.app.common.util.DateUtils
import org.dpppt.android.app.common.util.FragmentBindingHolder
import org.dpppt.android.app.common.util.ViewBindingHolder
import org.dpppt.android.app.common.util.ViewModelFactory
import org.dpppt.android.app.common.util.exhaustive
import org.dpppt.android.app.common.util.DateUtils
import org.dpppt.android.app.common.util.setTextWithBoldSpans
import org.dpppt.android.app.databinding.FragmentHomeBinding
import org.dpppt.android.app.di.Injector
......
......@@ -15,6 +15,7 @@ import org.dpppt.android.app.domain.usecase.infection.patientportal.PreparePatie
import org.dpppt.android.app.domain.usecase.infection.request.DeleteConfirmInfectionRequestUseCase
import org.dpppt.android.app.util.dispose
import timber.log.Timber
import java.lang.IllegalArgumentException
import javax.inject.Inject
class ConfirmInfectionPatientPortalViewModel @Inject constructor(
......@@ -74,6 +75,10 @@ class ConfirmInfectionPatientPortalViewModel @Inject constructor(
cleanupAndContinueWithTheResult(portalResult)
true
}
is PatientPortalResult.DebugJustDone -> {
// Not supported here
throw IllegalArgumentException("The PatientPortalResult.DebugJustDone is not supported for this screen!")
}
}.exhaustive
}
......
......@@ -46,6 +46,7 @@ class ConfirmInfectionResultViewModel @Inject constructor(
PatientPortalResult.InProgress -> {
// No-op, will not happen here
}
is PatientPortalResult.DebugJustDone -> onSendInfectedStatusSuccess()
}.exhaustive
}
......
......@@ -78,7 +78,8 @@ class MyDataFragment : MvvmFragment(R.layout.fragment_my_data), ViewBindingHolde
when (action) {
is MyDataViewModel.Action.ShowDeleteSuccess -> showDeleteSuccess()
is MyDataViewModel.Action.ShowDeleteError -> showDeleteError(action.error)
is MyDataViewModel.Action.NavigateToHomeRestart -> findNavController().navigate(MyDataFragmentDirections.homeRestart())
is MyDataViewModel.Action.NavigateToHomeRestart -> returnHomeWithRestart()
is MyDataViewModel.Action.NavigateToHomeWithoutRestart -> returnHomeWithoutRestart()
is MyDataViewModel.Action.OpenPrivacyPolicyUrl -> startActivitySafely(
Intent(Intent.ACTION_VIEW).setData(
Uri.parse(
......@@ -90,6 +91,14 @@ class MyDataFragment : MvvmFragment(R.layout.fragment_my_data), ViewBindingHolde
}.exhaustive
}
private fun returnHomeWithRestart() {
findNavController().navigate(MyDataFragmentDirections.homeRestart())
}
private fun returnHomeWithoutRestart() {
findNavController().popBackStack()
}
private fun showDeleteSuccess() {
showToast(R.string.my_data_delete_success)
}
......
......@@ -28,7 +28,7 @@ class MyDataViewModel @Inject constructor(
}
fun onReturnHomeClicked() {
restartToHome()
returnToHome()
}
fun onPrivacyPolicyClicked() {
......@@ -54,6 +54,10 @@ class MyDataViewModel @Inject constructor(
_action.value = Event(Action.NavigateToHomeRestart)
}
private fun returnToHome() {
_action.value = Event(Action.NavigateToHomeWithoutRestart)
}
private fun onDeleteSuccess() {
_action.value = Event(Action.ShowDeleteSuccess)
restartToHome()
......@@ -68,5 +72,6 @@ class MyDataViewModel @Inject constructor(
data class ShowDeleteError(val error: DomainException) : Action()
data class OpenPrivacyPolicyUrl(val url: String) : Action()
object NavigateToHomeRestart : Action()
object NavigateToHomeWithoutRestart : Action()
}
}
package org.dpppt.android.app.settings
import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
......@@ -26,6 +27,7 @@ import org.dpppt.android.app.common.util.ViewBindingHolder
import org.dpppt.android.app.common.util.ViewModelFactory
import org.dpppt.android.app.common.util.exhaustive
import org.dpppt.android.app.common.util.getAppVersionString
import org.dpppt.android.app.common.util.getTextWithBlueSpans
import org.dpppt.android.app.databinding.FragmentSettingsBinding
import org.dpppt.android.app.di.Injector
import org.dpppt.android.app.storage.SecureStorage
......@@ -65,6 +67,10 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
initViewModel()
viewModel.start(tracingViewModel.appStatusLiveData, args.scrollDestination, savedInstanceState == null)
setOnBackPressed()
setupViews(view)
}
private fun setupViews(view: View) {
requireBinding {
batteryButton.setOnClickListener {
viewModel.batteryButtonClicked()
......@@ -74,13 +80,25 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
viewModel.activateBluetooth()
}
buttonBack.setOnClickListener { navigateBack() }
versionText.text = getAppVersionString(view.context, env.showLongVersionInfo)
versionText.setOnClickListener { viewModel.onVersionClicked() }
setupVersionView(view.context)
languageLayout.setOnClickListener { showLanguageSelectionDialog() }
setupCrossCountryView(view.context)
}
}
private fun FragmentSettingsBinding.setupVersionView(context: Context) {
versionText.text = getAppVersionString(context, env.showLongVersionInfo)
versionText.setOnClickListener { viewModel.onVersionClicked() }
}
private fun FragmentSettingsBinding.setupCrossCountryView(context: Context) {
crossCountryDescription.text = context.getTextWithBlueSpans(
getString(R.string.settings_cross_country_description),
getString(R.string.settings_cross_country_description_blue_part),
)
crossCountryDescription.setOnClickListener { viewModel.crossCountryInfoLinkClicked() }
}
override fun onResume() {
super.onResume()
viewModel.start(tracingViewModel.appStatusLiveData, args.scrollDestination, false)
......@@ -103,9 +121,12 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
}
is SettingsViewModel.Action.OpenPlayStoreUrl ->
startActivitySafely(Intent(Intent.ACTION_VIEW).setData(Uri.parse(URL_PLAY_STORE)))
SettingsViewModel.Action.ScrollToCrossCountryItem -> {
is SettingsViewModel.Action.ScrollToCrossCountryItem -> {
scrollToCrossCountryItem()
}
is SettingsViewModel.Action.OpenCrossCountryInfoUrl -> {
startActivitySafely(Intent(Intent.ACTION_VIEW).setData(Uri.parse(action.url)))
}
}.exhaustive
}
......
......@@ -23,6 +23,7 @@ import org.dpppt.android.app.domain.usecase.dp3t.GaenStartUseCase
import org.dpppt.android.app.domain.usecase.dp3t.GaenStopUseCase
import org.dpppt.android.app.domain.usecase.dp3t.GaenSyncUseCase
import org.dpppt.android.app.domain.usecase.dp3t.IsGaenWorkingUseCase
import org.dpppt.android.app.domain.usecase.infopage.CreateGotSickAbroadPageUrlUseCase
import org.dpppt.android.app.domain.usecase.permissions.CheckBatteryOptimizationUseCase
import org.dpppt.android.app.main.model.TracingStatusInterface
import org.dpppt.android.app.util.dispose
......@@ -36,7 +37,8 @@ class SettingsViewModel @Inject constructor(
private val gaenStartUseCase: GaenStartUseCase,
private val gaenStopUseCase: GaenStopUseCase,
private val activityService: ActivityService,
private val syncUseCase: GaenSyncUseCase
private val syncUseCase: GaenSyncUseCase,
private val createGotSickAbroadPageUrlUseCase: CreateGotSickAbroadPageUrlUseCase
) : ViewModel() {
private val _action = MutableLiveData<Event<Action>>()
......@@ -53,6 +55,9 @@ class SettingsViewModel @Inject constructor(
private var disposables: List<Disposable> = listOf()
// Let's use a different disposable for links as these are one-shot things
private var linkDisposable: Disposable? = null
private val tracingStatusObserver = Observer(::tracingStatusChanged)
fun start(status: LiveData<TracingStatusInterface>, settingsScrollDestination: SettingsScrollDestination, isFirstStart: Boolean) {
......@@ -191,6 +196,20 @@ class SettingsViewModel @Inject constructor(
{ error -> Timber.e(error, "Sync error") }
)
fun crossCountryInfoLinkClicked() {
dispose(linkDisposable)
// For now this will be the same URL as on the Home screen
linkDisposable = createGotSickAbroadPageUrlUseCase.execute()
.backgroundToMain()
.subscribe(
{ url -> _action.value = Event(Action.OpenCrossCountryInfoUrl(url)) },
{ error ->
Timber.e(error, "crossCountryInfoLinkClicked")
// NO-OP: This should not happen atm. But for the future we still want to consume this
}
)
}
sealed class Action {
data class GaenError(val e: Throwable) : Action()
object BluetoothError : Action()
......@@ -198,5 +217,6 @@ class SettingsViewModel @Inject constructor(
data class ShowPlayServicesUpdateDialog(val isUpdateRequired: Boolean) : Action()
object OpenPlayStoreUrl : Action()
object ScrollToCrossCountryItem : Action()
data class OpenCrossCountryInfoUrl(val url: String) : Action()
}
}
......@@ -10,7 +10,6 @@
package org.dpppt.android.app.util;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
......@@ -19,18 +18,12 @@ import androidx.annotation.NonNull;
public class DeviceFeatureHelper {
public static boolean isBluetoothEnabled() {
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return bluetoothAdapter != null && bluetoothAdapter.isEnabled();
}
public static void openPlayServicesInPlayStore(@NonNull Context context) {
final String playServicesPackageName = "com.google.android.gms";
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + playServicesPackageName)));
} catch (android.content.ActivityNotFoundException e) {
context.startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=" + playServicesPackageName)));
AndroidUtilKt.startActivitySafely(context, new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + playServicesPackageName)));
}
}
......
......@@ -34,6 +34,7 @@
<com.google.android.material.card.MaterialCardView
style="@style/AppTheme.CardView"
android:id="@+id/cardContactInfo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/size_16"
......@@ -53,7 +54,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="@dimen/size_16" />
app:layout_constraintGuide_end="@dimen/size_32" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/startGuideline"
......@@ -148,20 +149,23 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_6"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintTop_toTopOf="@+id/descriptionMonitorHealthView"
app:layout_constraintTop_toTopOf="@+id/healthBoardRecommendationsView"
app:srcCompat="@drawable/ic_point"
android:importantForAccessibility="no" />
<TextView
android:id="@+id/descriptionMonitorHealthView"
android:id="@+id/healthBoardRecommendationsView"
style="@style/AppTheme.Paragraph.Black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
android:text="@string/contacts_detected_text_monitor_health"
android:layout_marginEnd="@dimen/size_4"
android:text="@string/contacts_health_board_recommendations"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf="@+id/descriptionStayHomeView" />
app:layout_constraintTop_toBottomOf="@+id/descriptionStayHomeView"
app:layout_constraintBottom_toTopOf="@+id/descriptionMonitorHealthView"/>
<ImageView
android:id="@+id/bulletView3"
......@@ -169,20 +173,20 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_6"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintTop_toTopOf="@+id/healthBoardRecommendationsView"
app:layout_constraintTop_toTopOf="@+id/descriptionMonitorHealthView"
app:srcCompat="@drawable/ic_point"
android:importantForAccessibility="no" />
<TextView
android:id="@+id/healthBoardRecommendationsView"
android:id="@+id/descriptionMonitorHealthView"
style="@style/AppTheme.Paragraph.Black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
android:text="@string/contacts_health_board_recommendations_link"
android:text="@string/contacts_detected_text_monitor_health"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf="@+id/descriptionMonitorHealthView" />
app:layout_constraintTop_toBottomOf="@+id/healthBoardRecommendationsView" />
<ImageView
android:id="@+id/bulletView4"
......@@ -195,15 +199,27 @@
android:importantForAccessibility="no" />
<TextView
android:id="@+id/descriptionCallView"
style="@style/AppTheme.Paragraph.Black"
android:id="@+id/descriptionCallView"
style="@style/AppTheme.Paragraph.Black"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
android:text="@string/contacts_detected_text_call"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf="@+id/descriptionMonitorHealthView" />
<TextView
android:id="@+id/descriptionHealthBoardThanksYou"
style="@style/AppTheme.Paragraph.Black.Bold"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
android:text="@string/contacts_detected_text_call"
android:layout_marginTop="@dimen/size_24"
android:gravity="center_horizontal"
android:text="@string/contacts_detected_text_health_board_thanks_you"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf="@+id/healthBoardRecommendationsView" />
app:layout_constraintTop_toBottomOf="@+id/descriptionCallView" />
<com.google.android.material.button.MaterialButton
android:id="@+id/buttonBackHome"
......@@ -211,26 +227,29 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
android:layout_marginBottom="@dimen/text_size_32"
android:text="@string/nav_back_home"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintTop_toBottomOf="@+id/descriptionCallView" />
<TextView
android:id="@+id/learnMoreView"
style="@style/AppTheme.LinkButtonText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_8"
app:layout_constraintEnd_toStartOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintTop_toBottomOf="@+id/buttonBackHome"
app:layout_constraintBottom_toTopOf="@+id/bottomGuideline"
android:gravity="center"
android:text="@string/contacts_info_page_link" />
app:layout_constraintTop_toBottomOf="@+id/descriptionHealthBoardThanksYou"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/learnMoreView"
style="@style/AppTheme.LinkButtonText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_8"
android:layout_marginBottom="@dimen/size_8"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cardContactInfo"
app:layout_constraintBottom_toBottomOf="parent"
android:gravity="center_horizontal"
android:text="@string/contacts_info_page_link" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</LinearLayout>
......@@ -415,11 +415,25 @@
android:layout_gravity="center_horizontal"
android:layout_marginBottom="@dimen/size_24"
android:text="@string/debug_state_show_share_screen_error"
app:layout_constraintBottom_toTopOf="@id/buttonDebugStateOpenSettingsAndScrollToCrossCountry"
app:layout_constraintBottom_toTopOf="@id/buttonDebugStateShareScreenSuccess"
app:layout_constraintEnd_toEndOf="@id/guideEndThird"
app:layout_constraintStart_toStartOf="@id/guideStartThird"