diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt index 2c22c8b002551f81783c5690ba7636e090db55c7..25c5d3f8ff24dc7536fa7efb0ff6208e59b50f1d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.ui import androidx.annotation.DrawableRes import androidx.annotation.StringRes import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.util.ui.CachedString enum class Country( val code: String, @@ -40,5 +41,7 @@ enum class Country( RO("ro", R.string.country_name_ro, R.drawable.ic_country_ro), SE("se", R.string.country_name_se, R.drawable.ic_country_se), SI("si", R.string.country_name_si, R.drawable.ic_country_si), - SK("sk", R.string.country_name_sk, R.drawable.ic_country_sk) + SK("sk", R.string.country_name_sk, R.drawable.ic_country_sk); + + val label = CachedString { it.getString(labelRes) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryList.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryList.kt deleted file mode 100644 index a97986690a52f7aa4223a34e29d7a7c3f33adfb0..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryList.kt +++ /dev/null @@ -1,48 +0,0 @@ -package de.rki.coronawarnapp.ui.view - -import android.content.Context -import android.util.AttributeSet -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.ui.Country -import java.text.Collator - -class CountryList(context: Context, attrs: AttributeSet) : - LinearLayout(context, attrs) { - - private var _list: List<Country>? = null - var list: List<Country>? - get() = _list - set(value) { - _list = value - buildList() - } - - init { - orientation = VERTICAL - } - - /** - * Cleans the view and rebuilds the list of countries. Presets already selected countries - */ - private fun buildList() { - this.removeAllViews() - list - ?.map { country -> - context.getString(country.labelRes) to country.iconRes - } - ?.sortedWith { a, b -> - Collator.getInstance().compare(a.first, b.first) - } - ?.forEachIndexed { index, (label, iconRes) -> - inflate(context, R.layout.view_country_list_entry, this) - val child = this.getChildAt(index) - child.apply { - findViewById<ImageView>(R.id.country_list_entry_image).setImageResource(iconRes) - findViewById<TextView>(R.id.country_list_entry_label).text = label - } - } - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt new file mode 100644 index 0000000000000000000000000000000000000000..38163a84e6719f8272768ea03de51dc5e558453a --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt @@ -0,0 +1,78 @@ +package de.rki.coronawarnapp.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.ViewCountryListEntryFlagItemBinding +import de.rki.coronawarnapp.ui.Country +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.ui.view.CountryFlagsAdapter.CountryFlagViewHolder +import de.rki.coronawarnapp.util.lists.BindableVH + +class CountryListView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) { + + private val adapterCountryFlags = CountryFlagsAdapter() + private val grid: RecyclerView + private val countryNames: TextView + + var countries: List<Country> = emptyList() + set(value) { + field = value.also { countries -> + adapterCountryFlags.countryList = countries + countryNames.text = countries.joinToString(", ") { it.label.get(context) } + } + } + + init { + orientation = HORIZONTAL + inflate(context, R.layout.view_country_list_entry_flag_container, this) + + grid = findViewById<RecyclerView>(R.id.flagGrid).apply { + layoutManager = GridLayoutManager(context, FLAG_COLUMNS) + adapter = adapterCountryFlags + } + countryNames = findViewById(R.id.country_list_entry_label) + } + + // Helper to allow for null in data binding + fun setCountryList(countries: List<Country>?) { + this.countries = countries ?: emptyList() + } + + companion object { + private const val FLAG_COLUMNS = 8 + } +} + +private class CountryFlagsAdapter : BaseAdapter<CountryFlagViewHolder>() { + + var countryList: List<Country> = emptyList() + set(value) { + field = value + notifyDataSetChanged() + } + + override fun getItemCount(): Int = countryList.size + + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): CountryFlagViewHolder = CountryFlagViewHolder(parent) + + override fun onBindBaseVH(holder: CountryFlagViewHolder, position: Int) = holder.bind(countryList[position]) + + class CountryFlagViewHolder(val parent: ViewGroup) : VH( + R.layout.view_country_list_entry_flag_item, parent + ), BindableVH<Country, ViewCountryListEntryFlagItemBinding> { + + override val viewBinding: Lazy<ViewCountryListEntryFlagItemBinding> = lazy { + ViewCountryListEntryFlagItemBinding.bind(itemView) + } + + override val onBindData: ViewCountryListEntryFlagItemBinding.(key: Country) -> Unit = { item -> + countryListEntryImage.setImageResource(item.iconRes) + } + } +} diff --git a/Corona-Warn-App/src/main/res/layout/include_interop_list_participating_countries_overview.xml b/Corona-Warn-App/src/main/res/layout/include_interop_list_participating_countries_overview.xml index f6142d91d2b25a4ddeb6c664fbf4d346b6f046dc..6ecf73f518ab7120bf5876447faf66fc9bd0052a 100644 --- a/Corona-Warn-App/src/main/res/layout/include_interop_list_participating_countries_overview.xml +++ b/Corona-Warn-App/src/main/res/layout/include_interop_list_participating_countries_overview.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <data> @@ -36,17 +37,18 @@ android:visibility="@{FormatterHelper.formatVisibilityText(countryListTitle)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/interoperability_onboarding_list_title" /> - <de.rki.coronawarnapp.ui.view.CountryList + <de.rki.coronawarnapp.ui.view.CountryListView android:id="@+id/countryList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_tiny" + app:countryList="@{countryData}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/country_header_description" - app:list="@{countryData}" /> + app:layout_constraintTop_toBottomOf="@+id/country_header_description" /> <TextView android:id="@+id/label_country_selection_info" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml index a3cc144f4363bdab7d456c558f828c175a901f8b..0dc277c240812c260c786037fe7ae97ac6bc2eb9 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml @@ -67,22 +67,22 @@ app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_text" /> - <de.rki.coronawarnapp.ui.view.CountryList + <de.rki.coronawarnapp.ui.view.CountryListView android:id="@+id/countryList" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_tiny" app:layout_constraintEnd_toEndOf="@+id/submission_country_header_description" app:layout_constraintStart_toStartOf="@+id/submission_country_header_description" app:layout_constraintTop_toBottomOf="@+id/submission_country_header_description" - app:list="@{countryData}" /> + app:countryList="@{countryData}" /> <include android:id="@+id/submission_positive_location_card_16_years" layout="@layout/include_16_years" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_large" + android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" app:body="@{@string/sixteen_description_text}" app:headline="@{@string/sixteen_title_text}" diff --git a/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_container.xml b/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d1e7b16c128d1e66548a715fd870d90e1e4c9bd --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_container.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:orientation="vertical"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/flagGrid" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <View + android:layout_width="match_parent" + android:layout_height="3dp" + android:layout_marginTop="@dimen/spacing_small" + android:background="@color/colorHairline" /> + + <TextView + android:id="@+id/country_list_entry_label" + style="@style/subtitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + tools:text="Deutschland, Frankreich" /> + + <View + android:layout_width="match_parent" + android:layout_height="3dp" + android:background="@color/colorHairline" /> +</LinearLayout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_item.xml b/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d37e33e4f6ddd1119ebceeb98496fa4bef67ed5 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/view_country_list_entry_flag_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<ImageView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/country_list_entry_image" + android:layout_width="28dp" + android:layout_height="28dp" + android:layout_margin="4dp" + app:srcCompat="@drawable/ic_country_eu" />