From 93d5ba91d95d8213740bed073015e3ef4af1b37d Mon Sep 17 00:00:00 2001
From: Oliver Zimmerman <oezimmerman@gmail.com>
Date: Tue, 14 Jul 2020 15:55:14 +0100
Subject: [PATCH] Added home screen implementation for location state
 (EXPOSUREAPP-1756) (#869)

* Implemented state check for location

* formatting

* removed duplicate manifest item

* Update ConnectivityHelper.kt

* Update ConnectivityHelper.kt

* Added location type to TracingStatusHelper

Added location type to TracingStatusHelper as well as relevant String values

* added location paramater to TracingStatusHelper utilizing methods

added location paramater to TracingStatusHelper utilizing methods.

Implementation including location not yet included.

* Finalized TracingStatusHelper to include the location value

Finalized TracingStatusHelper to include the location value to be returned to Formatters in FormatterSettingsHelper

* formatting

* Update FormatterSettingsHelper.kt

* Update FormatterSettingsHelper.kt

* Added home screen implementation for location state

- Added logic to formatters adjust home screen tracing state based on location setting.
- Adjusted existing state tests to include location boolean value and results.
- Added location inactive icon.

* Update FormatterSettingsHelper.kt

* test changes to match formatter/helper changes

Co-authored-by: Philipp Woessner <64482866+pwoessner@users.noreply.github.com>
---
 .../res/layout/fragment_main.xml              |   6 +-
 .../ui/settings/SettingsTracingFragment.kt    |   6 +-
 .../util/formatter/FormatterSettingsHelper.kt |  89 +++--
 .../util/formatter/TracingStatusHelper.kt     |  19 +-
 .../ic_settings_location_inactive_small.xml   |  12 +
 .../src/main/res/layout/fragment_main.xml     |   8 +-
 .../src/main/res/layout/fragment_settings.xml |   6 +-
 .../res/layout/fragment_settings_tracing.xml  |  16 +-
 .../src/main/res/values-de/strings.xml        |   2 +
 .../src/main/res/values-en/strings.xml        |   2 +
 .../src/main/res/values-tr/strings.xml        |   2 +
 .../src/main/res/values/strings.xml           |   2 +
 .../formatter/FormatterSettingsHelperTest.kt  | 324 +++++++++++++-----
 .../util/formatter/TracingStatusHelperTest.kt |  30 +-
 14 files changed, 371 insertions(+), 153 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_settings_location_inactive_small.xml

diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml
index b6e0b96a7..c9ea631a2 100644
--- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml
+++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml
@@ -97,7 +97,7 @@
                     android:layout_width="@dimen/match_constraint"
                     android:layout_height="wrap_content"
                     android:focusable="false"
-                    android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
@@ -107,8 +107,8 @@
                     android:layout_width="@dimen/icon_size_main_card"
                     android:layout_height="@dimen/icon_size_main_card"
                     android:importantForAccessibility="no"
-                    app:animation="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    app:animation_tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:animation="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    app:animation_tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintEnd_toEndOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
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 41410d237..c14ac3879 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
@@ -16,6 +16,7 @@ import de.rki.coronawarnapp.exception.reporting.report
 import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
 import de.rki.coronawarnapp.nearby.InternalExposureNotificationPermissionHelper
 import de.rki.coronawarnapp.storage.LocalData
+import de.rki.coronawarnapp.storage.SettingsRepository.isLocationEnabled
 import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel
 import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
@@ -114,11 +115,14 @@ class SettingsTracingFragment : Fragment(),
                 settingsViewModel.isBluetoothEnabled.value ?: throw IllegalArgumentException()
             val isConnectionEnabled =
                 settingsViewModel.isConnectionEnabled.value ?: throw IllegalArgumentException()
+            val isLocationEnabled =
+                settingsViewModel.isLocationEnabled.value ?: throw IllegalArgumentException()
             // check if the row is clickable, this adds the switch behaviour
             val isEnabled = formatTracingSwitchEnabled(
                 isTracingEnabled,
                 isBluetoothEnabled,
-                isConnectionEnabled
+                isConnectionEnabled,
+                isLocationEnabled
             )
             if (isEnabled) startStopTracing()
         }
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 a55eb0dc6..17a7a340c 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
@@ -72,16 +72,17 @@ fun formatNotificationIllustrationText(notifications: Boolean): String =
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return String
  */
-fun formatTracingStatusText(tracing: Boolean, bluetooth: Boolean, connection: Boolean): String {
+fun formatTracingStatusText(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): String {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         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 ->
+        TracingStatusHelper.TRACING_INACTIVE, TracingStatusHelper.LOCATION ->
             appContext.getString(R.string.settings_tracing_status_inactive)
         else -> ""
     }
@@ -102,15 +103,18 @@ fun formatSwitchContentDescription(subtitle: String, status: String): String = "
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return String
  */
-fun formatTracingDescription(tracing: Boolean, bluetooth: Boolean, connection: Boolean): String {
+fun formatTracingDescription(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): String {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.CONNECTION ->
             appContext.getString(R.string.settings_tracing_body_connection_inactive)
         TracingStatusHelper.BLUETOOTH ->
             appContext.getString(R.string.settings_tracing_body_bluetooth_inactive)
+        TracingStatusHelper.LOCATION ->
+            appContext.getString(R.string.settings_tracing_body_inactive_location)
         TracingStatusHelper.TRACING_ACTIVE ->
             appContext.getString(R.string.settings_tracing_body_active)
         TracingStatusHelper.TRACING_INACTIVE ->
@@ -126,21 +130,26 @@ fun formatTracingDescription(tracing: Boolean, bluetooth: Boolean, connection: B
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return String
  */
 fun formatTracingContentDescription(
     tracing: Boolean,
     bluetooth: Boolean,
-    connection: Boolean
+    connection: Boolean,
+    location: Boolean
 ): String {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.CONNECTION ->
             appContext.getString(R.string.settings_tracing_body_connection_inactive) +
                     " " + appContext.getString(R.string.accessibility_button)
         TracingStatusHelper.BLUETOOTH ->
             appContext.getString(R.string.settings_tracing_body_bluetooth_inactive) +
                     " " + appContext.getString(R.string.accessibility_button)
+        TracingStatusHelper.LOCATION ->
+            appContext.getString(R.string.settings_tracing_body_inactive_location) +
+                    " " + appContext.getString(R.string.accessibility_button)
         TracingStatusHelper.TRACING_ACTIVE ->
             appContext.getString(R.string.settings_tracing_body_active) +
                     " " + appContext.getString(R.string.accessibility_button)
@@ -171,15 +180,17 @@ fun formatTracingStatusBody(activeTracingDaysInRetentionPeriod: Long): String {
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return String
  */
 fun formatTracingIllustrationText(
     tracing: Boolean,
     bluetooth: Boolean,
-    connection: Boolean
+    connection: Boolean,
+    location: Boolean
 ): String {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.CONNECTION ->
             appContext.getString(R.string.settings_tracing_connection_illustration_description_inactive)
         TracingStatusHelper.BLUETOOTH ->
@@ -259,16 +270,17 @@ fun formatNotificationImage(notifications: Boolean): Drawable? =
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return
  */
-fun formatSettingsTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int {
+fun formatSettingsTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Int {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.CONNECTION, TracingStatusHelper.BLUETOOTH ->
             appContext.getColor(R.color.colorTextPrimary3)
         TracingStatusHelper.TRACING_ACTIVE ->
             appContext.getColor(R.color.colorAccentTintIcon)
-        TracingStatusHelper.TRACING_INACTIVE ->
+        TracingStatusHelper.TRACING_INACTIVE, TracingStatusHelper.LOCATION ->
             appContext.getColor(R.color.colorTextSemanticRed)
         else -> appContext.getColor(R.color.colorTextSemanticRed)
     }
@@ -280,19 +292,23 @@ fun formatSettingsTracingIconColor(tracing: Boolean, bluetooth: Boolean, connect
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return
  */
 fun formatSettingsTracingIcon(
     tracing: Boolean,
     bluetooth: Boolean,
-    connection: Boolean
+    connection: Boolean,
+    location: Boolean
 ): Drawable? {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.CONNECTION,
         TracingStatusHelper.BLUETOOTH,
         TracingStatusHelper.TRACING_ACTIVE ->
             appContext.getDrawable(R.drawable.ic_settings_tracing_active_small)
+        TracingStatusHelper.LOCATION ->
+            appContext.getDrawable(R.drawable.ic_settings_location_inactive_small)
         TracingStatusHelper.TRACING_INACTIVE ->
             appContext.getDrawable(R.drawable.ic_settings_tracing_inactive_small)
         else -> appContext.getDrawable(R.drawable.ic_settings_tracing_inactive_small)
@@ -328,10 +344,11 @@ fun formatSettingsBackgroundPriorityIconColor(
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Boolean
  */
-fun formatTracingSwitch(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Boolean {
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+fun formatTracingSwitch(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Boolean {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.TRACING_ACTIVE -> true
         else -> false
     }
@@ -343,10 +360,11 @@ fun formatTracingSwitch(tracing: Boolean, bluetooth: Boolean, connection: Boolea
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Boolean
  */
-fun formatTracingSwitchEnabled(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Boolean {
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+fun formatTracingSwitchEnabled(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Boolean {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.TRACING_ACTIVE, TracingStatusHelper.TRACING_INACTIVE -> true
         else -> false
     }
@@ -358,12 +376,14 @@ fun formatTracingSwitchEnabled(tracing: Boolean, bluetooth: Boolean, connection:
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Drawable
  */
-fun formatTracingIcon(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int? {
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+fun formatTracingIcon(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Int? {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.BLUETOOTH -> R.drawable.ic_settings_tracing_bluetooth_inactive
         TracingStatusHelper.CONNECTION -> R.drawable.ic_settings_tracing_connection_inactive
+        TracingStatusHelper.LOCATION -> R.drawable.ic_settings_location_inactive_small
         TracingStatusHelper.TRACING_ACTIVE -> R.raw.ic_settings_tracing_animated
         else -> R.drawable.ic_settings_tracing_inactive
     }
@@ -375,11 +395,12 @@ fun formatTracingIcon(tracing: Boolean, bluetooth: Boolean, connection: Boolean)
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Int
  */
-fun formatTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int {
+fun formatTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Int {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.TRACING_ACTIVE ->
             appContext.getColor(R.color.colorAccentTintIcon)
         else ->
@@ -393,11 +414,12 @@ fun formatTracingIconColor(tracing: Boolean, bluetooth: Boolean, connection: Boo
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Drawable
  */
-fun formatTracingStatusImage(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Drawable? {
+fun formatTracingStatusImage(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Drawable? {
     val appContext = CoronaWarnApplication.getAppContext()
-    return when (tracingStatusHelper(tracing, bluetooth, connection)) {
+    return when (tracingStatusHelper(tracing, bluetooth, connection, location)) {
         TracingStatusHelper.BLUETOOTH ->
             appContext.getDrawable(R.drawable.ic_settings_illustration_bluetooth_off)
         TracingStatusHelper.CONNECTION ->
@@ -415,14 +437,16 @@ fun formatTracingStatusImage(tracing: Boolean, bluetooth: Boolean, connection: B
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Int
  */
-fun formatTracingStatusConnection(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int =
+fun formatTracingStatusConnection(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Int =
     formatVisibility(
         tracingStatusHelper(
             tracing,
             bluetooth,
-            connection
+            connection,
+            location
         ) == TracingStatusHelper.CONNECTION
     )
 
@@ -432,18 +456,21 @@ fun formatTracingStatusConnection(tracing: Boolean, bluetooth: Boolean, connecti
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Int
  */
 fun formatTracingStatusVisibilityBluetooth(
     tracing: Boolean,
     bluetooth: Boolean,
-    connection: Boolean
+    connection: Boolean,
+    location: Boolean
 ): Int =
     formatVisibility(
         tracingStatusHelper(
             tracing,
             bluetooth,
-            connection
+            connection,
+            location
         ) == TracingStatusHelper.BLUETOOTH
     )
 
@@ -453,14 +480,16 @@ fun formatTracingStatusVisibilityBluetooth(
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Int
  */
 fun formatTracingStatusVisibilityTracing(
     tracing: Boolean,
     bluetooth: Boolean,
-    connection: Boolean
+    connection: Boolean,
+    location: Boolean
 ): Int {
-    val tracingStatus = tracingStatusHelper(tracing, bluetooth, connection)
+    val tracingStatus = tracingStatusHelper(tracing, bluetooth, connection, location)
     return formatVisibility(
         tracingStatus == TracingStatusHelper.TRACING_ACTIVE ||
                 tracingStatus == TracingStatusHelper.TRACING_INACTIVE
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
index f7328e1aa..419fecc8d 100644
--- 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
@@ -9,13 +9,15 @@ object TracingStatusHelper {
     const val TRACING_INACTIVE = 1
     const val BLUETOOTH = 2
     const val CONNECTION = 3
+    const val LOCATION = 4
 }
 
 /**
  * The following table explains the different stati which can appear in the ui.
- * This follows this prioritization: Tracing, Bluetooth, Connection
+ * This follows this prioritization: Tracing, Bluetooth, Connection, Location
  * 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.
+ * but independently from the Connection status. And in every other case Tracing will be shown
+ *  except when location is disabled in which case a location related warning will always be shown as it is required for bluetooth tracing.
  *
  * | Tracing | Bluetooth | Connection | Result     |
  * |---------|-----------|------------|------------|
@@ -29,16 +31,25 @@ object TracingStatusHelper {
  * | ON      | ON        | OFF        | CONNECTION |
  * *circle has to be disabled via another formatter
  *
+ * NB --- If location is disabled, the status will always show a location related warning, regardless of the other connectivity states.
+ *
  * @param tracing
  * @param bluetooth
  * @param connection
+ * @param location
  * @return Int
  */
-fun tracingStatusHelper(tracing: Boolean, bluetooth: Boolean, connection: Boolean): Int {
+fun tracingStatusHelper(tracing: Boolean, bluetooth: Boolean, connection: Boolean, location: Boolean): Int {
     return if (tracing && bluetooth && !connection) {
         TracingStatusHelper.CONNECTION
-    } else if (tracing && !bluetooth) {
+    } else if (tracing && location && !connection) {
+        TracingStatusHelper.CONNECTION
+    } else if (tracing && location && !bluetooth) {
         TracingStatusHelper.BLUETOOTH
+    } else if (tracing && !location) {
+        TracingStatusHelper.LOCATION
+    } else if (!location) {
+        TracingStatusHelper.LOCATION
     } else if (tracing) {
         TracingStatusHelper.TRACING_ACTIVE
     } else {
diff --git a/Corona-Warn-App/src/main/res/drawable/ic_settings_location_inactive_small.xml b/Corona-Warn-App/src/main/res/drawable/ic_settings_location_inactive_small.xml
new file mode 100644
index 000000000..83082663f
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/drawable/ic_settings_location_inactive_small.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="41dp"
+    android:height="40dp"
+    android:viewportWidth="41"
+    android:viewportHeight="40">
+  <path
+      android:pathData="M20.5,14.5C21.88,14.5 23,15.62 23,17C23,17.74 22.67,18.39 22.17,18.85L25.8,22.48C26.78,20.62 27.5,18.68 27.5,17C27.5,13.13 24.37,10 20.5,10C18.52,10 16.74,10.83 15.46,12.15L18.65,15.34C19.11,14.82 19.76,14.5 20.5,14.5ZM24.87,24.1L20.24,19.47L20.13,19.36L11.77,11L10.5,12.27L13.68,15.45C13.57,15.95 13.5,16.47 13.5,17C13.5,22.25 20.5,30 20.5,30C20.5,30 22.17,28.15 23.88,25.65L27.23,29L28.5,27.73L24.87,24.1Z"
+      android:strokeWidth="1"
+      android:fillColor="#C00F2D"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
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 db25a3b62..35dc3600f 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_main.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_main.xml
@@ -102,8 +102,8 @@
                     android:layout_width="@dimen/match_constraint"
                     android:layout_height="wrap_content"
                     android:focusable="false"
-                    android:contentDescription="@{FormatterSettingsHelper.formatTracingContentDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    android:contentDescription="@{FormatterSettingsHelper.formatTracingContentDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
@@ -113,8 +113,8 @@
                     android:layout_width="@dimen/icon_size_main_card"
                     android:layout_height="@dimen/icon_size_main_card"
                     android:importantForAccessibility="no"
-                    app:animation="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    app:animation_tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:animation="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    app:animation_tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     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 3051209a2..4df42821d 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml
@@ -54,13 +54,13 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/spacing_normal"
                     app:body="@{@string/settings_tracing_body_description}"
-                    app:color="@{FormatterSettingsHelper.formatSettingsTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    app:icon="@{FormatterSettingsHelper.formatSettingsTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:color="@{FormatterSettingsHelper.formatSettingsTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    app:icon="@{FormatterSettingsHelper.formatSettingsTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintEnd_toEndOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent"
                     app:showDivider="@{true}"
-                    app:statusText="@{FormatterSettingsHelper.formatTracingStatusText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:statusText="@{FormatterSettingsHelper.formatTracingStatusText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:subtitle="@{@string/settings_tracing_title}"
                     app:tracingViewModel="@{tracingViewModel}" />
 
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 a177b0e9e..151d9c42b 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
@@ -55,8 +55,8 @@
                     android:layout_width="0dp"
                     android:layout_height="wrap_content"
                     app:headline="@{@string/settings_tracing_headline}"
-                    app:illustration="@{FormatterSettingsHelper.formatTracingStatusImage(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    app:illustrationDescription="@{FormatterSettingsHelper.formatTracingIllustrationText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:illustration="@{FormatterSettingsHelper.formatTracingStatusImage(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    app:illustrationDescription="@{FormatterSettingsHelper.formatTracingIllustrationText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintEnd_toEndOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
@@ -67,13 +67,13 @@
                     android:layout_width="@dimen/match_constraint"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/spacing_normal"
-                    app:enabled="@{FormatterSettingsHelper.formatTracingSwitchEnabled(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:enabled="@{FormatterSettingsHelper.formatTracingSwitchEnabled(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:layout_constraintEnd_toEndOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toBottomOf="@+id/settings_tracing_header_details"
                     app:showDivider="@{true}"
-                    app:status="@{FormatterSettingsHelper.formatTracingSwitch(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
-                    app:statusText="@{FormatterSettingsHelper.formatTracingStatusText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                    app:status="@{FormatterSettingsHelper.formatTracingSwitch(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
+                    app:statusText="@{FormatterSettingsHelper.formatTracingStatusText(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                     app:subtitle="@{@string/settings_tracing_title}" />
 
                 <androidx.constraintlayout.widget.ConstraintLayout
@@ -90,7 +90,7 @@
                         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())}"
+                        android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityBluetooth(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                         app:body="@{@string/settings_tracing_status_bluetooth_body}"
                         app:buttonText="@{@string/settings_tracing_status_bluetooth_button}"
                         app:headline="@{@string/settings_tracing_status_bluetooth_headline}"
@@ -104,7 +104,7 @@
                         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())}"
+                        android:visibility="@{FormatterSettingsHelper.formatTracingStatusConnection(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                         app:body="@{@string/settings_tracing_status_connection_body}"
                         app:buttonText="@{@string/settings_tracing_status_connection_button}"
                         app:headline="@{@string/settings_tracing_status_connection_headline}"
@@ -118,7 +118,7 @@
                         android:layout_width="@dimen/match_constraint"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="@dimen/spacing_tiny"
-                        android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityTracing(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}"
+                        android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityTracing(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled(), settingsViewModel.isLocationEnabled())}"
                         android:focusable="true"
                         app:layout_constraintEnd_toStartOf="@+id/guideline_end"
                         app:layout_constraintStart_toEndOf="@+id/guideline_start"
diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml
index 3c1105176..f66dd130a 100644
--- a/Corona-Warn-App/src/main/res/values-de/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/strings.xml
@@ -439,6 +439,8 @@
     <string name="settings_tracing_body_active">"Risiko-Ermittlung aktiv"</string>
     <!-- XTXT: settings(tracing) - shows status under header in home, inactive -->
     <string name="settings_tracing_body_inactive">"Risiko-Ermittlung gestoppt"</string>
+    <!-- XTXT: settings(tracing) - shows status under header in home, inactive location -->
+    <string name="settings_tracing_body_inactive_location">"Ortungsdienste deaktiviert"</string>
     <!-- YTXT: settings(tracing) - explains tracings -->
     <string name="settings_tracing_body_text">"Um zu erkennen, ob für Sie ein Infektionsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren. Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich."</string>
     <!-- XTXT: settings(tracing) - status next to switch under title -->
diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml
index e8caff2c8..6ac5e473c 100644
--- a/Corona-Warn-App/src/main/res/values-en/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-en/strings.xml
@@ -431,6 +431,8 @@
     <string name="settings_tracing_body_active">"Exposure Logging Active"</string>
     <!-- XTXT: settings(tracing) - shows status under header in home, inactive -->
     <string name="settings_tracing_body_inactive">"Exposure logging stopped"</string>
+    <!-- XTXT: settings(tracing) - shows status under header in home, inactive location -->
+    <string name="settings_tracing_body_inactive_location">"Location services disabled"</string>
     <!-- YTXT: settings(tracing) - explains tracings -->
     <string name="settings_tracing_body_text">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. This feature can be deactivated at any time. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity (calculated using signal strength) to other people. Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string>
     <!-- XTXT: settings(tracing) - status next to switch under title -->
diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml
index 34934ab8f..e206399a8 100644
--- a/Corona-Warn-App/src/main/res/values-tr/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml
@@ -429,6 +429,8 @@
     <string name="settings_tracing_status_active">"Etkin"</string>
     <!-- XTXT: settings(tracing) - status next to switch under title -->
     <string name="settings_tracing_status_inactive">"Durduruldu"</string>
+    <!-- XTXT: settings(tracing) - shows status under header in home, inactive location -->
+    <string name="settings_tracing_body_inactive_location">"Konum hizmetleri devre dışı"</string>
     <!-- XTXT: settings(tracing) - status next to switch under title -->
     <string name="settings_tracing_status_restricted">"Sınırlı"</string>
     <!-- XTXT: settings(tracing) - shows status under header in home, no internet -->
diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml
index 8a5cd8cf4..243a484df 100644
--- a/Corona-Warn-App/src/main/res/values/strings.xml
+++ b/Corona-Warn-App/src/main/res/values/strings.xml
@@ -427,6 +427,8 @@
     <string name="settings_tracing_body_active">"Exposure logging active"</string>
     <!-- XTXT: settings(tracing) - shows status under header in home, inactive -->
     <string name="settings_tracing_body_inactive">"Exposure logging stopped"</string>
+    <!-- XTXT: settings(tracing) - shows status under header in home, inactive location -->
+    <string name="settings_tracing_body_inactive_location">"Location services disabled"</string>
     <!-- YTXT: settings(tracing) - explains tracings -->
     <string name="settings_tracing_body_text">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. This feature can be deactivated at any time. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity (calculated using signal strength) to other people. Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string>
     <!-- XTXT: settings(tracing) - status next to switch under title -->
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelperTest.kt
index cc70f7911..386d94615 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelperTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelperTest.kt
@@ -72,6 +72,7 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         iValue: Int
     ) {
         every { context.getString(R.string.settings_tracing_status_restricted) } returns R.string.settings_tracing_status_restricted.toString()
@@ -81,7 +82,8 @@ class FormatterSettingsHelperTest {
         val result = formatTracingStatusText(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(result, `is`((context.getString(iValue))))
     }
@@ -90,17 +92,21 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         iValue: Int
     ) {
         every { context.getString(R.string.settings_tracing_body_bluetooth_inactive) } returns R.string.settings_tracing_body_bluetooth_inactive.toString()
         every { context.getString(R.string.settings_tracing_body_connection_inactive) } returns R.string.settings_tracing_body_connection_inactive.toString()
         every { context.getString(R.string.settings_tracing_body_active) } returns R.string.settings_tracing_body_active.toString()
         every { context.getString(R.string.settings_tracing_body_inactive) } returns R.string.settings_tracing_body_inactive.toString()
+        every { context.getString(R.string.settings_tracing_body_inactive_location) } returns R.string.settings_tracing_body_inactive_location.toString()
 
         val result = formatTracingDescription(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
+
         )
         assertThat(result, `is`((context.getString(iValue))))
     }
@@ -109,18 +115,21 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         sValue: String
     ) {
         every { context.getString(R.string.settings_tracing_body_bluetooth_inactive) } returns R.string.settings_tracing_body_bluetooth_inactive.toString()
         every { context.getString(R.string.settings_tracing_body_connection_inactive) } returns R.string.settings_tracing_body_connection_inactive.toString()
         every { context.getString(R.string.settings_tracing_body_active) } returns R.string.settings_tracing_body_active.toString()
         every { context.getString(R.string.settings_tracing_body_inactive) } returns R.string.settings_tracing_body_inactive.toString()
+        every { context.getString(R.string.settings_tracing_body_inactive_location) } returns R.string.settings_tracing_body_inactive_location.toString()
         every { context.getString(R.string.accessibility_button) } returns R.string.accessibility_button.toString()
 
         val result = formatTracingContentDescription(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(
             result, `is`(sValue)
@@ -166,12 +175,14 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         bValue: Boolean
     ) {
         val result = formatTracingSwitch(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(
             result, `is`(bValue)
@@ -182,12 +193,14 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         bValue: Boolean
     ) {
         val result = formatTracingSwitchEnabled(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(
             result, `is`(bValue)
@@ -197,15 +210,16 @@ class FormatterSettingsHelperTest {
     private fun formatTracingIconBase(
         bTracing: Boolean,
         bBluetooth: Boolean,
-        bConnection: Boolean
-    ) {
+        bConnection: Boolean,
+        bLocation: Boolean
+        ) {
         every { context.getDrawable(R.drawable.ic_settings_tracing_bluetooth_inactive) } returns drawable
         every { context.getDrawable(R.drawable.ic_settings_tracing_connection_inactive) } returns drawable
         every { context.getDrawable(R.drawable.ic_settings_tracing_active) } returns drawable
         every { context.getDrawable(R.drawable.ic_settings_tracing_inactive) } returns drawable
 
         val result =
-            formatTracingIcon(tracing = bTracing, bluetooth = bBluetooth, connection = bConnection)
+            formatTracingIcon(tracing = bTracing, bluetooth = bBluetooth, connection = bConnection, location = bLocation)
         assertThat(
             result, CoreMatchers.isA(Int::class.java)
         )
@@ -215,6 +229,7 @@ class FormatterSettingsHelperTest {
         bTracing: Boolean,
         bBluetooth: Boolean,
         bConnection: Boolean,
+        bLocation: Boolean,
         iColor: Int
     ) {
         every { context.getColor(R.color.colorAccentTintIcon) } returns R.color.colorAccentTintIcon
@@ -223,7 +238,8 @@ class FormatterSettingsHelperTest {
         val result = formatTracingIconColor(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(
             result, `is`(context.getColor(iColor))
@@ -233,8 +249,9 @@ class FormatterSettingsHelperTest {
     private fun formatTracingStatusImageBase(
         bTracing: Boolean,
         bBluetooth: Boolean,
-        bConnection: Boolean
-    ) {
+        bConnection: Boolean,
+        bLocation: Boolean
+        ) {
         every { context.getDrawable(R.drawable.ic_settings_illustration_bluetooth_off) } returns drawable
         every { context.getDrawable(R.drawable.ic_settings_illustration_connection_off) } returns drawable
         every { context.getDrawable(R.drawable.ic_illustration_tracing_on) } returns drawable
@@ -243,7 +260,8 @@ class FormatterSettingsHelperTest {
         val result = formatTracingStatusImage(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(
             result, `is`(CoreMatchers.equalTo(drawable))
@@ -253,12 +271,14 @@ class FormatterSettingsHelperTest {
     private fun formatTracingStatusConnectionBase(
         bTracing: Boolean,
         bBluetooth: Boolean,
-        bConnection: Boolean
-    ) {
+        bConnection: Boolean,
+        bLocation: Boolean
+        ) {
         val result = formatTracingStatusConnection(
             tracing = bTracing,
             bluetooth = bBluetooth,
-            connection = bConnection
+            connection = bConnection,
+            location = bLocation
         )
         assertThat(true, `is`(result > -1))
     }
@@ -266,13 +286,15 @@ class FormatterSettingsHelperTest {
     private fun formatTracingStatusVisibilityTracingBase(
         bTracing: Boolean,
         bBluetooth: Boolean,
-        bConnection: Boolean
-    ) {
+        bConnection: Boolean,
+        bLocation: Boolean
+        ) {
         val result =
             formatTracingStatusVisibilityTracing(
                 tracing = bTracing,
                 bluetooth = bBluetooth,
-                connection = bConnection
+                connection = bConnection,
+                location = bLocation
             )
         assertThat(true, `is`(result > -1))
     }
@@ -280,13 +302,15 @@ class FormatterSettingsHelperTest {
     private fun formatTracingStatusVisibilityBluetoothBase(
         bTracing: Boolean,
         bBluetooth: Boolean,
-        bConnection: Boolean
-    ) {
+        bConnection: Boolean,
+        bLocation: Boolean
+        ) {
         val result =
             formatTracingStatusVisibilityBluetooth(
                 tracing = bTracing,
                 bluetooth = bBluetooth,
-                connection = bConnection
+                connection = bConnection,
+                location = bLocation
             )
         assertThat(true, `is`(result > -1))
     }
@@ -382,203 +406,263 @@ class FormatterSettingsHelperTest {
 
     @Test
     fun formatTracingStatusText() {
-        // When tracing is true, bluetooth is true, connection is true
+        // When tracing is true, bluetooth is true, connection is true, location is true
         formatTracingStatusBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_active
         )
 
-        // When tracing is false, bluetooth is false, connection is false
+        // When tracing is false, bluetooth is false, connection is false, location is false
         formatTracingStatusBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
+            bLocation = false,
             iValue = R.string.settings_tracing_status_inactive
         )
 
-        // When tracing is true, bluetooth is false, connection is false
+        // When tracing is true, bluetooth is false, connection is false, location is true
         formatTracingStatusBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_restricted
         )
 
-        // When tracing is true, bluetooth is true, connection is false
+        // When tracing is true, bluetooth is true, connection is false, location is true
         formatTracingStatusBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_restricted
         )
 
-        // When tracing is false, bluetooth is true, connection is false
+        // When tracing is false, bluetooth is true, connection is false, location is false
         formatTracingStatusBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = false,
             iValue = R.string.settings_tracing_status_inactive
         )
 
-        // When tracing is false, bluetooth is true, connection is true
+        // When tracing is false, bluetooth is true, connection is true, location is true
         formatTracingStatusBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_inactive
         )
 
-        // When tracing is true, bluetooth is false, connection is true
+        // When tracing is true, bluetooth is false, connection is true, location is true
         formatTracingStatusBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_restricted
         )
 
-        // When tracing is false, bluetooth is false, connection is true
+        // When tracing is false, bluetooth is false, connection is true, location is true
         formatTracingStatusBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_status_inactive
         )
     }
 
     @Test
     fun formatTracingDescription() {
-        // When tracing is true, bluetooth is true, connection is true
+        // When tracing is true, bluetooth is true, connection is true, location is true
         formatTracingDescriptionBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_active
         )
 
-        // When tracing is false, bluetooth is false, connection is false
+        // When tracing is false, bluetooth is false, connection is false, location is false
         formatTracingDescriptionBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
-            iValue = R.string.settings_tracing_body_inactive
+            bLocation = false,
+            iValue = R.string.settings_tracing_body_inactive_location
         )
 
-        // When tracing is true, bluetooth is false, connection is false
+        // When tracing is true, bluetooth is false, connection is false, location is true
         formatTracingDescriptionBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
-            iValue = R.string.settings_tracing_body_bluetooth_inactive
+            bLocation = true,
+            iValue = R.string.settings_tracing_body_connection_inactive
         )
 
-        // When tracing is true, bluetooth is true, connection is false
+        // When tracing is true, bluetooth is true, connection is false, location is true
         formatTracingDescriptionBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_connection_inactive
         )
 
-        // When tracing is false, bluetooth is true, connection is false
+        // When tracing is false, bluetooth is true, connection is false, location is true
         formatTracingDescriptionBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_inactive
         )
 
-        // When tracing is false, bluetooth is true, connection is true
+        // When tracing is false, bluetooth is true, connection is true, location is true
         formatTracingDescriptionBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_inactive
         )
 
-        // When tracing is true, bluetooth is false, connection is true
+        // When tracing is true, bluetooth is false, connection is true, location is true
         formatTracingDescriptionBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_bluetooth_inactive
         )
 
-        // When tracing is false, bluetooth is false, connection is true
+        // When tracing is false, bluetooth is false, connection is true, location is true
         formatTracingDescriptionBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iValue = R.string.settings_tracing_body_inactive
         )
+
+        // When tracing is true, bluetooth is true, connection is true, location is false
+        formatTracingDescriptionBase(
+            bTracing = true,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
+            iValue = R.string.settings_tracing_body_inactive_location
+        )
+
+        // When tracing is false, bluetooth is true, connection is true, location is false
+        formatTracingDescriptionBase(
+            bTracing = false,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
+            iValue = R.string.settings_tracing_body_inactive_location
+        )
     }
 
     @Test
     fun formatTracingContentDescription() {
-        // When tracing is true, bluetooth is true, connection is true
+        // When tracing is true, bluetooth is true, connection is true, location is true
         formatTracingContentDescriptionBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_active.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is false, bluetooth is false, connection is false
+        // When tracing is false, bluetooth is false, connection is false, location is true
         formatTracingContentDescriptionBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is true, bluetooth is false, connection is false
+        // When tracing is true, bluetooth is false, connection is false, location is true
         formatTracingContentDescriptionBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
-            sValue = R.string.settings_tracing_body_bluetooth_inactive.toString() + " " + R.string.accessibility_button.toString()
+            bLocation = true,
+            sValue = R.string.settings_tracing_body_connection_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is true, bluetooth is true, connection is false
+        // When tracing is true, bluetooth is true, connection is false, location is true
         formatTracingContentDescriptionBase(
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_connection_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is false, bluetooth is true, connection is false
+        // When tracing is false, bluetooth is true, connection is false, location is true
         formatTracingContentDescriptionBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is false, bluetooth is true, connection is true
+        // When tracing is false, bluetooth is true, connection is true, location is true
         formatTracingContentDescriptionBase(
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is true, bluetooth is false, connection is true
+        // When tracing is true, bluetooth is false, connection is true, location is true
         formatTracingContentDescriptionBase(
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_bluetooth_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
 
-        // When tracing is false, bluetooth is false, connection is true
+        // When tracing is false, bluetooth is false, connection is true, location is true
         formatTracingContentDescriptionBase(
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             sValue = R.string.settings_tracing_body_inactive.toString() + " " + R.string.accessibility_button.toString()
         )
+
+        // When tracing is false, bluetooth is true, connection is true, location is false
+        formatTracingContentDescriptionBase(
+            bTracing = false,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
+            sValue = R.string.settings_tracing_body_inactive_location.toString() + " " + R.string.accessibility_button.toString()
+        )
+
+        // When tracing is true, bluetooth is true, connection is true, location is false
+        formatTracingContentDescriptionBase(
+            bTracing = true,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
+            sValue = R.string.settings_tracing_body_inactive_location.toString() + " " + R.string.accessibility_button.toString()
+        )
     }
 
     @Test
@@ -614,6 +698,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             bValue = true
         )
 
@@ -621,6 +706,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             bValue = false
         )
 
@@ -628,6 +714,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             bValue = false
         )
 
@@ -635,6 +722,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             bValue = false
         )
 
@@ -642,6 +730,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             bValue = false
         )
 
@@ -649,6 +738,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             bValue = false
         )
 
@@ -656,6 +746,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             bValue = false
         )
 
@@ -663,6 +754,23 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
+            bValue = false
+        )
+
+        formatTracingSwitchBase(
+            bTracing = false,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
+            bValue = false
+        )
+
+        formatTracingSwitchBase(
+            bTracing = true,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
             bValue = false
         )
     }
@@ -674,6 +782,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             bValue = true
         )
 
@@ -681,6 +790,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             bValue = true
         )
 
@@ -688,6 +798,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             bValue = true
         )
 
@@ -695,6 +806,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             bValue = true
         )
 
@@ -702,6 +814,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             bValue = true
         )
 
@@ -709,6 +822,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             bValue = false
         )
 
@@ -716,6 +830,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             bValue = false
         )
 
@@ -723,27 +838,30 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             bValue = false
         )
     }
 
     @Test
     fun formatTracingIcon() {
-        formatTracingIconBase(bTracing = true, bBluetooth = true, bConnection = true)
+        formatTracingIconBase(bTracing = true, bBluetooth = true, bConnection = true, bLocation = true)
+
+        formatTracingIconBase(bTracing = false, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingIconBase(bTracing = false, bBluetooth = false, bConnection = false)
+        formatTracingIconBase(bTracing = false, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingIconBase(bTracing = false, bBluetooth = false, bConnection = true)
+        formatTracingIconBase(bTracing = false, bBluetooth = true, bConnection = false, bLocation = true)
 
-        formatTracingIconBase(bTracing = false, bBluetooth = true, bConnection = false)
+        formatTracingIconBase(bTracing = false, bBluetooth = true, bConnection = true, bLocation = true)
 
-        formatTracingIconBase(bTracing = false, bBluetooth = true, bConnection = true)
+        formatTracingIconBase(bTracing = true, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingIconBase(bTracing = true, bBluetooth = false, bConnection = false)
+        formatTracingIconBase(bTracing = true, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingIconBase(bTracing = true, bBluetooth = false, bConnection = true)
+        formatTracingIconBase(bTracing = true, bBluetooth = true, bConnection = false, bLocation = true)
 
-        formatTracingIconBase(bTracing = true, bBluetooth = true, bConnection = false)
+        formatTracingIconBase(bTracing = true, bBluetooth = true, bConnection = true, bLocation = false)
     }
 
     @Test
@@ -753,6 +871,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iColor = R.color.colorAccentTintIcon
         )
 
@@ -760,6 +879,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -767,6 +887,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -774,6 +895,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -781,6 +903,7 @@ class FormatterSettingsHelperTest {
             bTracing = false,
             bBluetooth = true,
             bConnection = true,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -788,6 +911,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = false,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -795,6 +919,7 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = false,
             bConnection = true,
+            bLocation = true,
             iColor = R.color.colorTextSemanticRed
         )
 
@@ -802,46 +927,55 @@ class FormatterSettingsHelperTest {
             bTracing = true,
             bBluetooth = true,
             bConnection = false,
+            bLocation = true,
+            iColor = R.color.colorTextSemanticRed
+        )
+
+        formatTracingIconColorBase(
+            bTracing = true,
+            bBluetooth = true,
+            bConnection = true,
+            bLocation = false,
             iColor = R.color.colorTextSemanticRed
         )
     }
 
     @Test
     fun formatTracingStatusImage() {
-        formatTracingStatusImageBase(bTracing = true, bBluetooth = true, bConnection = true)
+        formatTracingStatusImageBase(bTracing = true, bBluetooth = true, bConnection = true, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = false, bBluetooth = false, bConnection = false)
+        formatTracingStatusImageBase(bTracing = false, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = false, bBluetooth = false, bConnection = true)
+        formatTracingStatusImageBase(bTracing = false, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = false, bBluetooth = true, bConnection = false)
+        formatTracingStatusImageBase(bTracing = false, bBluetooth = true, bConnection = false, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = false, bBluetooth = true, bConnection = true)
+        formatTracingStatusImageBase(bTracing = false, bBluetooth = true, bConnection = true, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = true, bBluetooth = false, bConnection = false)
+        formatTracingStatusImageBase(bTracing = true, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = true, bBluetooth = false, bConnection = true)
+        formatTracingStatusImageBase(bTracing = true, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingStatusImageBase(bTracing = true, bBluetooth = true, bConnection = false)
+        formatTracingStatusImageBase(bTracing = true, bBluetooth = true, bConnection = false, bLocation = true)
     }
 
     @Test
     fun formatTracingStatusConnection() {
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = true)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = true, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = false, bConnection = false)
+        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = false, bConnection = true)
+        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = true, bConnection = false)
+        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = true, bConnection = false, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = true, bConnection = true)
+        formatTracingStatusConnectionBase(bTracing = false, bBluetooth = true, bConnection = true, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = false)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = false, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = true)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = false)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = false, bLocation = true)
     }
 
     @Test
@@ -849,42 +983,48 @@ class FormatterSettingsHelperTest {
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = true,
             bBluetooth = true,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = false,
             bBluetooth = false,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = false,
             bBluetooth = false,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = false,
             bBluetooth = true,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = false,
             bBluetooth = true,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityBluetoothBase(
             bTracing = true,
             bBluetooth = false,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = true)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = false, bConnection = true, bLocation = true)
 
-        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = false)
+        formatTracingStatusConnectionBase(bTracing = true, bBluetooth = true, bConnection = false, bLocation = true)
     }
 
     @Test
@@ -892,49 +1032,57 @@ class FormatterSettingsHelperTest {
         formatTracingStatusVisibilityTracingBase(
             bTracing = true,
             bBluetooth = true,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = false,
             bBluetooth = false,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = false,
             bBluetooth = false,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = false,
             bBluetooth = true,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = false,
             bBluetooth = true,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = true,
             bBluetooth = false,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = true,
             bBluetooth = false,
-            bConnection = true
+            bConnection = true,
+            bLocation = true
         )
 
         formatTracingStatusVisibilityTracingBase(
             bTracing = true,
             bBluetooth = true,
-            bConnection = false
+            bConnection = false,
+            bLocation = true
         )
     }
 
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelperTest.kt
index 203c77231..ddebea547 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelperTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/formatter/TracingStatusHelperTest.kt
@@ -8,49 +8,55 @@ class TracingStatusHelperTest {
 
     @Test
     fun testTracingActiveAllOn() {
-        val result = tracingStatusHelper(tracing = true, bluetooth = true, connection = true)
+        val result = tracingStatusHelper(tracing = true, bluetooth = true, connection = true, location = true)
         assertThat(result, `is`((TracingStatusHelper.TRACING_ACTIVE)))
     }
 
     @Test
     fun testTracingInactiveWhenAllOff() {
-        val result = tracingStatusHelper(tracing = false, bluetooth = false, connection = false)
+        val result = tracingStatusHelper(tracing = false, bluetooth = false, connection = false, location = true)
         assertThat(result, `is`((TracingStatusHelper.TRACING_INACTIVE)))
     }
 
     @Test
     fun testTracingInactiveWhenTracingOffBluetoothOffConnectionOn() {
-        val result = tracingStatusHelper(tracing = false, bluetooth = false, connection = true)
+        val result = tracingStatusHelper(tracing = false, bluetooth = false, connection = true, location = true)
         assertThat(result, `is`((TracingStatusHelper.TRACING_INACTIVE)))
     }
 
     @Test
     fun testTracingInactiveWhenTracingOffBluetoothOnConnectionOff() {
-        val result = tracingStatusHelper(tracing = false, bluetooth = true, connection = false)
+        val result = tracingStatusHelper(tracing = false, bluetooth = true, connection = false, location = true)
         assertThat(result, `is`((TracingStatusHelper.TRACING_INACTIVE)))
     }
 
     @Test
     fun testTracingInactiveWhenTracingOffBluetoothOnConnectionOn() {
-        val result = tracingStatusHelper(tracing = false, bluetooth = true, connection = true)
+        val result = tracingStatusHelper(tracing = false, bluetooth = true, connection = true, location = true)
         assertThat(result, `is`((TracingStatusHelper.TRACING_INACTIVE)))
     }
 
     @Test
     fun testBluetoothInactiveWhenTracingOnBluetoothOffConnectionOn() {
-        val result = tracingStatusHelper(tracing = true, bluetooth = false, connection = true)
+        val result = tracingStatusHelper(tracing = true, bluetooth = false, connection = true, location = true)
         assertThat(result, `is`((TracingStatusHelper.BLUETOOTH)))
     }
 
     @Test
-    fun testBluetoothInactiveWhenTracingOnBluetoothOffConnectionOff() {
-        val result = tracingStatusHelper(tracing = true, bluetooth = false, connection = false)
-        assertThat(result, `is`((TracingStatusHelper.BLUETOOTH)))
+    fun testConnectionInactiveWhenTracingOnBluetoothOffConnectionOff() {
+        val result = tracingStatusHelper(tracing = true, bluetooth = true, connection = false, location = true)
+        assertThat(result, `is`((TracingStatusHelper.CONNECTION)))
     }
 
     @Test
-    fun testConnectionInactiveWhenTracingOnBluetoothOffConnectionOff() {
-        val result = tracingStatusHelper(tracing = true, bluetooth = true, connection = false)
-        assertThat(result, `is`((TracingStatusHelper.CONNECTION)))
+    fun testConnectionInactiveWhenTracingOffBluetoothOnConnectionOnLocationOff() {
+        val result = tracingStatusHelper(tracing = false, bluetooth = true, connection = true, location = false)
+        assertThat(result, `is`((TracingStatusHelper.LOCATION)))
+    }
+
+    @Test
+    fun testConnectionInactiveWhenTracingOnBluetoothOnConnectionOnLocationOff() {
+        val result = tracingStatusHelper(tracing = true, bluetooth = true, connection = true, location = false)
+        assertThat(result, `is`((TracingStatusHelper.LOCATION)))
     }
 }
-- 
GitLab