Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

Show easy language link for German only (EXPOSUREAPP-4986) #2313

Merged
merged 7 commits into from
Feb 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,15 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import io.mockk.unmockkAll
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.takeScreenshot
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragment2
import testhelpers.launchFragmentInContainer2
import testhelpers.takeScreenshot
import tools.fastlane.screengrab.locale.LocaleTestRule

@RunWith(AndroidJUnit4::class)
Expand All @@ -31,19 +28,6 @@ class OnboardingFragmentTest : BaseUITest() {
@get:Rule
val systemUIDemoModeRule = SystemUIDemoModeRule()

@Before
fun setUp() {
setupMockViewModel(object : OnboardingFragmentViewModel.Factory {
override fun create(): OnboardingFragmentViewModel = OnboardingFragmentViewModel()
})
}

@After
fun teardown() {
clearAllViewModels()
unmockkAll()
}

@Test
fun launch_fragment() {
launchFragment2<OnboardingFragment>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ internal abstract class OnboardingActivityModule {

@ContributesAndroidInjector(modules = [OnboardingTracingModule::class])
abstract fun onboardingScreen(): OnboardingTracingFragment
@ContributesAndroidInjector(modules = [OnboardingFragmentModule::class])
abstract fun onboardingFragment(): OnboardingFragment
@ContributesAndroidInjector(modules = [OnboardingPrivacyModule::class])
abstract fun onboardingPrivacyFragment(): OnboardingPrivacyFragment
@ContributesAndroidInjector(modules = [OnboardingTestModule::class])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,56 +1,54 @@
package de.rki.coronawarnapp.ui.onboarding

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.accessibility.AccessibilityEvent
import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentOnboardingBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import de.rki.coronawarnapp.util.ExternalActionHelper
import de.rki.coronawarnapp.util.ui.doNavigate
import javax.inject.Inject
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import java.util.Locale

/**
* Onboarding starting point.
*/
class OnboardingFragment : Fragment(R.layout.fragment_onboarding), AutoInject {
class OnboardingFragment : Fragment(R.layout.fragment_onboarding) {

@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: OnboardingFragmentViewModel by cwaViewModels { viewModelFactory }
private val binding: FragmentOnboardingBinding by viewBindingLazy()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
onboardingButtonNext.setOnClickListener { vm.onNextButtonClick() }
onboardingInclude.onboardingEasyLanguage.setOnClickListener { vm.onEasyLanguageClick() }
}
vm.routeToScreen.observe2(this) {
when (it) {
is OnboardingNavigationEvents.NavigateToOnboardingPrivacy ->
doNavigate(
OnboardingFragmentDirections
.actionOnboardingFragmentToOnboardingPrivacyFragment()
)
is OnboardingNavigationEvents.NavigateToEasyLanguageUrl ->
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(getString(R.string.onboarding_tracing_easy_language_explanation_url))
)
)
onboardingButtonNext.setOnClickListener { goToOnboardingPrivacyFragment() }
// only show link for German
if (showEasyLanguageLink()) {
onboardingEasyLanguage.visibility = View.VISIBLE
onboardingEasyLanguage.setOnClickListener { openEasyLanguageLink() }
} else {
onboardingEasyLanguage.visibility = View.GONE
}
}
}

private fun goToOnboardingPrivacyFragment() {
doNavigate(
OnboardingFragmentDirections
.actionOnboardingFragmentToOnboardingPrivacyFragment()
)
}

private fun openEasyLanguageLink() {
ExternalActionHelper.openUrl(this, getString(R.string.onboarding_tracing_easy_language_explanation_url))
}

override fun onResume() {
super.onResume()
binding.onboardingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
}
}

@VisibleForTesting
fun showEasyLanguageLink(): Boolean = Locale.getDefault().language == Locale.GERMAN.language

This file was deleted.

This file was deleted.

151 changes: 105 additions & 46 deletions Corona-Warn-App/src/main/res/layout/fragment_onboarding.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,62 +11,121 @@
android:fillViewport="true"
tools:context="de.rki.coronawarnapp.ui.onboarding.OnboardingFragment">

<include
android:id="@+id/onboarding_include"
layout="@layout/include_onboarding"
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="@dimen/spacing_small"
android:focusable="false"
app:body="@{@string/onboarding_body}"
app:bodyEmphasized="@{@string/onboarding_body_emphasized}"
app:headline="@{@string/onboarding_headline}"
app:easyLanguageText="@{@string/onboarding_tracing_easy_language_explanation}"
app:illustration="@{@drawable/ic_illustration_together}"
app:illustrationDescription="@{@string/onboarding_illustration_description}"
app:layout_constraintBottom_toTopOf="@+id/onboarding_button_next"
android:layout_marginBottom="@dimen/spacing_normal"
app:layout_constraintBottom_toTopOf="@id/onboarding_button_next"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:subtitle="@{@string/onboarding_subtitle}" />
app:layout_constraintTop_toTopOf="parent">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/spacing_medium">

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/onboarding_illustration"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:contentDescription="@string/onboarding_illustration_description"
android:focusable="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@drawable/ic_illustration_together" />

<TextView
android:id="@+id/onboarding_headline"
style="@style/headline4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_normal"
android:focusable="true"
android:text="@string/onboarding_headline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/onboarding_illustration"
tools:text="@string/onboarding_headline" />

<TextView
android:id="@+id/onboarding_subtitle"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_normal"
android:focusable="true"
android:text="@string/onboarding_subtitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/onboarding_headline"
tools:text="@string/onboarding_subtitle" />

<TextView
android:id="@+id/onboarding_body"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_normal"
android:autoLink="web|email"
android:focusable="true"
android:text="@string/onboarding_body"
android:textColorLink="@color/colorTextTint"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/onboarding_subtitle"
tools:text="@string/onboarding_body" />

<TextView
android:id="@+id/onboarding_body_emphasized"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_normal"
android:focusable="true"
android:text="@string/onboarding_body_emphasized"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/onboarding_body"
tools:text="@string/onboarding_body_emphasized" />

<TextView
android:id="@+id/onboarding_easy_language"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_normal"
android:clickable="true"
android:focusable="true"
android:linksClickable="true"
android:text="@string/onboarding_tracing_easy_language_explanation"
android:textColorLink="@color/colorTextTint"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/onboarding_body_emphasized"
tools:text="@string/onboarding_tracing_easy_language_explanation" />

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>

<Button
android:id="@+id/onboarding_button_next"
style="@style/buttonPrimary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/onboarding_button_start"
app:layout_constraintBottom_toBottomOf="@id/guideline_bottom"
app:layout_constraintEnd_toEndOf="@id/guideline_end"
app:layout_constraintStart_toStartOf="@id/guideline_start" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="@dimen/guideline_top_onboarding" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_end="@dimen/spacing_small" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="@dimen/guideline_start" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="@dimen/guideline_end" />
android:layout_marginHorizontal="@dimen/spacing_normal"
android:layout_marginBottom="@dimen/spacing_small"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
</layout>
Loading