From 5456dfe9900cde4ff31bd4041bd4f66accfbcf17 Mon Sep 17 00:00:00 2001 From: harambasicluka <64483219+harambasicluka@users.noreply.github.com> Date: Tue, 2 Jun 2020 10:19:26 +0200 Subject: [PATCH] Bluetooth & connection card (#97) * introduced settings navigation helper * added connection and bluetooth stati to main and tracing settings * moved strings * removed unnecessary backgroundTint Co-authored-by: marcmuschko <marc.muschko@sap.com> --- .../OnboardingNotificationsFragment.kt | 27 +-- .../settings/SettingsNotificationFragment.kt | 16 +- .../ui/settings/SettingsTracingFragment.kt | 64 ++++-- .../coronawarnapp/util/ConnectivityHelper.kt | 18 -- .../util/SettingsNavigationHelper.kt | 60 +++++ .../util/formatter/FormatterSettingsHelper.kt | 215 ++++++++++++++++-- .../util/formatter/TracingStatusHelper.kt | 47 ++++ ...ic_settings_illustration_bluetooth_off.xml | 207 +++++++++++++++++ ...c_settings_illustration_connection_off.xml | 201 ++++++++++++++++ ..._on.xml => ic_settings_tracing_active.xml} | 0 .../ic_settings_tracing_bluetooth.xml | 12 + ...ic_settings_tracing_bluetooth_inactive.xml | 12 + .../ic_settings_tracing_connection.xml | 12 + ...c_settings_tracing_connection_inactive.xml | 12 + ...f.xml => ic_settings_tracing_inactive.xml} | 0 .../src/main/res/layout/fragment_main.xml | 6 +- .../src/main/res/layout/fragment_settings.xml | 2 +- .../fragment_settings_notifications.xml | 8 +- .../res/layout/fragment_settings_tracing.xml | 85 ++++++- .../layout/include_settings_switch_row.xml | 15 +- ...de_submission_status_card_unregistered.xml | 2 +- .../layout/include_tracing_status_card.xml | 96 ++++++++ .../src/main/res/values/strings.xml | 14 +- .../src/main/res/values/styles.xml | 10 + 24 files changed, 1010 insertions(+), 131 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelper.kt create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_bluetooth_off.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_connection_off.xml rename Corona-Warn-App/src/main/res/drawable/{ic_tracing_on.xml => ic_settings_tracing_active.xml} (100%) create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth_inactive.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection_inactive.xml rename Corona-Warn-App/src/main/res/drawable/{ic_tracing_off.xml => ic_settings_tracing_inactive.xml} (100%) create mode 100644 Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt index 4b95d319a..247f6a107 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt @@ -1,10 +1,6 @@ package de.rki.coronawarnapp.ui.onboarding -import android.content.Intent -import android.os.Build import android.os.Bundle -import android.provider.Settings -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -15,6 +11,7 @@ import de.rki.coronawarnapp.databinding.FragmentOnboardingNotificationsBinding import de.rki.coronawarnapp.storage.SettingsRepository import de.rki.coronawarnapp.ui.BaseFragment import de.rki.coronawarnapp.util.DialogHelper +import de.rki.coronawarnapp.util.SettingsNavigationHelper /** * This fragment ask the user if he wants to get notifications and finishes the onboarding afterwards. @@ -83,30 +80,10 @@ class OnboardingNotificationsFragment : BaseFragment() { R.string.onboarding_notifications_dialog_button_positive, R.string.onboarding_notifications_dialog_button_negative, { - navigateToNotificationSettings() + SettingsNavigationHelper.toNotifications(requireContext()) }, { navigateToMain() }) DialogHelper.showDialog(dialog) } - - private fun navigateToNotificationSettings() { - val intent = Intent() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - Log.i(TAG, "current") - intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.putExtra( - Settings.EXTRA_APP_PACKAGE, - requireContext().packageName - ) - } else { - Log.i(TAG, "old") - intent.putExtra( - "app_package", - requireContext().packageName - ) - intent.putExtra("app_uid", requireContext().applicationInfo.uid) - } - startActivity(intent) - } } 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 138624796..77eeeabf7 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 @@ -1,8 +1,6 @@ package de.rki.coronawarnapp.ui.settings -import android.content.Intent import android.os.Bundle -import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,6 +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 /** * This is the setting notification page. Here the user sees his os notifications settings status. @@ -93,18 +92,7 @@ class SettingsNotificationFragment : Fragment() { } // System Settings settingsRow.setOnClickListener { - navigateToSettings() + SettingsNavigationHelper.toNotifications(requireContext()) } } - - private fun navigateToSettings() { - // Todo change to api level 23 - val intent = Intent() - intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.putExtra( - Settings.EXTRA_APP_PACKAGE, - requireContext().packageName - ) - startActivity(intent) - } } 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 e39eaf2a4..7a7064c9e 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 @@ -9,6 +9,7 @@ import android.widget.Toast import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import de.rki.coronawarnapp.databinding.FragmentSettingsTracingBinding +import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.report import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.nearby.InternalExposureNotificationPermissionHelper @@ -17,6 +18,7 @@ import de.rki.coronawarnapp.ui.ViewBlocker 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.worker.BackgroundWorkScheduler import kotlinx.coroutines.launch @@ -57,29 +59,6 @@ class SettingsTracingFragment : BaseFragment(), setButtonOnClickListener() } - private fun setButtonOnClickListener() { - val switch = binding.settingsSwitchRowTracing.settingsSwitchRowSwitch - val row = binding.settingsSwitchRowTracing.settingsSwitchRow - internalExposureNotificationPermissionHelper = - InternalExposureNotificationPermissionHelper(this, this) - switch.setOnCheckedChangeListener { _, _ -> - // android calls this listener also on start, so it has to be verified if the user pressed the switch - if (switch.isPressed) { - ViewBlocker.runAndBlockInteraction(arrayOf(row, switch)) { - startStopTracing() - } - } - } - row.setOnClickListener { - ViewBlocker.runAndBlockInteraction(arrayOf(row, switch)) { - startStopTracing() - } - } - binding.settingsDetailsHeaderTracing.settingsDetailsHeaderButtonBack.buttonIcon.setOnClickListener { - (activity as MainActivity).goBack() - } - } - override fun onResume() { super.onResume() // refresh required data @@ -103,7 +82,7 @@ class SettingsTracingFragment : BaseFragment(), override fun onFailure(exception: Exception?) { tracingViewModel.refreshIsTracingEnabled() - exception?.report(de.rki.coronawarnapp.exception.ExceptionCategory.EXPOSURENOTIFICATION) + exception?.report(ExceptionCategory.EXPOSURENOTIFICATION) // TODO Toast.makeText( requireContext(), @@ -113,6 +92,39 @@ class SettingsTracingFragment : BaseFragment(), tracingViewModel.refreshIsTracingEnabled() } + private fun setButtonOnClickListener() { + val switch = binding.settingsTracingSwitchRow.settingsSwitchRowSwitch + val row = binding.settingsTracingSwitchRow.settingsSwitchRow + internalExposureNotificationPermissionHelper = + InternalExposureNotificationPermissionHelper(this, this) + switch.setOnCheckedChangeListener { _, _ -> + // android calls this listener also on start, so it has to be verified if the user pressed the switch + if (switch.isPressed) { + ViewBlocker.runAndBlockInteraction(arrayOf(row, switch)) { + startStopTracing() + } + } + } + row.setOnClickListener { + ViewBlocker.runAndBlockInteraction(arrayOf(row, switch)) { + // only if the switch is enabled the user is allowed to toggle it, this implements the + // same behaviour if he clicks on the row + if (switch.isEnabled) { + startStopTracing() + } + } + } + binding.settingsTracingHeader.settingsDetailsHeaderButtonBack.buttonIcon.setOnClickListener { + (activity as MainActivity).goBack() + } + binding.settingsTracingStatusBluetooth.tracingStatusCardButton.setOnClickListener { + SettingsNavigationHelper.toBluetooth(requireContext()) + } + binding.settingsTracingStatusConnection.tracingStatusCardButton.setOnClickListener { + SettingsNavigationHelper.toConnections(requireContext()) + } + } + private fun startStopTracing() { if (tracingViewModel.isTracingEnabled.value != null) { // if tracing is enabled when listener is activated it should be disabled @@ -128,7 +140,7 @@ class SettingsTracingFragment : BaseFragment(), tracingViewModel.refreshIsTracingEnabled() } catch (exception: Exception) { exception.report( - de.rki.coronawarnapp.exception.ExceptionCategory.EXPOSURENOTIFICATION, + ExceptionCategory.EXPOSURENOTIFICATION, TAG, null ) @@ -142,5 +154,7 @@ class SettingsTracingFragment : BaseFragment(), internalExposureNotificationPermissionHelper.requestPermissionToStartTracing() } } + tracingViewModel.refreshIsTracingEnabled() + settingsViewModel.refreshBluetoothEnabled() } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ConnectivityHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ConnectivityHelper.kt index cd3fa001e..580b38223 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ConnectivityHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ConnectivityHelper.kt @@ -2,17 +2,14 @@ package de.rki.coronawarnapp.util import android.bluetooth.BluetoothAdapter import android.content.Context -import android.content.Intent import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.provider.Settings import android.util.Log import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.report -// TODO integrate the ConnectivityHelper into the UI logic (e.g. RiskLevelTransaction) object ConnectivityHelper { private val TAG: String? = ConnectivityHelper::class.simpleName @@ -61,21 +58,6 @@ object ConnectivityHelper { return bAdapter.isEnabled } - fun navigateToBluetoothSettings(context: Context, onFailure: () -> Unit? = {}) { - val intent = Intent() - intent.action = Settings.ACTION_BLUETOOTH_SETTINGS - try { - context.startActivity(intent) - } catch (e: Exception) { - e.report( - ExceptionCategory.CONNECTIVITY, - TAG, - null - ) - onFailure() - } - } - abstract class NetworkCallback : ConnectivityManager.NetworkCallback() { abstract fun onNetworkAvailable() 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 new file mode 100644 index 000000000..76ac129ac --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/SettingsNavigationHelper.kt @@ -0,0 +1,60 @@ +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 bluetooth settings. + * + * @param context + */ + fun toBluetooth(context: Context) { + val intent = Intent() + intent.action = Settings.ACTION_BLUETOOTH_SETTINGS + context.startActivity(intent) + } + + /** + * 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/formatter/FormatterSettingsHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt index 5bdb444f9..97c84a7da 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.util.formatter import android.graphics.drawable.Drawable +import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R /*Texter*/ @@ -10,7 +11,7 @@ import de.rki.coronawarnapp.R * Formats the text display of settings item status depending on flag provided * * @param value - * @return + * @return String */ fun formatStatus(value: Boolean): String = formatText( value, @@ -22,9 +23,9 @@ fun formatStatus(value: Boolean): String = formatText( * Formats the main text display of tracing status depending on tracing status * * @param tracing - * @return + * @return String */ -fun formatTracingText(tracing: Boolean): String = formatText( +fun formatTracingStatusText(tracing: Boolean): String = formatText( tracing, R.string.settings_tracing_body_active, R.string.settings_tracing_body_inactive @@ -34,13 +35,24 @@ fun formatTracingText(tracing: Boolean): String = formatText( * Format the settings tracing description text display depending on tracing status * * @param tracing - * @return + * @param bluetooth + * @param connection + * @return String */ -fun formatTracingDescription(tracing: Boolean): String = formatText( - tracing, - R.string.settings_tracing_body_active_description, - R.string.settings_tracing_body_inactive_description -) +fun formatTracingDescription(tracing: Boolean, bluetooth: Boolean, connection: Boolean): String { + val appContext = CoronaWarnApplication.getAppContext() + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.CONNECTION -> + appContext.getString(R.string.settings_tracing_body_connection_inactive) + TracingStatusHelper.BLUETOOTH -> + appContext.getString(R.string.settings_tracing_body_bluetooth_inactive) + TracingStatusHelper.TRACING_ACTIVE -> + appContext.getString(R.string.settings_tracing_body_active) + TracingStatusHelper.TRACING_INACTIVE -> + appContext.getString(R.string.settings_tracing_body_inactive) + else -> "" + } +} /** * Formats the settings notifications title display depending on notifications status @@ -66,47 +78,206 @@ fun formatNotificationsDescription(notifications: Boolean): String = formatText( R.string.settings_notifications_body_inactive ) +/** + * Formats the tracing body depending on the tracing status and the days since last exposure. + * + * @param tracing + * @param daysSinceLastExposure + * @return String + */ +fun formatTracingStatusBody(tracing: Boolean, daysSinceLastExposure: Int): String { + val appContext = CoronaWarnApplication.getAppContext() + val daysArg = daysSinceLastExposure.toString() + return if (tracing) { + appContext.getString(R.string.settings_tracing_status_body_active) + .format(daysArg) + } else { + appContext.getString(R.string.settings_tracing_status_body_inactive) + .format(daysArg) + } +} + /*Styler*/ /** * Formats the settings icon color depending on flag provided * * @param active - * @return + * @return Int */ fun formatIconColor(active: Boolean): Int = formatColor(active, R.color.settingsIconActive, R.color.settingsIconInactive) +/** + * Formats the tracing switch status based on the tracing status + * + * @param tracing + * @param bluetooth + * @param connection + * @return Boolean + */ +fun formatTracingSwitch(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Boolean { + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.TRACING_ACTIVE -> true + else -> false + } +} + +/** + * Formats the tracing switch enabled status based on the tracing status + * + * @param tracing + * @param bluetooth + * @param connection + * @return Boolean + */ +fun formatTracingSwitchEnabled(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Boolean { + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.TRACING_ACTIVE, TracingStatusHelper.TRACING_INACTIVE -> true + else -> false + } +} + /** * Formats the main tracing icon depending on tracing status * * @param tracing - * @return + * @param bluetooth + * @param connection + * @return Drawable */ -fun formatTracingIcon(tracing: Boolean): Drawable? = - formatDrawable(tracing, R.drawable.ic_tracing_on, R.drawable.ic_tracing_off) +fun formatTracingIcon(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Drawable? { + val appContext = CoronaWarnApplication.getAppContext() + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.BLUETOOTH -> + appContext.getDrawable(R.drawable.ic_settings_tracing_bluetooth_inactive) + TracingStatusHelper.CONNECTION -> + appContext.getDrawable(R.drawable.ic_settings_tracing_connection_inactive) + TracingStatusHelper.TRACING_ACTIVE -> + appContext.getDrawable(R.drawable.ic_settings_tracing_active) + else -> + appContext.getDrawable(R.drawable.ic_settings_tracing_inactive) + } +} /** * Formats the main tracing icon color depending on tracing status * * @param tracing - * @return + * @param bluetooth + * @param connection + * @return Int */ -fun formatTracingIconColor(tracing: Boolean): Int = - formatColor(tracing, R.color.tracingIconActive, R.color.tracingIconInactive) +fun formatTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int { + val appContext = CoronaWarnApplication.getAppContext() + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.TRACING_ACTIVE -> + appContext.getColor(R.color.tracingIconActive) + else -> + appContext.getColor(R.color.tracingIconInactive) + } +} /** * Formats the settings tracing details illustration depending on tracing status * * @param tracing - * @return + * @param bluetooth + * @param connection + * @return Drawable */ -fun formatTracingImage(tracing: Boolean): Drawable? = - formatDrawable( - tracing, - R.drawable.ic_settings_illustration_tracing_on, - R.drawable.ic_settings_illustration_tracing_off +fun formatTracingStatusImage(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Drawable? { + val appContext = CoronaWarnApplication.getAppContext() + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.BLUETOOTH -> + appContext.getDrawable(R.drawable.ic_settings_illustration_bluetooth_off) + TracingStatusHelper.CONNECTION -> + appContext.getDrawable(R.drawable.ic_settings_illustration_connection_off) + TracingStatusHelper.TRACING_ACTIVE -> + appContext.getDrawable(R.drawable.ic_settings_illustration_tracing_on) + else -> + appContext.getDrawable(R.drawable.ic_settings_illustration_tracing_off) + } +} + +/** + * Change the visibility of the connection card based on the tracing status. + * + * @param tracing + * @param bluetooth + * @param connection + * @return Int + */ +fun formatTracingStatusConnection(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int = + formatVisibility( + tracingStatusHelper( + tracing, + bluetooth, + connection + ) == TracingStatusHelper.CONNECTION + ) + +/** + * Change the visibility of the bluetooth card based on the tracing status. + * + * @param tracing + * @param bluetooth + * @param connection + * @return Int + */ +fun formatTracingStatusVisibilityBluetooth( + tracing: Boolean, + bluetooth: Boolean, + connection: Boolean +): Int = + formatVisibility( + tracingStatusHelper( + tracing, + bluetooth, + connection + ) == TracingStatusHelper.BLUETOOTH ) +/** + * Change the visibility of the tracing text based on the tracing status. + * + * @param tracing + * @param bluetooth + * @param connection + * @return Int + */ +fun formatTracingStatusVisibilityTracing( + tracing: Boolean, + bluetooth: Boolean, + connection: Boolean +): Int { + val tracingStatus = tracingStatusHelper(tracing, bluetooth, connection) + return formatVisibility( + tracingStatus == TracingStatusHelper.TRACING_ACTIVE || + tracingStatus == TracingStatusHelper.TRACING_INACTIVE + ) +} + +/** + * Change the tracing text in the row based on the tracing status. + * + * @param tracing + * @param bluetooth + * @param connection + * @return String + */ +fun formatTracingStatusText(tracing: Boolean, bluetooth: Boolean, connection: Boolean): String { + val appContext = CoronaWarnApplication.getAppContext() + return when (tracingStatusHelper(tracing, bluetooth, connection)) { + TracingStatusHelper.CONNECTION, TracingStatusHelper.BLUETOOTH -> + appContext.getString(R.string.settings_tracing_status_restricted) + TracingStatusHelper.TRACING_ACTIVE -> + appContext.getString(R.string.settings_tracing_status_active) + TracingStatusHelper.TRACING_INACTIVE -> + appContext.getString(R.string.settings_tracing_status_inactive) + else -> "" + } +} + /** * Formats the settings notifications details illustration depending on notifications status * diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelper.kt new file mode 100644 index 000000000..f7328e1aa --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelper.kt @@ -0,0 +1,47 @@ +package de.rki.coronawarnapp.util.formatter + +/** + * This stati are used for the first row in the main fragment and in the tracing settings, + * to change the ui depending on the different system stati. + */ +object TracingStatusHelper { + const val TRACING_ACTIVE = 0 + const val TRACING_INACTIVE = 1 + const val BLUETOOTH = 2 + const val CONNECTION = 3 +} + +/** + * The following table explains the different stati which can appear in the ui. + * This follows this prioritization: Tracing, Bluetooth, Connection + * Connection will only be relevant in one exact case, Bluetooth is relevant in two different cases, + * but independently from the Connection status. And in every other case Tracing will be shown. + * + * | Tracing | Bluetooth | Connection | Result | + * |---------|-----------|------------|------------| + * | OFF | OFF | ON | TRACING* | + * | OFF | ON | OFF | TRACING* | + * | OFF | ON | ON | TRACING* | + * | OFF | OFF | OFF | TRACING* | + * | ON | ON | ON | TRACING | + * | ON | OFF | ON | BLUETOOTH | + * | ON | OFF | OFF | BLUETOOTH | + * | ON | ON | OFF | CONNECTION | + * *circle has to be disabled via another formatter + * + * @param tracing + * @param bluetooth + * @param connection + * @return Int + */ +fun tracingStatusHelper(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int { + return if (tracing && bluetooth && !connection) { + TracingStatusHelper.CONNECTION + } else if (tracing && !bluetooth) { + TracingStatusHelper.BLUETOOTH + } else if (tracing) { + TracingStatusHelper.TRACING_ACTIVE + } else { + TracingStatusHelper.TRACING_INACTIVE + } +} diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_bluetooth_off.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_bluetooth_off.xml new file mode 100644 index 000000000..326e296d8 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_bluetooth_off.xml @@ -0,0 +1,207 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + 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:fillColor="#EFF4F7" + android:fillType="nonZero" + android:pathData="M272.302,56.233m-19.597,0a19.597,19.597 0,1 1,39.194 0a19.597,19.597 0,1 1,-39.194 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CEDEE7" + android:fillType="nonZero" + android:pathData="M272.302,56.233m-13.634,0a13.634,13.634 0,1 1,27.268 0a13.634,13.634 0,1 1,-27.268 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#EFF4F7" + android:fillType="nonZero" + android:pathData="M98.681,80.98m-20.07,0a20.07,20.07 0,1 1,40.14 0a20.07,20.07 0,1 1,-40.14 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CEDEE7" + android:fillType="nonZero" + android:pathData="M98.681,80.98m-13.966,0a13.966,13.966 0,1 1,27.932 0a13.966,13.966 0,1 1,-27.932 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFC2B0" + android:fillType="evenOdd" + android:pathData="M318.328,61.418C316.524,64.119 316.947,67.721 319.329,69.935C320.998,71.171 322.666,69.703 322.666,67.945C322.452,66.264 322.117,64.602 321.665,62.969C321.356,61.89 320.33,61.7 319.997,60.87" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M306.082,18.233l0.734,8.02l-7.433,0.688l-1.393,-8.517z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M296.363,11.765C296.363,24.843 309.002,24.288 309.319,11.765C309.144,-1.115 296.522,-1.082 296.363,11.765" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#8D8D99" + android:fillType="evenOdd" + android:pathData="M314.107,62.496C323.05,64.213 311.763,125.12 311.137,135.479L307.8,135.578C307.275,135.429 305.515,77.316 304.105,78.353C302.248,84.653 300.042,90.847 297.498,96.906C296.58,109.785 296.722,123.312 295.354,135.885L291.842,136.714C290.507,137.17 288.905,97.055 288.455,96.773L290.841,78.652C291.183,78.37 293.302,62.496 294.662,63.251L314.082,62.512" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#B2DBF0" + android:fillType="evenOdd" + android:pathData="M275.224,58.656C273.706,59.212 270.753,55.438 272.855,54.393C277.76,51.955 281.84,44.748 282.315,44.217C285.519,40.336 288.855,31.287 292.534,26.942C295.512,24.454 296.197,25.067 299.4,24.337C301.068,27.464 304.664,26.403 306.691,24.926C306.808,24.86 307.275,24.926 307.342,24.926C323.192,24.669 322.958,51.864 320.205,62.189C319.805,62.338 319.538,62.687 317.611,62.413C317.611,62.413 316.985,54.435 316.977,54.435C316.585,51.117 315.392,38.677 313.915,36.803C314.199,43.379 315.5,54.559 316.284,62.736C316.284,63.002 315.867,63.275 315.6,63.275L294.878,63.533C294.628,63.533 293.944,62.977 293.944,62.703C293.794,54.302 294.828,44.209 293.994,36.587C291.809,40.825 280.171,56.856 275.224,58.648" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M307.825,134.765L311.388,135.213C311.479,135.213 312.464,138.622 312.831,140.115C313.365,141.873 312.831,144.261 311.212,145.091C309.828,145.854 308.76,146.559 307.292,145.091C305.823,143.623 305.573,142.702 306.19,140.164C306.808,137.627 307.767,134.765 307.767,134.732" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M284.784,140.546L289.965,137.933L295.88,131.34C298.207,133.397 297.94,135.022 297.94,135.022C297.94,136.076 296.981,142.777 296.981,142.777L295.996,142.777L294.962,137.096C290.666,144.8 294.962,142.395 283.934,142.777C283.801,141.939 284.117,141.094 284.768,140.546" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M297.356,14.709C296.18,17.081 301.36,21.476 299.742,24.371C298.991,26.295 291.441,29.347 291.4,24.877C298.115,24.321 291.525,14.145 293.686,8.737C294.42,3.073 303.554,-1.704 308.109,2.716C315.659,8.887 306.549,23.102 314.724,24.959C314.382,29.886 307.091,26.386 305.815,23.649C304.046,18.922 311.655,16.326 307.767,7.427C306.427,10.069 304.146,12.12 301.369,13.183" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M276.159,62.131C276.217,62.521 271.787,61.144 271.654,61.177C270.82,61.517 268.501,51.308 268.192,50.893C268.008,50.769 268.45,49.989 268.926,49.939L273.039,50.611C274.24,49.956 276.125,60.887 276.509,61.293C276.659,61.708 276.417,61.899 276.159,62.123" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M269.251,55.355C269.668,55.007 270.002,56.466 270.703,56.583C271.475,56.707 272.184,57.08 272.722,57.644C276.234,63.673 265.781,61.973 269.251,55.355" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="evenOdd" + android:pathData="M80.554,50.641C80.554,50.641 89.616,65.136 95.26,75.266C95.659,75.978 98.004,79.548 98.128,80.236C98.128,80.236 97.688,85.205 95.535,84.021C88.46,76.094 77.229,57.971 73.904,54.493C70.138,50.558 80.554,50.641 80.554,50.641Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M65.125,170.891L55.797,163.934C54.211,163.316 52.482,163.158 50.809,163.478C49.978,163.652 49.895,163.047 49.912,163.801L48.964,166.891C48.083,168.953 48.448,170.535 50.809,171.438C54.226,172.374 61.982,176.457 65.457,173.873C66.97,173.111 67.12,171.653 65.158,170.891" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M83.597,168.357L73.288,162.145C71.778,161.705 70.168,161.734 68.675,162.227C67.843,162.476 67.951,161.888 67.802,162.625L67.112,165.797C66.422,167.918 67.112,169.392 69.514,170.088L78.825,172.076C81.319,172.506 88.377,170.419 83.597,168.357" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#8C8C99" + android:fillType="nonZero" + android:pathData="M47.908,83.963C48.108,81.163 76.896,80.277 77.088,84.667C78.858,125.129 77.171,152.652 74.419,161.78C74.373,161.931 74.308,162.075 74.228,162.211C73.214,163.727 70.903,163.751 68.899,162.791C68.212,162.445 67.797,161.726 67.843,160.96C68.392,150.06 67.278,127.092 63.138,105.391C63.08,105.092 63.013,104.388 62.98,104.695C62.98,104.695 56.329,161.068 56.221,164.911C56.163,167.181 52.896,167.636 51.607,166.858C51.183,166.592 49.862,165.541 49.82,164.944C48.349,144.129 46.96,97.124 47.908,83.963Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="nonZero" + android:pathData="M73.072,22.314C73.787,7.554 46.802,13.344 57.734,29.321C59.306,31.682 60.694,35.235 64.185,36.039L65.291,25.933C68.758,23.49 71.9,21.593 73.072,22.314Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M58.325,25.362C56.28,24.293 55.914,26.778 56.762,28.468C57.385,29.777 59.214,31.442 59.488,29.57C59.214,28.849 59.081,25.834 58.325,25.362Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M93.939,88.485C93.872,88.933 98.868,87.376 99.018,87.417C99.941,87.798 102.568,76.268 102.917,75.821C103.125,75.688 102.626,74.802 102.086,74.752L97.455,75.498C96.092,74.769 93.972,87.094 93.54,87.574C93.382,88.013 93.648,88.237 93.939,88.485Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M101.72,80.84C101.254,80.443 100.888,82.091 100.057,82.224C99.186,82.364 98.385,82.786 97.779,83.425C93.855,90.233 105.635,88.311 101.72,80.84Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M48.199,90.788C47.093,89.38 45.057,86.771 43.211,84.377C36.91,76.252 47.642,64.068 52.663,58.046L44.724,53.623C34.89,74.247 29.12,79.399 45.639,93.728C46.146,97.671 53.794,99.949 55.373,95.675C55.872,92.619 51.317,90.25 48.199,90.788Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#B1DAEF" + android:fillType="evenOdd" + android:pathData="M74.968,41.629C71.642,38.159 66.056,38.755 60.835,38.441C57.137,39.22 53.561,40.491 50.203,42.218C49.58,42.508 49.003,42.888 48.49,43.344C47.357,44.169 46.429,45.243 45.78,46.483C40.343,54.352 35.879,69.899 34.308,75.158C33.643,77.403 40.385,79.813 41.79,78.471C44.508,75.871 47.659,64.631 47.659,64.631L47.709,87.293C47.709,87.952 48.086,88.553 48.681,88.842C55.581,92.155 70.994,91.045 76.115,88.701C76.816,88.377 77.275,87.689 77.304,86.92L77.528,79.987C77.761,73.146 77.57,67.604 77.753,60.175L82.674,69.12C83.095,69.776 83.769,70.232 84.536,70.379C87.524,70.316 90.123,68.322 90.946,65.459C91.361,64.291 81.336,47.477 74.968,41.629Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="evenOdd" + android:pathData="M64.061,42.391C64.945,42.542 65.852,42.308 66.552,41.749C67.253,41.191 67.68,40.36 67.727,39.468L68.084,30.033C68.114,29.227 67.82,28.442 67.268,27.852C66.716,27.262 65.951,26.914 65.141,26.886C64.253,26.723 63.338,26.948 62.628,27.505C61.918,28.061 61.483,28.895 61.434,29.793L59.771,38.822C59.713,40.478 62.365,42.333 64.044,42.391" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M73.072,22.297C72.524,16.499 64.684,17.054 59.846,20.641C59.463,22.119 58.957,23.562 58.333,24.956C58.74,26.994 58.981,30.216 59.721,32.137C60.935,34.042 65.058,37.579 67.785,37.314C72.565,35.409 73.629,25.751 73.072,22.297Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="nonZero" + android:pathData="M72.84,20.21C72.84,20.21 75.566,13.642 72.241,12.085C70.056,11.127 67.568,11.127 65.383,12.085C63.213,13.161 61.567,12.432 59.804,13.609C54.243,17.377 54.251,20.575 56.163,26.29C56.446,25.064 56.828,25.147 57.369,24.236C58.757,25.967 59.106,25.619 59.173,28.609C59.173,29.247 59.447,30.116 59.106,30.456C58.607,30.953 59.397,31.897 59.555,32.187C60.769,34.092 64.335,38.283 67.818,37.985C70.188,37.778 71.385,33.57 72.307,30.754C71.185,33.554 71.094,30.613 69.381,30.754C68.417,30.862 65.391,30.307 64.676,31.193C64.22,31.787 63.387,31.941 62.747,31.549C61.589,31.094 60.719,30.115 60.403,28.915C60.32,28.435 60.228,28.004 60.153,27.607C60.153,27.424 60.104,27.25 60.079,27.06L60.079,27.06C59.788,25.403 59.804,24.194 61.043,21.908C60.942,21.155 61.15,20.394 61.619,19.795C62.088,19.197 62.78,18.812 63.537,18.727C63.537,18.653 63.537,18.595 63.446,18.545C66.673,17.769 70.079,18.373 72.84,20.21L72.84,20.21ZM65.856,31.69L69.306,31.74C69.98,31.74 69.705,32.568 69.589,32.99C69.115,34.929 65.782,34.647 65.366,32.792C65.225,32.386 65.266,31.69 65.856,31.69Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M188.867,221.031C188.187,213.401 187.706,205.763 186.786,198.142C184.862,182.276 182.224,166.511 179.911,150.695C171.858,149.659 166.251,148.97 166.251,148.97C166.251,148.97 151.431,146.607 151.224,153.399C151.017,160.191 167.728,163.633 167.728,163.633L169.079,163.633L170.274,173.51C170.274,173.51 157.228,189.268 158.165,194.526C159.103,199.784 167.288,197.495 167.288,197.495C167.288,197.495 162.478,211.834 166.169,215.616C168.872,218.394 171.601,217.175 171.601,217.175C171.601,217.175 164.759,223.378 167.844,228.902C169.196,231.331 177.165,232.036 177.165,232.036L190.045,231.63C189.195,228.163 188.805,224.6 188.884,221.031" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="evenOdd" + android:pathData="M193.296,260.706C188.431,261.386 183.934,257.999 183.244,253.135L166.492,133.935C165.812,129.069 169.2,124.572 174.064,123.883L221.842,117.174C226.708,116.489 231.208,119.879 231.893,124.746L248.646,243.937C249.325,248.805 245.933,253.304 241.066,253.989L193.296,260.706Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#00000000" + android:fillType="evenOdd" + android:pathData="M241.397,253.947L193.619,260.665C188.753,261.344 184.257,257.951 183.576,253.085L166.824,133.893C166.493,131.556 167.105,129.183 168.525,127.297C169.946,125.412 172.058,124.168 174.395,123.842L222.165,117.124C227.03,116.444 231.527,119.832 232.217,124.696L248.961,243.871C249.297,246.211 248.688,248.588 247.269,250.478C245.85,252.369 243.738,253.617 241.397,253.947Z" + android:strokeWidth="4.03" + android:strokeColor="#4A4A4A" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M285.626,209.744C285.626,209.744 279.281,208.085 272.804,198.415C266.327,188.745 260.364,165.549 256.093,163.069C256.093,163.069 254.526,142.808 244.126,141.282C244.126,141.282 240.809,126.612 239.73,126.578C238.652,126.545 232.98,126.404 231.271,133.561C229.563,140.719 231.769,153.863 238.561,157.678C238.561,157.678 250.462,241.623 250.479,241.872C250.81,248.631 250.139,248.283 249.226,250.589C257.321,252.629 300.462,265.641 335.941,276.422L335.941,221.048L285.626,209.744Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C00F2D" + android:fillType="nonZero" + android:pathData="M215.558,173.504L201.988,163.278L203.342,172.915L204.074,178.118L188.061,166.049L185.807,169.042L203.935,182.703L196.622,192.407L199.614,194.662L205.332,187.073L207.418,201.912L215.405,191.389L223.853,197.744L226.124,194.724L209.181,181.966L211.453,178.95L215.558,173.504ZM206.957,171.712L210.312,174.241L208.426,176.726L207.573,176.102L206.957,171.712ZM209.869,192.435L209.042,186.552L212.397,189.08L209.869,192.435Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M201.102,175.861l2.24,-2.947l8.111,6.036l-2.147,3.13z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_connection_off.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_connection_off.xml new file mode 100644 index 000000000..01661cf05 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_illustration_connection_off.xml @@ -0,0 +1,201 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + 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:fillColor="#EFF4F7" + android:fillType="nonZero" + android:pathData="M272.302,56.233m-19.597,0a19.597,19.597 0,1 1,39.194 0a19.597,19.597 0,1 1,-39.194 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CEDEE7" + android:fillType="nonZero" + android:pathData="M272.302,56.233m-13.634,0a13.634,13.634 0,1 1,27.268 0a13.634,13.634 0,1 1,-27.268 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#EFF4F7" + android:fillType="nonZero" + android:pathData="M98.681,80.98m-20.07,0a20.07,20.07 0,1 1,40.14 0a20.07,20.07 0,1 1,-40.14 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CEDEE7" + android:fillType="nonZero" + android:pathData="M98.681,80.98m-13.966,0a13.966,13.966 0,1 1,27.932 0a13.966,13.966 0,1 1,-27.932 0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFC2B0" + android:fillType="evenOdd" + android:pathData="M318.328,61.418C316.524,64.119 316.947,67.721 319.329,69.935C320.998,71.171 322.666,69.703 322.666,67.945C322.452,66.264 322.117,64.602 321.665,62.969C321.356,61.89 320.33,61.7 319.997,60.87" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M306.082,18.233l0.734,8.02l-7.433,0.688l-1.393,-8.517z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M296.363,11.765C296.363,24.843 309.002,24.288 309.319,11.765C309.144,-1.115 296.522,-1.082 296.363,11.765" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#8D8D99" + android:fillType="evenOdd" + android:pathData="M314.107,62.496C323.05,64.213 311.763,125.12 311.137,135.479L307.8,135.578C307.275,135.429 305.515,77.316 304.105,78.353C302.248,84.653 300.042,90.847 297.498,96.906C296.58,109.785 296.722,123.312 295.354,135.885L291.842,136.714C290.507,137.17 288.905,97.055 288.455,96.773L290.841,78.652C291.183,78.37 293.302,62.496 294.662,63.251L314.082,62.512" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#B2DBF0" + android:fillType="evenOdd" + android:pathData="M275.224,58.656C273.706,59.212 270.753,55.438 272.855,54.393C277.76,51.955 281.84,44.748 282.315,44.217C285.519,40.336 288.855,31.287 292.534,26.942C295.512,24.454 296.197,25.067 299.4,24.337C301.068,27.464 304.664,26.403 306.691,24.926C306.808,24.86 307.275,24.926 307.342,24.926C323.192,24.669 322.958,51.864 320.205,62.189C319.805,62.338 319.538,62.687 317.611,62.413C317.611,62.413 316.985,54.435 316.977,54.435C316.585,51.117 315.392,38.677 313.915,36.803C314.199,43.379 315.5,54.559 316.284,62.736C316.284,63.002 315.867,63.275 315.6,63.275L294.878,63.533C294.628,63.533 293.944,62.977 293.944,62.703C293.794,54.302 294.828,44.209 293.994,36.587C291.809,40.825 280.171,56.856 275.224,58.648" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M307.825,134.765L311.388,135.213C311.479,135.213 312.464,138.622 312.831,140.115C313.365,141.873 312.831,144.261 311.212,145.091C309.828,145.854 308.76,146.559 307.292,145.091C305.823,143.623 305.573,142.702 306.19,140.164C306.808,137.627 307.767,134.765 307.767,134.732" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M284.784,140.546L289.965,137.933L295.88,131.34C298.207,133.397 297.94,135.022 297.94,135.022C297.94,136.076 296.981,142.777 296.981,142.777L295.996,142.777L294.962,137.096C290.666,144.8 294.962,142.395 283.934,142.777C283.801,141.939 284.117,141.094 284.768,140.546" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M297.356,14.709C296.18,17.081 301.36,21.476 299.742,24.371C298.991,26.295 291.441,29.347 291.4,24.877C298.115,24.321 291.525,14.145 293.686,8.737C294.42,3.073 303.554,-1.704 308.109,2.716C315.659,8.887 306.549,23.102 314.724,24.959C314.382,29.886 307.091,26.386 305.815,23.649C304.046,18.922 311.655,16.326 307.767,7.427C306.427,10.069 304.146,12.12 301.369,13.183" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M276.159,62.131C276.217,62.521 271.787,61.144 271.654,61.177C270.82,61.517 268.501,51.308 268.192,50.893C268.008,50.769 268.45,49.989 268.926,49.939L273.039,50.611C274.24,49.956 276.125,60.887 276.509,61.293C276.659,61.708 276.417,61.899 276.159,62.123" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M269.251,55.355C269.668,55.007 270.002,56.466 270.703,56.583C271.475,56.707 272.184,57.08 272.722,57.644C276.234,63.673 265.781,61.973 269.251,55.355" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="evenOdd" + android:pathData="M80.554,50.641C80.554,50.641 89.616,65.136 95.26,75.266C95.659,75.978 98.004,79.548 98.128,80.236C98.128,80.236 97.688,85.205 95.535,84.021C88.46,76.094 77.229,57.971 73.904,54.493C70.138,50.558 80.554,50.641 80.554,50.641Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M65.125,170.891L55.797,163.934C54.211,163.316 52.482,163.158 50.809,163.478C49.978,163.652 49.895,163.047 49.912,163.801L48.964,166.891C48.083,168.953 48.448,170.535 50.809,171.438C54.226,172.374 61.982,176.457 65.457,173.873C66.97,173.111 67.12,171.653 65.158,170.891" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M83.597,168.357L73.288,162.145C71.778,161.705 70.168,161.734 68.675,162.227C67.843,162.476 67.951,161.888 67.802,162.625L67.112,165.797C66.422,167.918 67.112,169.392 69.514,170.088L78.825,172.076C81.319,172.506 88.377,170.419 83.597,168.357" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#8C8C99" + android:fillType="nonZero" + android:pathData="M47.908,83.963C48.108,81.163 76.896,80.277 77.088,84.667C78.858,125.129 77.171,152.652 74.419,161.78C74.373,161.931 74.308,162.075 74.228,162.211C73.214,163.727 70.903,163.751 68.899,162.791C68.212,162.445 67.797,161.726 67.843,160.96C68.392,150.06 67.278,127.092 63.138,105.391C63.08,105.092 63.013,104.388 62.98,104.695C62.98,104.695 56.329,161.068 56.221,164.911C56.163,167.181 52.896,167.636 51.607,166.858C51.183,166.592 49.862,165.541 49.82,164.944C48.349,144.129 46.96,97.124 47.908,83.963Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="nonZero" + android:pathData="M73.072,22.314C73.787,7.554 46.802,13.344 57.734,29.321C59.306,31.682 60.694,35.235 64.185,36.039L65.291,25.933C68.758,23.49 71.9,21.593 73.072,22.314Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M58.325,25.362C56.28,24.293 55.914,26.778 56.762,28.468C57.385,29.777 59.214,31.442 59.488,29.57C59.214,28.849 59.081,25.834 58.325,25.362Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="evenOdd" + android:pathData="M93.939,88.485C93.872,88.933 98.868,87.376 99.018,87.417C99.941,87.798 102.568,76.268 102.917,75.821C103.125,75.688 102.626,74.802 102.086,74.752L97.455,75.498C96.092,74.769 93.972,87.094 93.54,87.574C93.382,88.013 93.648,88.237 93.939,88.485Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M101.72,80.84C101.254,80.443 100.888,82.091 100.057,82.224C99.186,82.364 98.385,82.786 97.779,83.425C93.855,90.233 105.635,88.311 101.72,80.84Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M48.199,90.788C47.093,89.38 45.057,86.771 43.211,84.377C36.91,76.252 47.642,64.068 52.663,58.046L44.724,53.623C34.89,74.247 29.12,79.399 45.639,93.728C46.146,97.671 53.794,99.949 55.373,95.675C55.872,92.619 51.317,90.25 48.199,90.788Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#B1DAEF" + android:fillType="evenOdd" + android:pathData="M74.968,41.629C71.642,38.159 66.056,38.755 60.835,38.441C57.137,39.22 53.561,40.491 50.203,42.218C49.58,42.508 49.003,42.888 48.49,43.344C47.357,44.169 46.429,45.243 45.78,46.483C40.343,54.352 35.879,69.899 34.308,75.158C33.643,77.403 40.385,79.813 41.79,78.471C44.508,75.871 47.659,64.631 47.659,64.631L47.709,87.293C47.709,87.952 48.086,88.553 48.681,88.842C55.581,92.155 70.994,91.045 76.115,88.701C76.816,88.377 77.275,87.689 77.304,86.92L77.528,79.987C77.761,73.146 77.57,67.604 77.753,60.175L82.674,69.12C83.095,69.776 83.769,70.232 84.536,70.379C87.524,70.316 90.123,68.322 90.946,65.459C91.361,64.291 81.336,47.477 74.968,41.629Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="evenOdd" + android:pathData="M64.061,42.391C64.945,42.542 65.852,42.308 66.552,41.749C67.253,41.191 67.68,40.36 67.727,39.468L68.084,30.033C68.114,29.227 67.82,28.442 67.268,27.852C66.716,27.262 65.951,26.914 65.141,26.886C64.253,26.723 63.338,26.948 62.628,27.505C61.918,28.061 61.483,28.895 61.434,29.793L59.771,38.822C59.713,40.478 62.365,42.333 64.044,42.391" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CB8E75" + android:fillType="nonZero" + android:pathData="M73.072,22.297C72.524,16.499 64.684,17.054 59.846,20.641C59.463,22.119 58.957,23.562 58.333,24.956C58.74,26.994 58.981,30.216 59.721,32.137C60.935,34.042 65.058,37.579 67.785,37.314C72.565,35.409 73.629,25.751 73.072,22.297Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#4A4A4A" + android:fillType="nonZero" + android:pathData="M72.84,20.21C72.84,20.21 75.566,13.642 72.241,12.085C70.056,11.127 67.568,11.127 65.383,12.085C63.213,13.161 61.567,12.432 59.804,13.609C54.243,17.377 54.251,20.575 56.163,26.29C56.446,25.064 56.828,25.147 57.369,24.236C58.757,25.967 59.106,25.619 59.173,28.609C59.173,29.247 59.447,30.116 59.106,30.456C58.607,30.953 59.397,31.897 59.555,32.187C60.769,34.092 64.335,38.283 67.818,37.985C70.188,37.778 71.385,33.57 72.307,30.754C71.185,33.554 71.094,30.613 69.381,30.754C68.417,30.862 65.391,30.307 64.676,31.193C64.22,31.787 63.387,31.941 62.747,31.549C61.589,31.094 60.719,30.115 60.403,28.915C60.32,28.435 60.228,28.004 60.153,27.607C60.153,27.424 60.104,27.25 60.079,27.06L60.079,27.06C59.788,25.403 59.804,24.194 61.043,21.908C60.942,21.155 61.15,20.394 61.619,19.795C62.088,19.197 62.78,18.812 63.537,18.727C63.537,18.653 63.537,18.595 63.446,18.545C66.673,17.769 70.079,18.373 72.84,20.21L72.84,20.21ZM65.856,31.69L69.306,31.74C69.98,31.74 69.705,32.568 69.589,32.99C69.115,34.929 65.782,34.647 65.366,32.792C65.225,32.386 65.266,31.69 65.856,31.69Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M188.867,221.031C188.187,213.401 187.706,205.763 186.786,198.142C184.862,182.276 182.224,166.511 179.911,150.695C171.858,149.659 166.251,148.97 166.251,148.97C166.251,148.97 151.431,146.607 151.224,153.399C151.017,160.191 167.728,163.633 167.728,163.633L169.079,163.633L170.274,173.51C170.274,173.51 157.228,189.268 158.165,194.526C159.103,199.784 167.288,197.495 167.288,197.495C167.288,197.495 162.478,211.834 166.169,215.616C168.872,218.394 171.601,217.175 171.601,217.175C171.601,217.175 164.759,223.378 167.844,228.902C169.196,231.331 177.165,232.036 177.165,232.036L190.045,231.63C189.195,228.163 188.805,224.6 188.884,221.031" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="evenOdd" + android:pathData="M193.296,260.706C188.431,261.386 183.934,257.999 183.244,253.135L166.492,133.935C165.812,129.069 169.2,124.572 174.064,123.883L221.842,117.174C226.708,116.489 231.208,119.879 231.893,124.746L248.646,243.937C249.325,248.805 245.933,253.304 241.066,253.989L193.296,260.706Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#00000000" + android:fillType="evenOdd" + android:pathData="M241.397,253.947L193.619,260.665C188.753,261.344 184.257,257.951 183.576,253.085L166.824,133.893C166.493,131.556 167.105,129.183 168.525,127.297C169.946,125.412 172.058,124.168 174.395,123.842L222.165,117.124C227.03,116.444 231.527,119.832 232.217,124.696L248.961,243.871C249.297,246.211 248.688,248.588 247.269,250.478C245.85,252.369 243.738,253.617 241.397,253.947Z" + android:strokeWidth="4.03" + android:strokeColor="#4A4A4A" /> + <path + android:fillColor="#F7B994" + android:fillType="evenOdd" + android:pathData="M285.626,209.744C285.626,209.744 279.281,208.085 272.804,198.415C266.327,188.745 260.364,165.549 256.093,163.069C256.093,163.069 254.526,142.808 244.126,141.282C244.126,141.282 240.809,126.612 239.73,126.578C238.652,126.545 232.98,126.404 231.271,133.561C229.563,140.719 231.769,153.863 238.561,157.678C238.561,157.678 250.462,241.623 250.479,241.872C250.81,248.631 250.139,248.283 249.226,250.589C257.321,252.629 300.462,265.641 335.941,276.422L335.941,221.048L285.626,209.744Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C00F2D" + android:fillType="nonZero" + android:pathData="M188.271,166.198L186.039,169.16L192.167,173.777C189.75,175.466 187.611,177.501 185.853,179.832L189.923,182.899C191.834,180.631 194.175,178.732 196.818,177.282L200.119,179.77C197.303,181.014 194.837,182.852 192.881,185.128L197.323,188.476C199.422,186.149 202.265,184.48 205.539,183.854L210.362,187.488C209.208,187.27 208.005,187.219 206.779,187.392C204.208,187.753 201.974,188.979 200.305,190.723L208.069,196.573L213.266,189.676L223.738,197.568L225.969,194.606L188.271,166.198ZM204.198,169.029C202.632,169.249 201.13,169.624 199.669,170.086L205.507,174.488C211.429,173.791 217.121,175.321 221.743,178.428L224.807,174.362C219.122,170.076 211.804,167.96 204.198,169.029ZM210.349,178.134L217.757,183.717L219.511,181.389C216.804,179.607 213.672,178.471 210.349,178.134Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_tracing_on.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_active.xml similarity index 100% rename from Corona-Warn-App/src/main/res/drawable/ic_tracing_on.xml rename to Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_active.xml diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth.xml new file mode 100644 index 000000000..66c42c5e8 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="42dp" + android:height="42dp" + android:viewportWidth="42" + android:viewportHeight="42"> + <path + android:fillColor="#0071F0" + android:fillType="evenOdd" + android:pathData="M21,1C32.0457,1 41,9.9543 41,21C41,32.0457 32.0457,41 21,41C9.9543,41 1,32.0457 1,21C1,9.9543 9.9543,1 21,1ZM20.2935,10.586L20.2935,18.586L16.7245,15.016L15.3105,16.431L19.8795,21L15.2925,25.587L16.7065,27.001L20.2935,23.414L20.2935,31.414L26.7075,25L22.7075,21L26.7075,17L20.2935,10.586ZM22.2935,23.414L23.8795,25L22.2935,26.586L22.2935,23.414ZM22.2935,15.414L23.8795,17L22.2935,18.586L22.2935,15.414Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth_inactive.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth_inactive.xml new file mode 100644 index 000000000..c241107eb --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_bluetooth_inactive.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="22dp" + android:height="22dp" + android:viewportWidth="22" + android:viewportHeight="22"> + <path + android:fillColor="#C00F2D" + android:fillType="nonZero" + android:pathData="M2.414,1.43L8.566,7.583L8.5655,7.5846L12.397,11.412L12.397,11.414L20.4068,19.4179L18.9816,20.8458L14.9877,16.8581L9.983,21.828L9.983,13.828L6.396,17.415L4.982,16.001L9.569,11.414L1,2.845L2.414,1.43ZM11.983,13.828L11.983,17L13.569,15.414L11.983,13.828ZM9.983,1L16.397,7.414L13.8225,9.9885L13.812,9.998L12.236,8.44L12.3872,8.5875L13.569,7.414L11.983,5.828L11.983,8.19L9.982,6.212L9.983,1Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection.xml new file mode 100644 index 000000000..734f6ebf8 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="42dp" + android:height="42dp" + android:viewportWidth="42" + android:viewportHeight="42"> + <path + android:fillColor="#0071F0" + android:fillType="evenOdd" + android:pathData="M21,1C32.0457,1 41,9.9543 41,21C41,32.0457 32.0457,41 21,41C9.9543,41 1,32.0457 1,21C1,9.9543 9.9543,1 21,1ZM21.001,23.5C19.601,23.5 18.3159,23.987 17.2939,24.793L21.001,28.5L24.708,24.793C23.686,23.987 22.401,23.5 21.001,23.5ZM21.001,18.5C18.222,18.5 15.688,19.543 13.749,21.248L15.8701,23.3691C17.2611,22.2041 19.05,21.5 21.001,21.5C22.952,21.5 24.7418,22.2031 26.1318,23.3691L28.251,21.25C26.313,19.544 23.78,18.5 21.001,18.5ZM21.001,13.5C16.859,13.5 13.1086,15.1786 10.3936,17.8926L12.3369,19.8359C14.6399,17.7699 17.671,16.5 21.001,16.5C24.331,16.5 27.363,17.7689 29.665,19.8359L31.6064,17.8945C28.8924,15.1795 25.143,13.5 21.001,13.5Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection_inactive.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection_inactive.xml new file mode 100644 index 000000000..42e277ea0 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_connection_inactive.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="21dp" + android:height="21dp" + android:viewportWidth="21" + android:viewportHeight="21"> + <path + android:fillColor="#C00F2D" + android:fillType="nonZero" + android:pathData="M2.3145,1L0.9004,2.4141L3.8262,5.3398C2.4087,6.0602 1.1139,6.9866 0,8.0996L1.9434,10.043C3.1338,8.9748 4.5264,8.1366 6.0469,7.5605L7.623,9.1367C6.0257,9.5901 4.5707,10.3863 3.3555,11.4551L5.4766,13.5762C6.7722,12.4911 8.4155,11.8135 10.2109,11.7246L12.5137,14.0273C11.9142,13.8243 11.275,13.707 10.6074,13.707C9.2074,13.707 7.9224,14.194 6.9004,15L10.6074,18.707L13.9004,15.4141L18.9004,20.4141L20.3145,19L2.3145,1ZM10.6074,3.707C9.7544,3.707 8.9244,3.7946 8.1094,3.9316L10.8965,6.7207C14.1115,6.7927 17.0365,8.037 19.2715,10.043L21.2129,8.1016C18.4989,5.3866 14.7494,3.707 10.6074,3.707ZM13.209,9.0313L16.7461,12.5684L17.8574,11.457C16.5454,10.302 14.958,9.4602 13.209,9.0313Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_tracing_off.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_inactive.xml similarity index 100% rename from Corona-Warn-App/src/main/res/drawable/ic_tracing_off.xml rename to Corona-Warn-App/src/main/res/drawable/ic_settings_tracing_inactive.xml diff --git a/Corona-Warn-App/src/main/res/layout/fragment_main.xml b/Corona-Warn-App/src/main/res/layout/fragment_main.xml index 9c1cc09a7..d72e326a7 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main.xml @@ -94,7 +94,7 @@ style="@style/textLargeEmphasized" android:layout_width="0dp" android:layout_height="wrap_content" - android:text="@{FormatterSettingsHelper.formatTracingText(tracingViewModel.isTracingEnabled())}" + android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" @@ -105,8 +105,8 @@ android:layout_width="@dimen/icon_size_main_card" android:layout_height="@dimen/icon_size_main_card" android:importantForAccessibility="no" - android:src="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled())}" - android:tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled())}" + android:src="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + android:tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml index 6449baa93..b0ee8c29c 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/settings_tracing_body_description}" - app:icon="@{@drawable/ic_tracing_on}" + app:icon="@{@drawable/ic_settings_tracing_active}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/settings_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml index cd92f01bf..0f458929c 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml @@ -53,8 +53,8 @@ app:layout_constraintTop_toBottomOf="@+id/settings_details_header_notifications" app:showDivider="@{true}" app:status="@{settingsViewModel.isNotificationsRiskEnabled()}" - app:subtitle="@{@string/settings_notifications_subtitle_update_risk}" - app:tracingViewModel="@{tracingViewModel}" /> + app:statusText="@{FormatterSettingsHelper.formatStatus(settingsViewModel.isNotificationsRiskEnabled())}" + app:subtitle="@{@string/settings_notifications_subtitle_update_risk}" /> <include android:id="@+id/settings_switch_row_notifications_test" @@ -67,8 +67,8 @@ app:layout_constraintTop_toBottomOf="@+id/settings_switch_row_notifications_risk" app:showDivider="@{true}" app:status="@{settingsViewModel.isNotificationsTestEnabled()}" - app:subtitle="@{@string/settings_notifications_subtitle_update_test}" - app:tracingViewModel="@{tracingViewModel}" /> + app:statusText="@{FormatterSettingsHelper.formatStatus(settingsViewModel.isNotificationsRiskEnabled())}" + app:subtitle="@{@string/settings_notifications_subtitle_update_test}" /> <include android:id="@+id/settings_navigation_row_system" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml index c116d5d3e..327770e55 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml @@ -30,43 +30,104 @@ android:layout_height="wrap_content"> <include - android:id="@+id/settings_details_header_tracing" + android:id="@+id/settings_tracing_header" layout="@layout/include_settings_details_header" - android:layout_width="0dp" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" app:headline="@{@string/settings_tracing_headline}" app:icon="@{@drawable/ic_close}" - app:illustration="@{FormatterSettingsHelper.formatTracingImage(tracingViewModel.isTracingEnabled())}" + app:illustration="@{FormatterSettingsHelper.formatTracingStatusImage(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:title="@{@string/settings_tracing_title}" /> <include - android:id="@+id/settings_switch_row_tracing" + android:id="@+id/settings_tracing_switch_row" layout="@layout/include_settings_switch_row" - android:layout_width="0dp" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - app:body="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled())}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/settings_details_header_tracing" + app:enabled="@{FormatterSettingsHelper.formatTracingSwitchEnabled(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:showDivider="@{true}" - app:status="@{tracingViewModel.isTracingEnabled()}" - app:subtitle="@{@string/settings_tracing_title}" - app:tracingViewModel="@{tracingViewModel}" /> + app:layout_constraintTop_toBottomOf="@+id/settings_tracing_header" + app:status="@{FormatterSettingsHelper.formatTracingSwitch(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + app:statusText="@{FormatterSettingsHelper.formatTracingStatusText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + app:subtitle="@{@string/settings_tracing_title}" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_tracing_status" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_small" + app:layout_constraintEnd_toEndOf="@id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/settings_tracing_switch_row"> + + <include + android:id="@+id/settings_tracing_status_bluetooth" + layout="@layout/include_tracing_status_card" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityBluetooth(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + app:body="@{@string/settings_tracing_status_bluetooth_body}" + app:buttonText="@{@string/settings_tracing_status_bluetooth_button}" + app:headline="@{@string/settings_tracing_status_bluetooth_headline}" + app:icon="@{@drawable/ic_settings_tracing_bluetooth}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <include + android:id="@+id/settings_tracing_status_connection" + layout="@layout/include_tracing_status_card" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:visibility="@{FormatterSettingsHelper.formatTracingStatusConnection(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + app:body="@{@string/settings_tracing_status_connection_body}" + app:buttonText="@{@string/settings_tracing_status_connection_button}" + app:headline="@{@string/settings_tracing_status_connection_headline}" + app:icon="@{@drawable/ic_settings_tracing_connection}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_tracing_status_tracing" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityTracing(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/settings_tracing_status_tracing_body" + style="@style/textMultiline" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_small" + android:text="@{FormatterSettingsHelper.formatTracingStatusBody(tracingViewModel.isTracingEnabled(), tracingViewModel.daysSinceLastExposure)}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + </androidx.constraintlayout.widget.ConstraintLayout> <TextView android:id="@+id/settings_tracing_body" style="@style/textMultiline" - android:layout_width="0dp" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/settings_tracing_body_text" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@id/settings_switch_row_tracing" /> + app:layout_constraintTop_toBottomOf="@id/settings_tracing_status" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" diff --git a/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml b/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml index b0ac35e19..f332d875c 100644 --- a/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml @@ -10,18 +10,22 @@ <import type="android.view.View" /> - <variable - name="tracingViewModel" - type="de.rki.coronawarnapp.ui.viewmodel.TracingViewModel" /> - <variable name="subtitle" type="String" /> + <variable + name="enabled" + type="Boolean" /> + <variable name="status" type="Boolean" /> + <variable + name="statusText" + type="String" /> + <variable name="body" type="String" /> @@ -70,7 +74,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_mega_tiny" - android:text="@{FormatterSettingsHelper.formatStatus(status)}" + android:text="@{statusText}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -83,6 +87,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@{status}" + android:enabled="@{enabled}" android:theme="@style/switchBase" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml index 99dc51e19..57ca1bf25 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml @@ -13,8 +13,8 @@ style="@style/textTitle" android:layout_width="@dimen/submission_status_card_text_width" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_status_card_title_unregistered" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml new file mode 100644 index 000000000..7edd210a2 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml @@ -0,0 +1,96 @@ +<?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" /> + + <import type="android.view.View" /> + + <variable + name="tracingViewModel" + type="de.rki.coronawarnapp.ui.viewmodel.TracingViewModel" /> + + <variable + name="icon" + type="android.graphics.drawable.Drawable" /> + + <variable + name="headline" + type="String" /> + + <variable + name="body" + type="String" /> + + <variable + name="buttonText" + type="String" /> + + + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/tracing_status_card" + style="@style/cardTracing" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/tracing_status_card_header" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/tracing_status_card_header_headline" + style="@style/textLargeEmphasized" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + android:text="@{headline}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/tracing_status_card_header_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/tracing_status_card_header_icon" + style="@style/iconTracingStatus" + android:layout_width="@dimen/icon_size_main_card_end" + android:layout_height="@dimen/icon_size_main_card_end" + android:importantForAccessibility="no" + android:src="@{icon}" + android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/tracing_status_card_header_headline" + app:layout_constraintTop_toTopOf="parent" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <TextView + android:id="@+id/tracing_status_card_body" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_tiny" + android:text="@{body}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tracing_status_card_header" /> + + <Button + android:id="@+id/tracing_status_card_button" + style="@style/buttonPrimary" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:text="@{buttonText}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tracing_status_card_body" /> + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index a20246863..9075db9a4 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -275,6 +275,19 @@ <string name="settings_tracing_body_active_description">Risiko-Ermittlung ist aktiv. Eine verlässliche Risikoprüfung kann nur mit dauerhaft aktivierter Risiko-Ermittlung durchgeführt werden.</string> <string name="settings_tracing_body_inactive_description">Risiko-Ermittlung ist gestoppt. Eine verlässliche Risikoprüfung kann nur mit dauerhaft aktivierter Risiko-Ermittlung durchgeführt werden.</string> <string name="settings_tracing_body_text">@string/lorem_ipsum</string> + <string name="settings_tracing_status_active">Aktiv</string> + <string name="settings_tracing_status_inactive">Gestoppt</string> + <string name="settings_tracing_status_restricted">Eingeschränkt</string> + <string name="settings_tracing_body_connection_inactive">Keine Internetverbindung</string> + <string name="settings_tracing_body_bluetooth_inactive">Bluetooth deaktiviert</string> + <string name="settings_tracing_status_bluetooth_headline">Bluetooth aktivieren</string> + <string name="settings_tracing_status_bluetooth_body">Die Risiko-Ermittlung benötigt aktiviertes Bluetooth um Begegnungen zu protokollieren. Bitte aktivieren Sie Bluetooth in Ihren Einstellungen.</string> + <string name="settings_tracing_status_bluetooth_button">Einstellungen öffnen</string> + <string name="settings_tracing_status_connection_headline">Internetverbindung aktivieren</string> + <string name="settings_tracing_status_connection_body">Die Risiko-Ermittlung benötigt eine Internetverbindung um Risikobegegnungen berechnen zu können. Bitte aktivieren Sie WLAN oder Mobile Daten in Ihren Einstellungen.</string> + <string name="settings_tracing_status_connection_button">Einstellungen öffnen</string> + <string name="settings_tracing_status_body_active">Risiko-Ermittlung ist seit %1$s Tagen aktiv.</string> + <string name="settings_tracing_status_body_inactive">Die Risiko-Ermittlung umfasst %1$s von 14 Tagen.</string> <!-- Notifications --> <string name="settings_notifications_title">Mitteilungen</string> <string name="settings_notifications_headline_active">Möchten Sie Mitteilungen zu Ihrem Covid-19-Risikostatus aktivieren?</string> @@ -424,7 +437,6 @@ <string name="submission_done_isolate">Bitte isolieren Sie sich von anderen Personen.</string> <string name="submission_done_button_done">Fertig</string> - <!-- #################################### Just for Development ###################################### --> diff --git a/Corona-Warn-App/src/main/res/values/styles.xml b/Corona-Warn-App/src/main/res/values/styles.xml index 90a64872f..101aaced1 100644 --- a/Corona-Warn-App/src/main/res/values/styles.xml +++ b/Corona-Warn-App/src/main/res/values/styles.xml @@ -111,6 +111,12 @@ <item name="android:backgroundTint">@color/card_light</item> <item name="android:elevation">@dimen/elevation_strong</item> </style> + + <style name="cardTracing"> + <item name="android:padding">@dimen/card_padding</item> + <item name="android:background">@drawable/card</item> + <item name="android:backgroundTint">@color/colorGreyLight</item> + </style> <!-- todo unify padding with main card - tbr --> <style name="cardSubmission"> <item name="android:background">@drawable/card</item> @@ -189,6 +195,10 @@ <item name="android:tint">@color/stableIconColor</item> </style> + <style name="iconTracingStatus"> + <item name="android:tint">@color/colorPrimary</item> + </style> + <!-- #################################### Progress Bar ###################################### --> -- GitLab