From e8812ca4275be98b969299d78aad6e6e2eb5f6dc Mon Sep 17 00:00:00 2001 From: marcmuschko <marc.muschko@sap.com> Date: Thu, 11 Jun 2020 12:58:23 +0200 Subject: [PATCH] UI Adjustments, External Navigation Issues (#380) * adjusted icon size on main about, adjusted text spacing * design adjustments and spacings * changed onboarding flow; user does not get navigated to screen 4 after declining tracing permission; explicit denial required * catch exception when no browser or phone app installed * fixed main overview a18n contrast issue * merged external navigation helpers into single helper object * adjusted bluetooth settings navigatioN * added custom exception for external actions; added external action helper * fixed build issues Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../exception/ExternalActionException.kt | 12 + .../exception/reporting/ErrorCodes.kt | 3 +- .../information/InformationContactFragment.kt | 4 +- .../ui/information/InformationFragment.kt | 4 +- .../rki/coronawarnapp/ui/main/MainFragment.kt | 4 +- .../ui/main/MainShareFragment.kt | 4 +- .../onboarding/OnboardingTracingFragment.kt | 2 +- .../settings/SettingsNotificationFragment.kt | 4 +- .../ui/settings/SettingsTracingFragment.kt | 6 +- .../submission/SubmissionContactFragment.kt | 4 +- .../de/rki/coronawarnapp/util/CallHelper.kt | 20 -- .../util/ExternalActionHelper.kt | 159 +++++++++++++ .../rki/coronawarnapp/util/OpenUrlHelper.kt | 16 -- .../util/SettingsNavigationHelper.kt | 48 ---- .../de/rki/coronawarnapp/util/ShareHelper.kt | 14 -- .../ic_main_illustration_overview.xml | 198 ++++++++-------- .../res/drawable-night/ic_main_overview_1.xml | 24 +- .../res/drawable-night/ic_main_overview_2.xml | 24 +- .../res/drawable-night/ic_main_overview_3.xml | 24 +- .../ic_main_illustration_overview.xml | 214 +++++++++--------- .../res/layout/fragment_main_overview.xml | 27 +-- .../layout/include_main_overview_glossary.xml | 3 + .../res/layout/include_main_overview_row.xml | 73 ++++++ .../src/main/res/layout/include_row.xml | 35 +-- .../src/main/res/values/dimens.xml | 4 +- .../src/main/res/values/strings.xml | 4 +- .../src/main/res/values/styles.xml | 5 + .../SubmitDiagnosisKeysTransactionTest.kt | 4 +- ...perTest.kt => ExternalActionHelperTest.kt} | 6 +- 29 files changed, 544 insertions(+), 405 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ExternalActionException.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CallHelper.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/OpenUrlHelper.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ShareHelper.kt create mode 100644 Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml rename Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/{CallHelperTest.kt => ExternalActionHelperTest.kt} (78%) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ExternalActionException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ExternalActionException.kt new file mode 100644 index 000000000..f9b1d657f --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ExternalActionException.kt @@ -0,0 +1,12 @@ +package de.rki.coronawarnapp.exception + +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + +class ExternalActionException(cause: Throwable) : ReportedException( + ErrorCodes.EXTERNAL_NAVIGATION.code, + "Error during external navigation, likely due to bad target / action not available", + cause, + R.string.errors_external_action +) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt index 51b315289..9f62362d1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt @@ -19,5 +19,6 @@ enum class ErrorCodes(val code: Int) { REPORTED_EXCEPTION_UNKNOWN_PROBLEM(9002), // NONTECHNICAL - NO_NETWORK_CONNECTIVITY(1) + NO_NETWORK_CONNECTIVITY(1), + EXTERNAL_NAVIGATION(10), } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt index c0e00a66e..fd26db493 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.Fragment import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentInformationContactBinding import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.CallHelper +import de.rki.coronawarnapp.util.ExternalActionHelper /** * Basic Fragment which only displays static content. @@ -57,7 +57,7 @@ class InformationContactFragment : Fragment() { } binding.informationContactNavigationRowPhone.navigationRow.setOnClickListener { val number = getString(R.string.information_contact_phone_call_number) - CallHelper.call(this, "tel:$number") + ExternalActionHelper.call(this, number) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt index 804181ce3..bc14cbf4b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt @@ -11,7 +11,7 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentInformationBinding import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.OpenUrlHelper +import de.rki.coronawarnapp.util.ExternalActionHelper /** * Basic Fragment which links to static and web content. @@ -75,7 +75,7 @@ class InformationFragment : Fragment() { ) } binding.informationHelp.mainRow.setOnClickListener { - OpenUrlHelper.navigate(this, requireContext().getString(R.string.main_about_link)) + ExternalActionHelper.openUrl(this, requireContext().getString(R.string.main_about_link)) } binding.informationLegal.mainRow.setOnClickListener { findNavController().doNavigate( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt index 4ad3482f3..44c1104f1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt @@ -19,7 +19,7 @@ import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel -import de.rki.coronawarnapp.util.OpenUrlHelper +import de.rki.coronawarnapp.util.ExternalActionHelper import timber.log.Timber /** @@ -134,7 +134,7 @@ class MainFragment : Fragment() { findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToSettingsTracingFragment()) } binding.mainAbout.mainCard.setOnClickListener { - OpenUrlHelper.navigate(this, requireContext().getString(R.string.main_about_link)) + ExternalActionHelper.openUrl(this, requireContext().getString(R.string.main_about_link)) } binding.mainHeaderShare.buttonIcon.setOnClickListener { findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToMainSharingFragment()) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt index 5352289e9..42077a648 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.activityViewModels import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentMainShareBinding import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel -import de.rki.coronawarnapp.util.ShareHelper +import de.rki.coronawarnapp.util.ExternalActionHelper /** * This fragment informs the user about what he is going to share and how he is going to help everybody with this :) @@ -49,7 +49,7 @@ class MainShareFragment : Fragment() { private fun setButtonOnClickListener() { binding.mainShareButton.setOnClickListener { - ShareHelper.shareText(this, getString(R.string.main_share_message), null) + ExternalActionHelper.shareText(this, getString(R.string.main_share_message), null) } binding.mainShareHeader.headerButtonBack.buttonIcon.setOnClickListener { (activity as MainActivity).goBack() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt index 7d251557b..21115e916 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt @@ -98,7 +98,7 @@ class OnboardingTracingFragment : Fragment(), } override fun onFailure(exception: Exception?) { - navigate() + // dialog closed, user has to explicitly allow or deny the tracing permission } private fun showCancelDialog() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt index 4317f0e40..99ca01e18 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt @@ -10,7 +10,7 @@ import de.rki.coronawarnapp.databinding.FragmentSettingsNotificationsBinding import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel -import de.rki.coronawarnapp.util.SettingsNavigationHelper +import de.rki.coronawarnapp.util.ExternalActionHelper /** * This is the setting notification page. Here the user sees his os notifications settings status. @@ -88,7 +88,7 @@ class SettingsNotificationFragment : Fragment() { } // System Settings settingsRow.setOnClickListener { - SettingsNavigationHelper.toNotifications(requireContext()) + ExternalActionHelper.toNotifications(requireContext()) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt index e22cdad1d..72cb7f518 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt @@ -21,7 +21,7 @@ import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.DialogHelper -import de.rki.coronawarnapp.util.SettingsNavigationHelper +import de.rki.coronawarnapp.util.ExternalActionHelper import de.rki.coronawarnapp.worker.BackgroundWorkScheduler import kotlinx.coroutines.launch @@ -115,10 +115,10 @@ class SettingsTracingFragment : Fragment(), (activity as MainActivity).goBack() } binding.settingsTracingStatusBluetooth.tracingStatusCardButton.setOnClickListener { - SettingsNavigationHelper.toConnections(requireContext()) + ExternalActionHelper.toMainSettings(requireContext()) } binding.settingsTracingStatusConnection.tracingStatusCardButton.setOnClickListener { - SettingsNavigationHelper.toConnections(requireContext()) + ExternalActionHelper.toConnections(requireContext()) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt index edc1c920a..d61a15600 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt @@ -11,7 +11,7 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentSubmissionContactBinding import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.CallHelper +import de.rki.coronawarnapp.util.ExternalActionHelper /** * The [SubmissionContactFragment] allows requesting a teletan via phone @@ -67,6 +67,6 @@ class SubmissionContactFragment : Fragment() { private fun dial() = context?.let { val number = getString(R.string.submission_contact_number_dial) - CallHelper.call(this, "tel:$number") + ExternalActionHelper.call(this, number) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CallHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CallHelper.kt deleted file mode 100644 index 0694387fc..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CallHelper.kt +++ /dev/null @@ -1,20 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.content.Intent -import android.net.Uri -import androidx.fragment.app.Fragment - -/** - * Helper object for intents triggering a phone call - * todo unify once necessary intents are final with share, external url and others - */ -object CallHelper { - fun call(fragment: Fragment, uri: String) { - fragment.startActivity( - Intent( - Intent.ACTION_DIAL, - Uri.parse(uri) - ) - ) - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt new file mode 100644 index 000000000..a44561a30 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt @@ -0,0 +1,159 @@ +package de.rki.coronawarnapp.util + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.fragment.app.Fragment +import de.rki.coronawarnapp.exception.ExceptionCategory +import de.rki.coronawarnapp.exception.ExternalActionException +import de.rki.coronawarnapp.exception.reporting.report + +/** + * Helper object for external actions + * + */ +object ExternalActionHelper { + private val TAG: String? = ExternalActionHelper::class.simpleName + + /** + * Opens the share default overlay to provide the Corona-Warn-App installation link + * + * @param fragment + * @param text + * @param title + */ + fun shareText(fragment: Fragment, text: String, title: String?) { + try { + fragment.startActivity(Intent.createChooser(Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, text) + }, title)) + } catch (exception: Exception) { + // catch generic exception on share + // possibly due to bad share content format + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + + /** + * Opens the client default phone app and inserts a given number + * + * @param fragment + * @param uri + */ + fun call(fragment: Fragment, uri: String) { + try { + fragment.startActivity( + Intent( + Intent.ACTION_DIAL, + Uri.parse("tel:$uri") + ) + ) + } catch (exception: Exception) { + // catch generic exception on call + // possibly due to bad number format + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + + /** + * Opens a given url in the client default browser + * + * @param fragment + * @param url + */ + fun openUrl(fragment: Fragment, url: String) { + try { + fragment.startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(url) + ) + ) + } catch (exception: Exception) { + // catch generic exception on url navigation + // most likely due to bad url format + // or less likely no browser installed + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + + /** + * Navigate the user to the os connection settings. + * + * @param context + */ + fun toConnections(context: Context) { + try { + val intent = Intent(Settings.ACTION_WIRELESS_SETTINGS) + context.startActivity(intent) + } catch (exception: Exception) { + // catch generic exception on settings navigation + // most likely due to device / rom specific intent issue + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + + /** + * Navigate the user to the os notification settings. + * + * @param context + */ + // todo has to be tested on API23 on a device + fun toNotifications(context: Context) { + try { + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + intent.putExtra( + Settings.EXTRA_APP_PACKAGE, + context.packageName + ) + } else { + intent.putExtra( + "app_package", + context.packageName + ) + intent.putExtra("app_uid", context.applicationInfo.uid) + } + context.startActivity(intent) + } catch (exception: Exception) { + // catch generic exception on settings navigation + // most likely due to device / rom specific intent issue + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + + /** + * Navigate the user to the os settings as navigation to + * bluetooth settings directly is not reliable for all devices + * + * @param context + */ + fun toMainSettings(context: Context) { + try { + val intent = Intent(Settings.ACTION_SETTINGS) + context.startActivity(intent) + } catch (exception: Exception) { + // catch generic exception on settings navigation + // most likely due to device / rom specific intent issue + ExternalActionException(exception).report( + ExceptionCategory.UI + ) + } + } + // todo navigate storage settings +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/OpenUrlHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/OpenUrlHelper.kt deleted file mode 100644 index 2705dc00f..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/OpenUrlHelper.kt +++ /dev/null @@ -1,16 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.content.Intent -import android.net.Uri -import androidx.fragment.app.Fragment - -object OpenUrlHelper { - fun navigate(fragment: Fragment, url: String) { - fragment.startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse(url) - ) - ) - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt deleted file mode 100644 index bb2fb34da..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt +++ /dev/null @@ -1,48 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.content.Context -import android.content.Intent -import android.os.Build -import android.provider.Settings - -/** - * A helper to navigate to the os settings, used in different places in the application, - * e.g. settings, notification settings, tracing settings... - */ -object SettingsNavigationHelper { - - /** - * Navigate the user to the os connection settings. - * - * @param context - */ - fun toConnections(context: Context) { - val intent = Intent(Settings.ACTION_WIRELESS_SETTINGS) - context.startActivity(intent) - } - - /** - * Navigate the user to the os notification settings. - * - * @param context - */ - // todo has to be tested on API23 on a device - fun toNotifications(context: Context) { - val intent = Intent() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.putExtra( - Settings.EXTRA_APP_PACKAGE, - context.packageName - ) - } else { - intent.putExtra( - "app_package", - context.packageName - ) - intent.putExtra("app_uid", context.applicationInfo.uid) - } - context.startActivity(intent) - } - // todo navigate storage settings -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ShareHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ShareHelper.kt deleted file mode 100644 index 5a366fdf5..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ShareHelper.kt +++ /dev/null @@ -1,14 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.content.Intent -import androidx.fragment.app.Fragment - -object ShareHelper { - fun shareText(fragment: Fragment, text: String, title: String?) { - fragment.startActivity(Intent.createChooser(Intent().apply { - action = Intent.ACTION_SEND - type = "text/plain" - putExtra(Intent.EXTRA_TEXT, text) - }, title)) - } -} diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_main_illustration_overview.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_main_illustration_overview.xml index ca1ad7d7e..9c0ecc723 100644 --- a/Corona-Warn-App/src/main/res/drawable-night/ic_main_illustration_overview.xml +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_main_illustration_overview.xml @@ -1,101 +1,101 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="361dp" - android:height="220dp" - android:viewportWidth="361" - android:viewportHeight="220"> - <group> - <path - android:fillColor="#1E1E1F" - android:fillType="nonZero" - android:pathData="M205.338,180.759L155.368,180.759C150.281,180.757 146.157,176.621 146.156,171.519L146.169,46.54C146.176,41.443 150.299,37.315 155.381,37.315L205.352,37.315C210.431,37.325 214.543,41.455 214.546,46.549L214.546,171.53C214.544,176.628 210.423,180.759 205.338,180.759Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M205.338,180.759L155.368,180.759C150.281,180.757 146.157,176.621 146.156,171.519L146.169,46.54C146.176,41.443 150.299,37.315 155.381,37.315L205.352,37.315C210.431,37.325 214.543,41.455 214.546,46.549L214.546,171.53C214.544,176.628 210.423,180.759 205.338,180.759Z" - android:strokeWidth="3.567" - android:strokeColor="#4A4A4A" /> - <path - android:fillColor="#4A4A4A" - android:fillType="nonZero" - android:pathData="M155.955,46.483L204.34,46.483A4,4 0,0 1,208.34 50.483L208.34,59.483A4,4 0,0 1,204.34 63.483L155.955,63.483A4,4 0,0 1,151.955 59.483L151.955,50.483A4,4 0,0 1,155.955 46.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#4A4A4A" - android:fillType="nonZero" - android:pathData="M155.955,129.483L204.34,129.483A4,4 0,0 1,208.34 133.483L208.34,169.483A4,4 0,0 1,204.34 173.483L155.955,173.483A4,4 0,0 1,151.955 169.483L151.955,133.483A4,4 0,0 1,155.955 129.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#409CC8" - android:fillType="nonZero" - android:pathData="M158.944,162.483L201.808,162.483A3,3 0,0 1,204.808 165.483L204.808,165.483A3,3 0,0 1,201.808 168.483L158.944,168.483A3,3 0,0 1,155.944 165.483L155.944,165.483A3,3 0,0 1,158.944 162.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#6ACC8B" - android:fillType="nonZero" - android:pathData="M155.955,73.483L204.34,73.483A4,4 0,0 1,208.34 77.483L208.34,115.483A4,4 0,0 1,204.34 119.483L155.955,119.483A4,4 0,0 1,151.955 115.483L151.955,77.483A4,4 0,0 1,155.955 73.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#3F3F43" - android:fillType="nonZero" - android:pathData="M73.548,99.741a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M88.506,98.741C88.506,99.841 87.609,100.741 86.512,100.741L84.517,100.741L84.517,102.741L87.509,102.741C88.057,102.741 88.506,103.191 88.506,103.741C88.506,104.291 88.057,104.741 87.509,104.741L83.52,104.741C82.972,104.741 82.523,104.291 82.523,103.741L82.523,100.741C82.523,99.641 83.42,98.741 84.517,98.741L86.512,98.741L86.512,96.741L83.52,96.741C82.972,96.741 82.523,96.291 82.523,95.741C82.523,95.191 82.972,94.741 83.52,94.741L86.512,94.741C87.609,94.741 88.506,95.641 88.506,96.741L88.506,98.741Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#3F3F43" - android:fillType="nonZero" - android:pathData="M73.548,55a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M86.512,60C85.963,60 85.515,59.55 85.515,59L85.515,52L84.517,52C83.969,52 83.52,51.55 83.52,51C83.52,50.45 83.969,50 84.517,50L86.512,50C87.06,50 87.509,50.45 87.509,51L87.509,59C87.509,59.55 87.06,60 86.512,60Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#3F3F43" - android:fillType="nonZero" - android:pathData="M73.548,144.483a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M88.511,142.983C88.511,143.813 87.843,144.483 87.015,144.483C87.843,144.483 88.511,145.153 88.511,145.983L88.511,147.483C88.511,148.593 87.614,149.483 86.517,149.483L83.515,149.483C82.967,149.483 82.518,149.033 82.518,148.483C82.518,147.933 82.967,147.483 83.515,147.483L86.517,147.483L86.507,145.483L85.51,145.483C84.961,145.483 84.512,145.033 84.512,144.483C84.512,143.933 84.961,143.483 85.51,143.483L86.507,143.483L86.517,141.483L83.515,141.483C82.967,141.483 82.528,141.033 82.528,140.483C82.528,139.933 82.967,139.483 83.515,139.483L86.517,139.483C87.614,139.483 88.511,140.383 88.511,141.483L88.511,142.983Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.958,144.483L137.869,144.483" - android:strokeWidth="1" - android:strokeColor="#3F3F43" - android:strokeLineCap="square" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.958,55L137.869,55" - android:strokeWidth="1" - android:strokeColor="#3F3F43" - android:strokeLineCap="square" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.958,99.741L137.869,99.741" - android:strokeWidth="1" - android:strokeColor="#3F3F43" - android:strokeLineCap="square" /> - </group> + android:width="360dp" + android:height="221dp" + android:viewportWidth="360" + android:viewportHeight="221"> + <group> + <path + android:pathData="M205.338,181.742L155.368,181.742C150.281,181.74 146.157,177.604 146.156,172.502L146.169,47.523C146.176,42.426 150.299,38.298 155.381,38.298L205.352,38.298C210.431,38.308 214.543,42.438 214.546,47.532L214.546,172.513C214.544,177.611 210.423,181.742 205.338,181.742Z" + android:strokeWidth="1" + android:fillColor="#000000" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M205.338,181.742L155.368,181.742C150.281,181.74 146.157,177.604 146.156,172.502L146.169,47.523C146.176,42.426 150.299,38.298 155.381,38.298L205.352,38.298C210.431,38.308 214.543,42.438 214.546,47.532L214.546,172.513C214.544,177.611 210.423,181.742 205.338,181.742Z" + android:strokeWidth="3.567" + android:fillColor="#00000000" + android:strokeColor="#999999" + android:fillType="evenOdd"/> + <path + android:pathData="M155.955,47.466L204.34,47.466A4,4 0,0 1,208.34 51.466L208.34,60.466A4,4 0,0 1,204.34 64.466L155.955,64.466A4,4 0,0 1,151.955 60.466L151.955,51.466A4,4 0,0 1,155.955 47.466z" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M155.955,130.466L204.34,130.466A4,4 0,0 1,208.34 134.466L208.34,170.466A4,4 0,0 1,204.34 174.466L155.955,174.466A4,4 0,0 1,151.955 170.466L151.955,134.466A4,4 0,0 1,155.955 130.466z" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M158.944,163.466L201.808,163.466A3,3 0,0 1,204.808 166.466L204.808,166.466A3,3 0,0 1,201.808 169.466L158.944,169.466A3,3 0,0 1,155.944 166.466L155.944,166.466A3,3 0,0 1,158.944 163.466z" + android:strokeWidth="1" + android:fillColor="#83D2F2" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M155.955,74.466L204.34,74.466A4,4 0,0 1,208.34 78.466L208.34,116.466A4,4 0,0 1,204.34 120.466L155.955,120.466A4,4 0,0 1,151.955 116.466L151.955,78.466A4,4 0,0 1,155.955 74.466z" + android:strokeWidth="1" + android:fillColor="#6ACC8B" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M73.548,100.724a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M88.506,99.724C88.506,100.824 87.609,101.724 86.512,101.724L84.517,101.724L84.517,103.724L87.509,103.724C88.057,103.724 88.506,104.174 88.506,104.724C88.506,105.274 88.057,105.724 87.509,105.724L83.52,105.724C82.972,105.724 82.523,105.274 82.523,104.724L82.523,101.724C82.523,100.624 83.42,99.724 84.517,99.724L86.512,99.724L86.512,97.724L83.52,97.724C82.972,97.724 82.523,97.274 82.523,96.724C82.523,96.174 82.972,95.724 83.52,95.724L86.512,95.724C87.609,95.724 88.506,96.624 88.506,97.724L88.506,99.724Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M73.548,55.983a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M86.512,60.983C85.963,60.983 85.515,60.533 85.515,59.983L85.515,52.983L84.517,52.983C83.969,52.983 83.52,52.533 83.52,51.983C83.52,51.433 83.969,50.983 84.517,50.983L86.512,50.983C87.06,50.983 87.509,51.433 87.509,51.983L87.509,59.983C87.509,60.533 87.06,60.983 86.512,60.983Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M73.548,145.466a11.967,12 0,1 0,23.934 0a11.967,12 0,1 0,-23.934 0z" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M88.511,143.966C88.511,144.796 87.843,145.466 87.015,145.466C87.843,145.466 88.511,146.136 88.511,146.966L88.511,148.466C88.511,149.576 87.614,150.466 86.517,150.466L83.515,150.466C82.967,150.466 82.518,150.016 82.518,149.466C82.518,148.916 82.967,148.466 83.515,148.466L86.517,148.466L86.507,146.466L85.51,146.466C84.961,146.466 84.512,146.016 84.512,145.466C84.512,144.916 84.961,144.466 85.51,144.466L86.507,144.466L86.517,142.466L83.515,142.466C82.967,142.466 82.528,142.016 82.528,141.466C82.528,140.916 82.967,140.466 83.515,140.466L86.517,140.466C87.614,140.466 88.511,141.366 88.511,142.466L88.511,143.966Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M105.958,145.466L137.869,145.466" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#999999" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + <path + android:pathData="M105.958,55.983L137.869,55.983" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#999999" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + <path + android:pathData="M105.958,100.724L137.869,100.724" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#999999" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + </group> </vector> diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_1.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_1.xml index 7671cae68..b63d0e0a1 100644 --- a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_1.xml +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_1.xml @@ -3,16 +3,16 @@ android:height="42dp" android:viewportWidth="40" android:viewportHeight="42"> - <path - android:fillColor="#3F3F43" - android:fillType="evenOdd" - android:pathData="M20,21m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M21,26C20.45,26 20,25.55 20,25L20,18L19,18C18.45,18 18,17.55 18,17C18,16.45 18.45,16 19,16L21,16C21.55,16 22,16.45 22,17L22,25C22,25.55 21.55,26 21,26Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> + <path + android:pathData="M20,21m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M21,26C20.45,26 20,25.55 20,25L20,18L19,18C18.45,18 18,17.55 18,17C18,16.45 18.45,16 19,16L21,16C21.55,16 22,16.45 22,17L22,25C22,25.55 21.55,26 21,26Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> </vector> diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_2.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_2.xml index 2f3a5bd24..acc3008e0 100644 --- a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_2.xml +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_2.xml @@ -3,16 +3,16 @@ android:height="41dp" android:viewportWidth="40" android:viewportHeight="41"> - <path - android:fillColor="#3F3F43" - android:fillType="evenOdd" - android:pathData="M20,20.983m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M23,19.983C23,21.083 22.1,21.983 21,21.983L19,21.983L19,23.983L22,23.983C22.55,23.983 23,24.433 23,24.983C23,25.533 22.55,25.983 22,25.983L18,25.983C17.45,25.983 17,25.533 17,24.983L17,21.983C17,20.883 17.9,19.983 19,19.983L21,19.983L21,17.983L18,17.983C17.45,17.983 17,17.533 17,16.983C17,16.433 17.45,15.983 18,15.983L21,15.983C22.1,15.983 23,16.883 23,17.983L23,19.983Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> + <path + android:pathData="M20,20.983m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M23,19.983C23,21.083 22.1,21.983 21,21.983L19,21.983L19,23.983L22,23.983C22.55,23.983 23,24.433 23,24.983C23,25.533 22.55,25.983 22,25.983L18,25.983C17.45,25.983 17,25.533 17,24.983L17,21.983C17,20.883 17.9,19.983 19,19.983L21,19.983L21,17.983L18,17.983C17.45,17.983 17,17.533 17,16.983C17,16.433 17.45,15.983 18,15.983L21,15.983C22.1,15.983 23,16.883 23,17.983L23,19.983Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> </vector> diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_3.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_3.xml index 0c02d2b30..939b24746 100644 --- a/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_3.xml +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_main_overview_3.xml @@ -3,16 +3,16 @@ android:height="42dp" android:viewportWidth="40" android:viewportHeight="42"> - <path - android:fillColor="#3F3F43" - android:fillType="evenOdd" - android:pathData="M20,21m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M23.005,19.5C23.005,20.33 22.335,21 21.505,21C22.335,21 23.005,21.67 23.005,22.5L23.005,24C23.005,25.11 22.105,26 21.005,26L17.995,26C17.445,26 16.995,25.55 16.995,25C16.995,24.45 17.445,24 17.995,24L21.005,24L20.995,22L19.995,22C19.445,22 18.995,21.55 18.995,21C18.995,20.45 19.445,20 19.995,20L20.995,20L21.005,18L17.995,18C17.445,18 17.005,17.55 17.005,17C17.005,16.45 17.445,16 17.995,16L21.005,16C22.105,16 23.005,16.9 23.005,18L23.005,19.5Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> + <path + android:pathData="M20,21m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#595959" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M23.005,19.5C23.005,20.33 22.335,21 21.505,21C22.335,21 23.005,21.67 23.005,22.5L23.005,24C23.005,25.11 22.105,26 21.005,26L17.995,26C17.445,26 16.995,25.55 16.995,25C16.995,24.45 17.445,24 17.995,24L21.005,24L20.995,22L19.995,22C19.445,22 18.995,21.55 18.995,21C18.995,20.45 19.445,20 19.995,20L20.995,20L21.005,18L17.995,18C17.445,18 17.005,17.55 17.005,17C17.005,16.45 17.445,16 17.995,16L21.005,16C22.105,16 23.005,16.9 23.005,18L23.005,19.5Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> </vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_main_illustration_overview.xml b/Corona-Warn-App/src/main/res/drawable/ic_main_illustration_overview.xml index cb32ad077..f74ff2a09 100644 --- a/Corona-Warn-App/src/main/res/drawable/ic_main_illustration_overview.xml +++ b/Corona-Warn-App/src/main/res/drawable/ic_main_illustration_overview.xml @@ -1,105 +1,113 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="361dp" - android:height="220dp" - android:viewportWidth="361" - android:viewportHeight="220"> - <group> - <clip-path android:pathData="M0.125,0h360v220h-360z" /> - <path - android:fillColor="#FFFFFF" - android:fillType="evenOdd" - android:pathData="M205.156,180.759L155.048,180.759C149.946,180.757 145.811,176.621 145.81,171.519L145.823,46.54C145.83,41.443 149.964,37.315 155.061,37.315L205.17,37.315C210.263,37.325 214.387,41.455 214.39,46.549L214.39,171.53C214.388,176.628 210.255,180.759 205.156,180.759Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M205.156,180.759L155.048,180.759C149.946,180.757 145.811,176.621 145.81,171.519L145.823,46.54C145.83,41.443 149.964,37.315 155.061,37.315L205.17,37.315C210.263,37.325 214.387,41.455 214.39,46.549L214.39,171.53C214.388,176.628 210.255,180.759 205.156,180.759Z" - android:strokeWidth="3.567" - android:strokeColor="#4A4A4A" /> - <path - android:fillColor="#E7E7E7" - android:fillType="evenOdd" - android:pathData="M155.625,46.483L204.167,46.483A4,4 0,0 1,208.167 50.483L208.167,59.483A4,4 0,0 1,204.167 63.483L155.625,63.483A4,4 0,0 1,151.625 59.483L151.625,50.483A4,4 0,0 1,155.625 46.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#E7E7E7" - android:fillType="evenOdd" - android:pathData="M155.625,129.483L204.167,129.483A4,4 0,0 1,208.167 133.483L208.167,169.483A4,4 0,0 1,204.167 173.483L155.625,173.483A4,4 0,0 1,151.625 169.483L151.625,133.483A4,4 0,0 1,155.625 129.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#0088B2" - android:fillType="evenOdd" - android:pathData="M158.625,162.483L201.625,162.483A3,3 0,0 1,204.625 165.483L204.625,165.483A3,3 0,0 1,201.625 168.483L158.625,168.483A3,3 0,0 1,155.625 165.483L155.625,165.483A3,3 0,0 1,158.625 162.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#2E854B" - android:fillType="evenOdd" - android:pathData="M155.625,73.483L204.167,73.483A4,4 0,0 1,208.167 77.483L208.167,115.483A4,4 0,0 1,204.167 119.483L155.625,119.483A4,4 0,0 1,151.625 115.483L151.625,77.483A4,4 0,0 1,155.625 73.483z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#E9F6FF" - android:fillType="evenOdd" - android:pathData="M85,99.741m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#17191A" - android:fillType="nonZero" - android:pathData="M88,98.741C88,99.841 87.1,100.741 86,100.741L84,100.741L84,102.741L87,102.741C87.55,102.741 88,103.191 88,103.741C88,104.291 87.55,104.741 87,104.741L83,104.741C82.45,104.741 82,104.291 82,103.741L82,100.741C82,99.641 82.9,98.741 84,98.741L86,98.741L86,96.741L83,96.741C82.45,96.741 82,96.291 82,95.741C82,95.191 82.45,94.741 83,94.741L86,94.741C87.1,94.741 88,95.641 88,96.741L88,98.741Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#E9F6FF" - android:fillType="evenOdd" - android:pathData="M85,55m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#17191A" - android:fillType="nonZero" - android:pathData="M86,60C85.45,60 85,59.55 85,59L85,52L84,52C83.45,52 83,51.55 83,51C83,50.45 83.45,50 84,50L86,50C86.55,50 87,50.45 87,51L87,59C87,59.55 86.55,60 86,60Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#E9F6FF" - android:fillType="evenOdd" - android:pathData="M85,144.483m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#17191A" - android:fillType="nonZero" - android:pathData="M88.005,142.983C88.005,143.813 87.335,144.483 86.505,144.483C87.335,144.483 88.005,145.153 88.005,145.983L88.005,147.483C88.005,148.593 87.105,149.483 86.005,149.483L82.995,149.483C82.445,149.483 81.995,149.033 81.995,148.483C81.995,147.933 82.445,147.483 82.995,147.483L86.005,147.483L85.995,145.483L84.995,145.483C84.445,145.483 83.995,145.033 83.995,144.483C83.995,143.933 84.445,143.483 84.995,143.483L85.995,143.483L86.005,141.483L82.995,141.483C82.445,141.483 82.005,141.033 82.005,140.483C82.005,139.933 82.445,139.483 82.995,139.483L86.005,139.483C87.105,139.483 88.005,140.383 88.005,141.483L88.005,142.983Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.5,144.483L137.5,144.483" - android:strokeWidth="1" - android:strokeAlpha="0.2" - android:strokeColor="#17191A" - android:strokeLineCap="square" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.5,55L137.5,55" - android:strokeWidth="1" - android:strokeAlpha="0.2" - android:strokeColor="#17191A" - android:strokeLineCap="square" /> - <path - android:fillColor="#00000000" - android:fillType="evenOdd" - android:pathData="M105.5,99.741L137.5,99.741" - android:strokeWidth="1" - android:strokeAlpha="0.2" - android:strokeColor="#17191A" - android:strokeLineCap="square" /> - </group> + android:width="360dp" + android:height="221dp" + android:viewportWidth="360" + android:viewportHeight="221"> + <group> + <clip-path + android:pathData="M0.25,0.983h359.75v220h-359.75z"/> + <path + android:pathData="M195.849,96.341L197.849,96.341L195.849,96.341Z" + android:strokeWidth="1" + android:fillColor="#FF395A" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M205.031,182.759L154.923,182.759C149.821,182.757 145.686,178.621 145.685,173.519L145.698,48.54C145.705,43.443 149.839,39.315 154.936,39.315L205.045,39.315C210.138,39.325 214.262,43.455 214.265,48.549L214.265,173.53C214.263,178.628 210.13,182.759 205.031,182.759Z" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M205.031,182.759L154.923,182.759C149.821,182.757 145.686,178.621 145.685,173.519L145.698,48.54C145.705,43.443 149.839,39.315 154.936,39.315L205.045,39.315C210.138,39.325 214.262,43.455 214.265,48.549L214.265,173.53C214.263,178.628 210.13,182.759 205.031,182.759Z" + android:strokeWidth="3.567" + android:fillColor="#00000000" + android:strokeColor="#4A4A4A" + android:fillType="evenOdd"/> + <path + android:pathData="M155.5,48.483L204.042,48.483A4,4 0,0 1,208.042 52.483L208.042,61.483A4,4 0,0 1,204.042 65.483L155.5,65.483A4,4 0,0 1,151.5 61.483L151.5,52.483A4,4 0,0 1,155.5 48.483z" + android:strokeWidth="1" + android:fillColor="#E7E7E7" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M155.5,131.483L204.042,131.483A4,4 0,0 1,208.042 135.483L208.042,171.483A4,4 0,0 1,204.042 175.483L155.5,175.483A4,4 0,0 1,151.5 171.483L151.5,135.483A4,4 0,0 1,155.5 131.483z" + android:strokeWidth="1" + android:fillColor="#E7E7E7" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M158.5,164.483L201.5,164.483A3,3 0,0 1,204.5 167.483L204.5,167.483A3,3 0,0 1,201.5 170.483L158.5,170.483A3,3 0,0 1,155.5 167.483L155.5,167.483A3,3 0,0 1,158.5 164.483z" + android:strokeWidth="1" + android:fillColor="#0088B2" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M155.5,75.483L204.042,75.483A4,4 0,0 1,208.042 79.483L208.042,117.483A4,4 0,0 1,204.042 121.483L155.5,121.483A4,4 0,0 1,151.5 117.483L151.5,79.483A4,4 0,0 1,155.5 75.483z" + android:strokeWidth="1" + android:fillColor="#2E854B" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + </group> + <group> + <clip-path + android:pathData="M0.25,0.983h359.75v220h-359.75z"/> + <path + android:pathData="M85,101.741m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#E9F6FF" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M88,100.741C88,101.841 87.1,102.741 86,102.741L84,102.741L84,104.741L87,104.741C87.55,104.741 88,105.191 88,105.741C88,106.291 87.55,106.741 87,106.741L83,106.741C82.45,106.741 82,106.291 82,105.741L82,102.741C82,101.641 82.9,100.741 84,100.741L86,100.741L86,98.741L83,98.741C82.45,98.741 82,98.291 82,97.741C82,97.191 82.45,96.741 83,96.741L86,96.741C87.1,96.741 88,97.641 88,98.741L88,100.741Z" + android:strokeWidth="1" + android:fillColor="#17191A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M85,57m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#E9F6FF" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M86,62C85.45,62 85,61.55 85,61L85,54L84,54C83.45,54 83,53.55 83,53C83,52.45 83.45,52 84,52L86,52C86.55,52 87,52.45 87,53L87,61C87,61.55 86.55,62 86,62Z" + android:strokeWidth="1" + android:fillColor="#17191A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M85,146.483m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0" + android:strokeWidth="1" + android:fillColor="#E9F6FF" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + <path + android:pathData="M88.005,144.983C88.005,145.813 87.335,146.483 86.505,146.483C87.335,146.483 88.005,147.153 88.005,147.983L88.005,149.483C88.005,150.593 87.105,151.483 86.005,151.483L82.995,151.483C82.445,151.483 81.995,151.033 81.995,150.483C81.995,149.933 82.445,149.483 82.995,149.483L86.005,149.483L85.995,147.483L84.995,147.483C84.445,147.483 83.995,147.033 83.995,146.483C83.995,145.933 84.445,145.483 84.995,145.483L85.995,145.483L86.005,143.483L82.995,143.483C82.445,143.483 82.005,143.033 82.005,142.483C82.005,141.933 82.445,141.483 82.995,141.483L86.005,141.483C87.105,141.483 88.005,142.383 88.005,143.483L88.005,144.983Z" + android:strokeWidth="1" + android:fillColor="#17191A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M105.5,146.483L137.5,146.483" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#17191A" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + <path + android:pathData="M105.5,57L137.5,57" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#17191A" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + <path + android:pathData="M105.5,101.741L137.5,101.741" + android:strokeWidth="1" + android:fillColor="#00000000" + android:strokeColor="#17191A" + android:fillType="evenOdd" + android:strokeLineCap="square"/> + </group> </vector> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml b/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml index d37251f91..92c15258c 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml @@ -72,7 +72,6 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/main_overview_risk_subtitle" - style="@style/row" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" @@ -81,26 +80,22 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/main_overview_risk"> - <TextView + <include android:id="@+id/main_overview_risk_subtitle_text" - style="@style/headline6" + layout="@layout/include_main_overview_glossary" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/guideline_body_title" - android:focusable="false" - android:text="@string/main_overview_subtitle_risk_levels" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:subtitle="@{@string/main_overview_subtitle_risk_levels}" /> <include android:id="@+id/main_overview_risk_increased_risk" - layout="@layout/include_row" + layout="@layout/include_main_overview_row" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - app:hideDivider="@{true}" - app:iconStart="@{@drawable/ic_main_overview_circle}" + app:icon="@{@drawable/ic_main_overview_circle}" app:iconTint="@{@color/colorSemanticHighRisk}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -109,11 +104,10 @@ <include android:id="@+id/main_overview_risk_low_risk" - layout="@layout/include_row" + layout="@layout/include_main_overview_row" android:layout_width="0dp" android:layout_height="wrap_content" - app:hideDivider="@{true}" - app:iconStart="@{@drawable/ic_main_overview_circle}" + app:icon="@{@drawable/ic_main_overview_circle}" app:iconTint="@{@color/colorSemanticLowRisk}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -122,11 +116,10 @@ <include android:id="@+id/main_overview_risk_unknown_risk" - layout="@layout/include_row" + layout="@layout/include_main_overview_row" android:layout_width="0dp" android:layout_height="wrap_content" - app:hideDivider="@{true}" - app:iconStart="@{@drawable/ic_main_overview_circle}" + app:icon="@{@drawable/ic_main_overview_circle}" app:iconTint="@{@color/colorSemanticNeutralRisk}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml b/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml index d4d5ca870..ca4ae1189 100644 --- a/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml +++ b/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml @@ -4,6 +4,8 @@ <data> + <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + <variable name="subtitle" type="String" /> @@ -45,6 +47,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@{body}" + android:visibility="@{FormatterHelper.formatVisibilityText(body)}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/main_overview_glossary_subtitle" diff --git a/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml b/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml new file mode 100644 index 000000000..ee264f226 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml @@ -0,0 +1,73 @@ +<?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"> + + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + + <variable + name="subtitle" + type="String" /> + + <variable + name="iconTint" + type="Integer" /> + + <variable + name="icon" + type="android.graphics.drawable.Drawable" /> + + + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/main_overview_row" + style="@style/rowOverview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <ImageView + android:layout_width="@dimen/icon_size_main_card" + android:layout_height="@dimen/icon_size_main_card" + android:importantForAccessibility="no" + android:src="@{icon}" + android:tint="@{FormatterHelper.formatColorIcon(iconTint)}" + android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" + app:layout_constraintBottom_toBottomOf="@+id/main_overview_row_subtitle" + app:layout_constraintEnd_toStartOf="@+id/main_overview_row_subtitle" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/main_overview_row_subtitle" /> + + <TextView + android:id="@+id/main_overview_row_subtitle" + style="@style/subtitle" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="@{subtitle}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/guideline_body" + app:layout_constraintTop_toTopOf="parent" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_body" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_begin="@dimen/guideline_body_title" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_row.xml b/Corona-Warn-App/src/main/res/layout/include_row.xml index 385fc741f..17a0cd024 100644 --- a/Corona-Warn-App/src/main/res/layout/include_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_row.xml @@ -6,24 +6,16 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> - <variable - name="tracingViewModel" - type="de.rki.coronawarnapp.ui.viewmodel.TracingViewModel" /> - <variable name="subtitle" type="String" /> - <variable - name="icon" - type="android.graphics.drawable.Drawable" /> - <variable name="iconTint" type="Integer" /> <variable - name="iconStart" + name="icon" type="android.graphics.drawable.Drawable" /> <variable @@ -53,33 +45,22 @@ android:layout_width="@dimen/icon_size_main_card" android:layout_height="@dimen/icon_size_main_card" android:importantForAccessibility="no" - android:src="@{iconStart}" + android:src="@{icon}" android:tint="@{FormatterHelper.formatColorIcon(iconTint)}" - android:visibility="@{FormatterHelper.formatVisibilityIcon(iconStart)}" - app:layout_constraintBottom_toBottomOf="@+id/main_row_item_headline" - app:layout_constraintEnd_toStartOf="@+id/main_row_item_headline" + android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" + app:layout_constraintBottom_toBottomOf="@+id/main_row_item_subtitle" + app:layout_constraintEnd_toStartOf="@+id/main_row_item_subtitle" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/main_row_item_headline" /> + app:layout_constraintTop_toTopOf="@+id/main_row_item_subtitle" /> <TextView - android:id="@+id/main_row_item_headline" + android:id="@+id/main_row_item_subtitle" style="@style/subtitle" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@{subtitle}" - app:layout_constraintEnd_toStartOf="@+id/main_row_item_icon" - app:layout_constraintStart_toEndOf="@+id/guideline_body" - app:layout_constraintTop_toTopOf="parent" /> - - <ImageView - android:id="@+id/main_row_item_icon" - style="@style/icon" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:importantForAccessibility="no" - android:src="@{icon}" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/guideline_body" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.Guideline diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml index 3c52614f9..aa4bbad5f 100644 --- a/Corona-Warn-App/src/main/res/values/dimens.xml +++ b/Corona-Warn-App/src/main/res/values/dimens.xml @@ -63,8 +63,8 @@ <dimen name="radius_card">4dp</dimen> <dimen name="icon_size">20dp</dimen> <dimen name="icon_size_risk_card">40dp</dimen> - <dimen name="icon_size_main_card">35dp</dimen> - <dimen name="icon_size_main_card_end">35dp</dimen> + <dimen name="icon_size_main_card">40dp</dimen> + <dimen name="icon_size_main_card_end">40dp</dimen> <dimen name="icon_size_button">40dp</dimen> <dimen name="icon_size_settings">40dp</dimen> <dimen name="icon_size_risk_details_behavior">25dp</dimen> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 270eea720..8607dc7e6 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -216,7 +216,7 @@ <!-- XBUT: risk card - activate tracing --> <string name="risk_card_button_enable_tracing">Risiko-Ermittlung einschalten</string> <!-- XTXT: risk card - tracing is off, user should activate to get an updated risk level --> - <string name="risk_card_body_tracing_off">Aktivieren Sie die Risiko-Ermittlung, um Ihre heutige Risiko-Einschätzung zu berechnen.</string> + <string name="risk_card_body_tracing_off">Aktivieren Sie die Risiko-Ermittlung, um Ihren heutige Risiko-Einschätzung zu berechnen.</string> <!-- XHED: risk card - low risk headline --> <string name="risk_card_low_risk_headline">Niedriges Risiko</string> <!-- XHED: risk card - increased risk headline --> @@ -981,6 +981,8 @@ <string name="errors_not_enough_device_storage">Sie haben nicht genug Speicherplatz.</string> <!-- XTXT: error dialog - detailed text if there is error with Google API --> <string name="errors_communication_with_api">Fehler bei Kommunikation mit Google API.</string> + <!-- XTXT: error dialog - detailed text if there is an error during external navigation / external action --> + <string name="errors_external_action">Diese Aktion ist aktuell leider nicht verfügbar. Bitte kontaktieren Sie die Hotline.</string> <!-- #################################### Generic Error Messages diff --git a/Corona-Warn-App/src/main/res/values/styles.xml b/Corona-Warn-App/src/main/res/values/styles.xml index 26dde88b1..8dd30ddfe 100644 --- a/Corona-Warn-App/src/main/res/values/styles.xml +++ b/Corona-Warn-App/src/main/res/values/styles.xml @@ -108,6 +108,11 @@ <item name="android:paddingStart">@dimen/match_constraint</item> </style> + <style name="rowOverview" parent="@style/row"> + <item name="android:paddingTop">@dimen/spacing_tiny</item> + <item name="android:paddingBottom">@dimen/spacing_tiny</item> + </style> + <!-- #################################### Card ###################################### --> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt index 23ebd79d7..18c475ede 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt @@ -40,7 +40,7 @@ class SubmitDiagnosisKeysTransactionTest { coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, listOf()) } just Runs runBlocking { - SubmitDiagnosisKeysTransaction.start("123", listOf()) + SubmitDiagnosisKeysTransaction.start("123", listOf()) coVerifyOrder { DiagnosisKeyService.asyncSubmitKeys(authString, listOf()) @@ -64,7 +64,7 @@ class SubmitDiagnosisKeysTransactionTest { coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, capture(testList)) } just Runs runBlocking { - SubmitDiagnosisKeysTransaction.start("123", listOf(key)) + SubmitDiagnosisKeysTransaction.start("123", listOf(key)) coVerifyOrder { DiagnosisKeyService.asyncSubmitKeys(authString, any()) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CallHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt similarity index 78% rename from Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CallHelperTest.kt rename to Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt index f32cd8fc0..bfe5717ab 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CallHelperTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt @@ -9,9 +9,9 @@ import io.mockk.verify import org.junit.Test /** - * CallHelper test. + * ExternalActionHelper test. */ -class CallHelperTest { +class ExternalActionHelperTest { /** * Test activity called. @@ -20,7 +20,7 @@ class CallHelperTest { fun testCall() { val fragment = mockk<Fragment>() every { fragment.startActivity(any()) } just Runs - CallHelper.call(fragment, "+77777777777") + ExternalActionHelper.call(fragment, "+77777777777") verify(exactly = 1) { fragment.startActivity(any()) } } } -- GitLab